아파치 vs Nginx


29

나는 최근에 Apache와 Nginx의 차이점을 조사해 왔으며 어떤 것을 선택해야할지 혼란스러워합니다.

나는 약간의 검색을했지만 두 사람 사이에 확실한 비교는 없으며 여기 누군가가 두 사람의 차이점에 대한 견해를 줄 수 있는지 궁금합니다.

내 현재의 지식은 mod_php가 fastcgi보다 빠르고 안전하다는 것을 이해할 수 있지만 Apache는 동시 연결 및 메모리 소비와 관련하여 훨씬 나쁩니다.

내 사이트는 긴 폴링을 많이 사용하지만 AJAX 웹 기반이 아닙니다 (즉, 맨 위에 긴 폴링이있는 Apache).

Apaches 메모리 문제에 대한 나의 원래 해결책은 node.js를 통해 긴 폴링을 보낸 다음 node.js가 2 초마다 Apache에 액세스하도록하는 것입니다.이 경우 Apache는 열린 연결이 없지만 대신 node.js가됩니다. 나는 이것이 충분하지 않다는 것을 깨닫고 다른 해결책을 찾고 있습니다. 나는 원래의 아이디어가 효과가 있었는지 여전히 관심이 있습니다.

그렇다면 현대 웹에는 어떤 것이 더 좋습니까? 아파치 또는 Nginx?

업데이트 : 주어진 모든 제안이 좋고 유효했습니다. 나는 전체 Nginx 서버를 사용하는 원래의 두 번째 아이디어를 가지고 갔다. 나는 전용 서버이기 때문에 fastcgi로 보안 문제를 겪을 수 없다는 것에 만족하고 있으며 긴 폴링 스크립트는 PHP로 작성해야하기 때문에 높은 부하 동시 연결을 처리 할 수있는 서버가 필요합니다. 메모리가 부족한 구조를 변경합니다.

Martin F의 대답은 마크에 대한 가치가 있다고 생각되는 내 질문에 명확하고 완전한 답변을 주었으므로 표시되었습니다.하지만 세 가지 답변 모두 좋고 유효하며 내가 소유 한 다른 사이트에 리버스 프록시를 사용하는 것이 가장 확실합니다. 방금 Nginx가 프록 싱에서 할 수있는 매우 쿨한 것을 발견했기 때문에.

감사,

답변:


28

내가 해결해야 할 오해가있는 것 같습니다.

우선, mod_php는 조금 더 빠르며, 모든 테스트에서 차이가 너무 작아서 고려할 가치가 없다는 것을 보여주었습니다. 또한 전용 서버를보고있는 것처럼 보안 측면이 귀하와 관련이 있는지 의심합니다. mod_php는 실제로 공유 환경에서만 이점이 있습니다. 실제로는 전용 환경에서 php-fpm은 PHP와 웹 서버가 다른 프로세스로 실행되므로 이점이 있습니다. PHP-의 멋진 로깅 옵션도 고려하지 않습니다. 느린 로그와 같은 fpm.

세계가 흑백이라면 순수한 nginx 설정으로 가서 php-fpm으로 PHP를 컴파일하십시오. 더 현실적으로 아파치가 이미 작동하고 있다면 nginx를 아파치의 리버스 프록시로 설정하면 몇 시간의 설정 시간을 절약 할 수 있으며 성능의 차이는 미미합니다.

그러나 세계가 1 초 동안 흑백이라고 가정하면 훨씬 더 멋진 설정이 가능하기 때문입니다. 웹 서버에는 nginx + php-fpm을 사용하십시오. 업로드를 해결하려면 업로드 모듈과 nginx의 업로드 진행률 모듈을 사용하십시오. 즉, 웹 서버는 업로드를 수락하고 파일 경로가 완료되면 PHP로 파일 경로를 전달하므로 파일은 fastcgi 프로토콜 sweet를 통해 nginx와 PHP간에 스트리밍 될 필요가 없습니다. (실시간 설정 에서이 기능을 사용하면 잘 작동합니다!)

사용자 다운로드의 경우 x-accel-redirect라는 nginxs x-send-file과 같은 기능을 사용합니다. 기본적으로 PHP에서 인증을 수행하고 nginx가 선택하고 해당 파일을 전송하기 시작하는 헤더를 설정합니다. PHP는 실행을 끝내고 웹 서버가 전송을 처리하고 있습니다. (다시 말해서, 나는 이것을 라이브 셋업에서 가지고 있으며 훌륭하게 작동합니다)

서버 또는 다른 장기 실행 작업에 파일을 배포하기 위해 PHP가 실제로 가장 적합하지 않다는 것을 알고 있으므로 다른 서버의 작업자간에 작업을 분산시킬 수있는 작업 서버 인 gearman을 설치 합니다. 언어. 따라서 배포 작업자를 만들고 100MB PHP 대신 총 200KB의 메모리를 사용하여 5 개를 생성 할 수 있습니다. 단. (나는 또한이 러닝을 라이브로 가지고 있기 때문에 실제로는 가능하다)

아직 당신이 그것을 집어 들지 않았다면, 많은 문제가 웹 서버와 전혀 관련이 없다고 생각합니다. 아파치가 구조 때문에 웹 서버와 관련되도록 강요하기 때문에 그렇게 생각합니다. 종종 PHP보다 작업을위한 도구가 훨씬 뛰어나며 PHP는이를 알고 언어를 떠나 PHP를 떠나지 않고도 작업을 오프로드 할 수있는 훌륭한 옵션을 제공하는 언어입니다.

나는 nginx를 강력히 추천하지만, 다른 문제에 대한 다른 옵션을 살펴 봐야한다고 생각합니다. 스케일링이나 성능 문제가 있으면 언제든지 저를 작성하십시오. 나는 당신이 여기를 통해 메시지를 보낼 수 있는지 모르겠지만 nginx로 태그가없는 것에 대해 서버 결함을 스토킹하지 않기 때문에 martin@bbtn.us에 저를 쓰십시오. :)


1
내가 정말로 찾고있는 설명이었습니다 :) 감사합니다. Apache가 내 사이트를 사용하여 질식하고 죽기 때문에 Nginx를 배우는 데 꽤 팔리고 있다고 생각합니다. 다행히도 이동하기가 정말 쉽습니다. node.js에있는 사람들은 대부분의 내용을 작성하고 실제로 필요한 경우에만 PHP 세션 클래스를 폴링한다고 말했음을 의미합니다 (사용자가 창을 닫을 때 감지하는 방법이 없다면 : P). 예, 대규모 서버 팜에서 실행 중이므로 보안에 도움이되는 톤이없는 것으로 알고 있습니다. 이에 대한 설명 덕분입니다. :)
Sammaye

나는이에서 찾고 있었어요 : joeandmotorboat.com/2008/02/28/... 이 : blog.webfaction.com/a-little-holiday-present 그것은 정말 오래 할 수 있다는 생각에 kiddying있어왔다 내 마음에 진정으로 내용을 조사하십시오. Apache와 달리 단일 메모리 문제는 아닙니다. :)
Sammaye

자바에서 멀티 스레드 작업자를 만들 수 있고 PHP가 완벽하게 해결할 수 있다고 말하십시오. 필자는 가장 큰 문제는 긴 폴링을 사용하여 Apache에서 대규모 메모리 문제를 겪기 때문에 서버입니다 .Nginx가 일반적으로 수정합니다.
Sammaye

1
본질적으로 그렇습니다. PHP 용 gearman 확장을 사용하여 C로 작성된 파일 배포 작업자가 있습니다. 배포 작업을 gearman 작업 서버로 보내고 작업자에게 전송하여 언어로 작성할 수 있습니다. PHP, Java, C 등.이 작업자는 작업을 수행하고 기어 맨에게 상태를보고하고 PHP에 다시보고합니다. (백그라운드 작업을 선택하지 않은 경우, PHP는 기다리지 않고 종료됩니다)
Martin Fjordvald

2
나는 이것이 오래된 게시물이라는 것을 알고 있지만, 이것은 nginx vs apache의 주제에서 찾은 가장 유익한 게시물 중 하나입니다. 탄 마틴, +1
Akoi Meexx

5

nginx를 리버스 프록시로 실행하는 것이 좋습니다. 모든 정적 및 캐시 파일 (Apache보다 훨씬 빠르거나 메모리 오버 헤드가 적음)을 처리 한 다음 동적 컨텐츠에 대한 모든 요청을 Apache로 전달합니다.


예, 이것이 대부분의 사람들이 atm을하고있는 것 같습니다. 분명히 이것을 살펴 봐야 할 것입니다 :)
Sammaye

1
로깅 목적으로 클라이언트 IP 주소를 통과 할 수 있도록 Apache 용 mod_rpaf를 설치해야합니다 (그렇지 않으면 Apache 로그는 모든 요청을 127.0.0.1로 표시 함). nginx 구성에 다음을 추가하십시오. proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
그렉 Annandale

오늘 밤에 시도하기 전에 한 가지 궁금합니다. Nginx를 통해 Apache로 PHP를 라우팅하는 경우 긴 폴링이 여전히 Apache와 동일한 문제가 있거나 리버스 프록시에서 호출하면 Apache가 어떤 방식으로 다르게 작동합니까?
Sammaye

1

mod_php가 다른 대안보다 빠르지 않다는 것을 확신하지 못합니다. 어디에서 읽었습니까? 나는 nginx + php-fpm으로 몇 가지 실험실 테스트를 수행했으며 측정 한 결과 다른 모든 설정보다 뛰어납니다.

이 설정을 살펴보십시오 : http://interfacelab.com/nginx-php-fpm-apc-awesome/

http://www.dotdeb.org/의 PHP 패키지를 사용한다는 점을 제외하고는 거의 동일하게 설정했습니다. 여기에는 php-fpm 패키지와 사용할 수있는 init 스크립트가 포함됩니다. memecache 또는 syck을 사용하지 않습니다.


stackoverflow.com/questions/78108/… 여기에서 가져 왔고 PHP 매뉴얼을 확인했으며 php_mod가 cgi 버전보다 상당한 이점을 제공한다고 말합니다. 설정이 좋아 보인다. 너무 쉽게 보인다. 나는 그것을 살펴볼 것이다 :)
Sammaye

2
그것은 CGI가 내장 모듈보다 훨씬 느리다는 것을 나타냅니다-FastCGI가 아님 :)
pauska

1
글쎄-PHP 프로세스가 죽거나 시간이 초과되는 것에 대해 걱정한다면 FastCGI (또는 PHP-FPM)가 나아갈 길입니다. 다른 활동을 방해하지 않고 죽은 자식 프로세스를 종료시킬 수 있습니다.
pauska

1
예. 또는, 그것은 달려 있습니다. 동시에 몇 개의 (최대) 느린 요청을 처리합니까? 최대 PHP FPM 스레드와 함께 "빠른"cgi 수를 설정하십시오. 4GB RAM이있는 서버에서 200 명의 PHP-FPM 자식을 실행하는 사람들에 대해 들었습니다. 따라서 제가 여러분이라면 이것에 대해 너무 걱정하지 않아도됩니다. 다음 버전의 PHP (5.3.3)에는 표준에 따라 PHP-FPM이 포함되며 여기에는 추가 엔진도 포함됩니다. 보류중인 요청 수에 따라 확장됩니다.
pauska

1
여러 서버 (최대 10 개)에서 쉽게 실행할 수 있지만 4GB 서버에서 오랫동안 폴링 할 수있는 200 개의 요청을 수용 할 수 있다면 20 개 서버의 거의 절반이 Apache를 실행해야합니다. 흠 ... 오늘 밤에 이것을 테스트해야합니다
Sammaye
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.