언제 NGinx로 전환해야합니까?


11

Apache를 통해 여러 도메인 및 응용 프로그램이 실행되는 서버가 있습니다. 모두 지금은 잘하고 있지만 테스트를 위해 서버부터 시작하여 성능이 많이 필요한 웹 응용 프로그램 (CPPCMS와 함께 C ++ 사용)을 개발할 계획이 있습니다.

어쨌든 NGinx에 대해 많이 들었습니다. 아파치보다 성능이 뛰어 나기 때문에 새 프로젝트에서 사용할 가치가 있는지 스스로에게 묻고있었습니다. NGinx가 어떤 종류의 성능 병목 현상을 정확하게 해결하는지 모르기 때문에 마음에 명확하지 않습니다.

나는 아파치 파워 유저가 아니며, 리눅스 관리자가 열악하고 웹 응용 프로그램을 많이 개발하지는 않지만 개념을 가지고 있습니다. 나는 주로 소프트웨어 작성에 전념하기 때문에 웹 서버 부분이 때때로 나에게 모호합니다. 아파치를 통해 웹 사이트를 구성해야 할 때마다 문서를 탐색하지 않아도 모든 것을 깨뜨리지 않도록 많은 시간이 필요합니다.

즉, 나는이 측면에서 훨씬 나아지고 있지만 여전히 조언이 필요하다고 생각합니다. 나는 nginx 구성 파일을 보았는데, Apache 파일보다 훨씬 이해하기 쉽지만 어쩌면 틀렸습니까?

내가 수집 한 정보에서로드 균형 조정을 원할 때 NGinx가 최선의 선택이 될 수 있습니다. 따라서 여러 컴퓨터에 응용 프로그램을 분산시킨 경우에는 그렇지 않습니까? 스콜 링 (및 성능) 응용 프로그램을 생각할 때 필요한 것 같지만 Apache에서 NGinx로 이동하는 것이 재미있을 때 더 많은 것을 알아야 할 수도 있습니다. 현재 사용중인 모든 앱에서 NGinx로 전환 할 가치가 있습니까? 비용은 얼마입니까? (즉, 서로 전환하는 데 시간이 오래 걸리는가?) 문제없이 동일한 컴퓨터에서 Apache와 NGinx를 모두 사용할 수 있습니까?

참고 사항 : C ++ 대신 해석 언어를 사용하도록 권장하지 마십시오. 질문과 관련이 없습니다. 참고 항목 CPPCSM의 이론적 근거 페이지를 그 fromt 종류의 응용 프로그램의 어떤 혜택을 누릴 수 있습니다 볼 수 있습니다. 단점 (루비와 파이썬의 앱과 비교할 때 이미 전력 소비가 적은 웹 응용 프로그램에 사용하는 앱과 비교)을 완벽하게 이해하고 있습니다.

답변:


10

몇 가지 사항 :

Apache와 Nginx 또는 Lighttpd (개인적으로 내가 좋아하는)의 주요 차이점은 아키텍처입니다.

  1. Apache는 프로세스 또는 스레드 당 하나의 연결을 처리합니다 (mod-XYZ에 따라 다름)
  2. Nginx 및 Lighttpd는 단일 이벤트 루프에서 단일 스레드 핸들 다중 연결입니다.

결과적으로 :

  1. Nginx와 Lighttpd는 많은 수의 동시 연결에서 훨씬 더 잘 확장됩니다. 1000 개의 연결로 Apache는 mod-prefork에서 1000 개의 프로세스가 필요하거나 mod-worker에서 1000 개의 스레드가 필요하므로 거의 죽을 것입니다.

    각 연결에 긴 폴링 HTTP 연결이 필요한 Comet 기술을 사용하려는 경우에는 확장 성이 좋지 않기 때문에 Apache를 사용할 수 없습니다.

  2. Nginx와 Lighttpd는 각 연결에 +-2 개의 소켓 (HTTP 및 FastCGI), 중간 메모리 버퍼 및 일부 상태가 필요하기 때문에 적은 메모리를 소비하지만 Apache는 스택 및 기타 항목을 포함한 전체 스레드가 필요합니다.

벤치 마크에서의 개인적인 경험에서 나는 Lighttpd를했고 (Nginx도) FastCGI 백엔드보다 Apache보다 약간 빠르지 만 연결 량이 적습니다.

이제 또 다른 요점은 FastCGI 연결을 사용하여로드 밸런싱을 수행하려는 경우입니다.

전통 건축에는

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Apache는 mod-PHP (또는 다른 모드)를 실행하는 각 프로세스 풀을 처리하기 때문에

자체적으로 풀을 처리하는 CppCMS를 사용하는 경우 다른 작업을 수행 할 수 있습니다.

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

따라서 CppCMS가 프로세스, 스레드 및 연결 풀을 처리하기 때문에 기본적으로 다른 간접 수준이 필요하지 않습니다. PHP / Ruby / Perl에는 Apache mod-XYZ가 필요하거나 자체 FastCGI 커넥터를 처리해야합니다.


+1 CppCMS의 저자에 의한 완전한 완전한 설명;) 이제 전체적인 문제가 더 잘 보입니다. 따라서 서버를 하나만 가지고있는 경우 HTTP-> Balancer-> FCGI-> CPPCMS입니다. 정확히 이해하면? FastCGI가 빠르지 않다는 Jesper Mortensen의 의견에 대한 조언에 대해 어떻게 생각하십니까?
Klaim

@Klaim : 위의 우수한 그림을보십시오.이 아키텍처에서 FastCGI는 각각 다중 스레드 CppCMS 인스턴스를 실행하는 여러 서버 간의 상호 연결로 사용됩니다. 이 경우 FastCGI의 상대 속도는 그다지 중요하지 않습니다. 대안은 HTTP, AJP 및 기타 네트워크 가능 프로토콜이며 '빠른'것도 아닙니다. 이 답변은 아마도 승인 된 것으로 표시되어야하며 nginx가 가치가있을 때 실제로는 아니기 때문에 질문이 편집되었습니다.
Jesper M

@Jesper Mortensen> 동의합니다. 그러나 질문에 어떤 수정을 제안 하시겠습니까?
Klaim

6

Nginx는 일반적으로 매우 ( 매우 ) 말하면 웹 페이지를 제공하는 문제에 대한 다른 아키텍처 접근 방식 덕분에 Apache보다 훨씬 높은 처리량을 얻을 수 있습니다. Nginx는 또한 주로 리버스 프록시로 구축되었으며 그 역할을 예외적으로 잘 채 웁니다 (이것은 여러분이 언급 한로드 밸런싱 비트입니다). 반면 아파치는 웹 페이지를 제공하기 위해 만들어졌으며 나중에 프록시 기능을 얻었습니다.

즉, Apache가 Nginx보다 지속적으로 성능을 능가 할 영역은 거의 있지만 Nginx가 Apache보다 지속적으로 성능을 능가하는 영역도 있습니다.

짧은 대답은 Apache가 당신을 위해 일한다면 전환 할 필요가 없다는 것입니다. (그리고 나는 이것을 완전히 변환 된 Nginx 제자가 된 전 아파치 사용자라고 말합니다.) 서버로의 트래픽이 아파치가 병목 현상이되는 수준에 도달하기 시작할 때만 (이것은 수천 개의 동시 연결 순서입니다. 그러나 서버 사양 및 기타 서버로드에 따라 크게 다를 수 있습니다.) 또는 거의 맞지 않는 리소스가 빈약 한 환경에서 Apache를 실행하려는 경우 Nginx로 전환하면 확실한 이점이 있습니다.

즉, Nginx로 전환하려면 (권장합니다!), 가십시오. 어떤 혜택이 있습니까? 10 회 중 9 회 : 아니요, 그렇지 않습니다. 그러나 당신은, 당신이 아니라, 아파치에 비해 구성 Nginx에 더 편안하게 그렇다면, 더 나은 Nginx에의 구성 파일 언어처럼 당신을 언급 한 것입니다 당신을위한 혜택! (개인적으로 아파치 구성은 일반적으로 읽기가 더 쉽다는 것을 알지만, 수년, 수년 동안 읽었고 Nginx에 단 몇 달만 보냈기 때문일 수 있습니다!)

참고 사항 : C ++로 웹 응용 프로그램을 구축하려는 열망을 언급했습니다. 건강을 위해 PHP, Python 또는 Java와 같은 고급 언어를 대신 사용하는 것이 좋습니다. 그런 다음 코드를 프로파일 링하고 특정 병목 현상을 해결하기 위해 C ++ 기반 모듈을 만드는 것을 고려하십시오 (Python과 PHP는이를 쉽게 수행 할 수 있습니다. Java에 대해 알지 못함). 전반적인 성능이 걱정되는 경우 다음을 고려하십시오. 세계에서 가장 큰 단일 비대칭 MMORPG 인 EVE Online은 C ++로 작성된 주요 구성 요소 (예 : 그래픽 라이브러리) 만있는 Python (스택리스 Python) 변형을 기반으로합니다. 파이썬이 그것을 처리 할 수 ​​있다면 반드시 웹 앱을 처리 할 수 ​​있습니까?


+1 감사합니다. C ++에 대해서는 Jesper Mortensen 답변에 대한 의견을 참조하십시오. 또한 파이썬이 Eve Online의 서버 측에서 사용 되더라도 (이것에 대해 많이 알고 있습니다) AFAIK는 게임 플레이 코드 만 관리합니다. 그래픽 코드는 클라이언트 측에 있으므로 C ++은 이러한 유형의 그래픽 성능에 필수적입니다. 내가 말했듯이, 내가 선택한 이유에 대한 CPPCMS 근거 페이지를 참조하십시오. 조언을 따르면 응용 프로그램을 두 번 작성해야하지만 이미 전력이 부족하다는 것을 알고 있습니다. 또한 단점을 이해하고 있습니다.
Klaim

3

아무도 "전환 할 때"부분에 실제로 대답 할 수는 없습니다.로드, 자체 응용 프로그램 코드의 성능 등에 따라 달라집니다.

NGinx, 아파치보다 성능이 좋은 것 같습니다

nginx는 단일 프로세스 (또는 매우 적은 수의 작업자 프로세스)를 사용하여 이벤트 I / O를 사용하여 모든 클라이언트 연결을 처리합니다. 아파치는 여러 개의 "멀티 프로세싱 모듈"을 사용할 수 있지만, 많은 프로세스 / 스레드에 더 많이 의존합니다. 결과적으로 Apache는 기본 HTTP 연결 처리를 위해 일반적으로 nginx보다 많은 RAM과 CPU를 소비합니다. Kegel의 C10K 페이지 에서 다양한 연결 처리 방법에 대한 개요를 얻을 수 있습니다 .

매우 성능 집약적 인 웹 애플리케이션 (CPPCMS와 함께 C ++ 사용)

나는 것이 강하게 더 높은 수준의 언어로 기본 웹 애플리케이션을하고 (파이썬, 아니면 루비, 스칼라)을 고려하는 것이 좋습니다, 비동기 "성능 집약적"작업을 처리 작업자 컴퓨터에 작업 티켓을 보내 님에게 메일 큐를 사용합니다.

NGinx는로드 밸런싱을 원할 때 최선의 선택입니다.

nginx는 좋은로드 밸런서입니다. 그러나 그 공간 에는 많은 옵션이 있습니다 .

동일한 컴퓨터에서 아무런 문제없이 Apache와 NGinx를 모두 사용할 수 있습니까?

예. 다른 IP 포트 번호 및 / 또는 IP 주소에서 실행하십시오.


"고급 언어로 기본 웹앱을 사용하는 것이 좋습니다.>> 기본 웹앱이라고 말하지 않았습니다. 사소한 것도 아닙니다. CPPCMS 사용에 대한 이론적 근거가 있다면 저자는 유용 할 수있는 몇 가지 경우를 알고 있습니다. 다른 대안을 고려했지만 적어도 내가 쓰고있는 웹 응용 프로그램에서는 C ++을 사용하는 것보다 비용이 많이 듭니다. 따라서 그것은 질문의 일부가 아닙니다. 그러나 나는 당신에게 조언을 이해하고 사람들이 웹 응용 프로그램에 C ++을 사용 해야하는지 묻습니다. 또한 다른 간단한 응용 프로그램에 Python을 사용할 계획입니다.
클라 임

어쨌든, 자세한 내용은 +1입니다.
Klaim

@Klaim : 잘 조정 된 C # / Java 구현에 대해 "주문"성능 향상을 실현하려면 웹 서버에서 처리중인 CppCMS 및 응용 프로그램 코드를 플러그인으로 실행할 수 있는지 확인하십시오. nginx / 아파치. CppCMS 페이지는 웹 서버와 CppCMS 간의 연결로 FastCGI를 표시하는 것 같습니다. 실제로 FastCGI는 빠르지 않습니다.
Jesper M

> 재미있는 아이디어. 주변 조언의 대부분은 fastcgi가 대안보다 빠르기 때문에 사용해야한다는 것입니다. 이 작업을 수행 할 수 있는지 확인합니다. CPPCMS 작성자에게 왜 이것이 가장 빠르다고 생각하는지 알 수 있습니다.
클라 임
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.