2010-07-25 4 views
1

인터넷에서 Nginx와 Apache를 비교하는 기사가 많이 있다는 것을 알았습니다. 그러나이 모든 비교는 PHP 코드를 실행하는 웹 서버에 대한 스트레스 테스트를 기반으로합니다. 이것은 주로 Apache가 일반적으로 PHP로 LAMP 아키텍처로 배포 되었기 때문입니다.Nginx와 비동기 프로그래밍 모델을 지원하는 언어를 결합해야합니까?

Nginx는 이벤트 기반 아키텍처로 C10K problem을 해결하기 위해 만들어졌습니다. 즉, Nginx는 N 개의 스레드/프로세스와 함께 M 개의 동시 요청을 처리해야합니다. N은 M보다 훨씬 적습니다. M 개의 동시 요청을 처리하기 위해 M 개의 스레드/프로세스가 필요한 Apache와는 큰 차이가 있습니다.

PHP 코드의 경우 프로그래밍 모델이 비동기 적이 아닙니다. 각 웹 요청은 PHP가 처리 할 수있는 하나의 스레드/프로세스를 차지합니다. 그래서 Nginx와 Apache를 PHP 코드와 비교하는 의미를 이해하지 못합니다.

Nginx의 이벤트 기반 아키텍처는 요청이 I/O 작업과 관련된 경우 특히 Apache를 능가해야합니다. 예를 들어 요청은 다른 여러 웹 서비스의 결과를 병합해야합니다. Apache + PHP의 경우 각 요청은 I/O 작업이 완료 될 때까지 기다리는 데 몇 초가 걸릴 수 있습니다. 그것은 많은 스레드/프로세스를 소비합니다. Nginx의 경우 비동기 프로그래밍을 사용하면 문제가되지 않습니다.

비동기 프로그래밍 모델을 지원하는 언어로 Nginx를 배포하는 것이 더 합리적입니까?

나는 어떤 프로그래밍 언어가 Nginx로부터 가장 큰 잠재력을 발굴 할 수 있는지 모르겠지만, 확실히 PHP가 아닙니다.

답변

1

맨 먼저 nginx는 응용 프로그램 실행을 직접 지원하지 않습니다. 정적 파일, 다른 웹 서버에 대한 프록시 요청 및 기타 작은 것들을 제공 할 수 있습니다. 역사적으로 nginx는 많은 네트워크 연결을 처리하는 것을 목표로 삼았지만 그 근거는 다음과 같습니다. 아파치가 느린 연결에서 다른 사람의 요청에 응답 할 때까지 아무것도 할 수 없습니다. Apache에는 작업자 수 제한이 있으므로 느린 클라이언트가 많은 경우 새로운 사람은 때까지 기다려야합니다. 작업자가 이전을 완료하고 새 요청 수락을 다시 시작합니다. 고전적인 설정은 nginx가 외부 요청을 받아들이고,이를 로컬 아파치에 프록시 처리합니다. 아파치는 요청을 처리하고 nginx에 응답을 보내 클라이언트로 전송합니다. 따라서 클라이언트를 처리 할 때 아파치가 제거됩니다.

그림의 질문 및 nginx에 관해서. 요즘에는 시스템 이벤트 프레임 워크를 활용하는 것이 어렵지 않습니다. Linux의 경우 epoll, FreeBSD 의 경우 kqueue입니다. 응용 프로그램 수준에서 많은 선택, 비단뱀에 대한 예를 들어 트위스트. 그래서 당신이해야 할 일은이 프레임 워크 들인 과 1) 일반적으로 비동기 적 세계에 넣는 방법 2)은 nginx를위한 백엔드가 될 HTTP 서비스를 만들기 위해 방법을 제공하는 것입니다. 아마 당신이 겨냥하고있는 곳 일 겁니다.

그래서 c10k는 nginx, 에 대한 문제가 아니며 이러한 프레임 워크를 기반으로하는 응용 프로그램에도 문제가되지 않습니다. 예제는 friendfeed의 토네이도 서버입니다. python으로 작성되고, 시스템에 따라 epoll과 kqueue가 사용되며, 은 8k를 쉽게 처리 할 수 ​​있습니다. 일부 벤치 마크는 이었으며 이후로 확장했습니다.

루비 세계에서 모든 비동기 트렌드 인 에 대해 뭔가가 양조되어 있어야합니다. Ruby의 승객과 잡종은 무엇이든간에 (이것에 관해서는 비우고있다.) 은 nginx와 작동하며, 이것은 nginx를위한 모듈을 작성해야한다. 커뮤니티는 nginx를 고려하여 필요할 때 추가로 처리합니다.

PHP는 웹 소켓이 대규모로 전개 될 때 푸시와 관련이 있습니다. 오 잘.

+0

답장을 보내 주셔서 감사합니다.하지만 "PHP는 웹 소켓을 대량으로 배포 할 때 푸시와 관련이 있습니다"라고 분명합니다. 내 이해에서 PHP는 Comet 서버 측 구현에는 적합하지 않습니까? –

+0

글쎄, 잘 모르겠다. 아파치에서 이것은 분명히 날지 않을 것이다. 그러나 PHP 서버의 경우, 프레임 워크는 일부 인터페이스를 통해 사용할 수 있어야합니다. 하지만 그래, 그건 비현실적이야. Comet은 구현되는 모든 것이 메시지 대기열 서버가 될 수 있습니다. 대기열에 들어간 모든 내용을 클라이언트에 다시 보냅니다. 그래서 임의의 코드, 을 눌러야 할 때, 혜성 서버에 메시지를줍니다. 독립형 서버이므로 비동기 방식으로 모든 코드를 다시 작성할 필요가 없습니다. 그게 PHP를 어쨌든 만들려고 시도한 긴 폴링 요청에 대한 것입니다. – rzab

0

요점은 중요하지 않다는 점입니다. PHP는 웹 개발의 표준이며 사람들이 일반적으로 서버에 관심을 갖고있는 것입니다. Ngnix 나 Apache가 PHP가 아니면 다른 프로그래밍 언어보다 더 빠른 무명 프로그래밍 언어 y 번을 실행하는 데 최적화되어 있기 때문입니다.

+0

각 요청에 I/O 작업이 필요한 경우 Nginx 모델이 더 우수함을 강조합니다. 나는 그 질문을 갱신했다. –

관련 문제