왜 Nginx를 리버스 프록시로 설정하는 것이 좋은 생각입니까?


41

Nginx를 통해 리버스 프록시로 Gunicorn에서 Django 사이트를 실행하고 있습니다. Nginx가 불필요한 불필요한 오버 헤드가 아닙니까? Gunicorn 위에 추가하면 어떻게 도움이됩니까?

답변:


52

느린 클라이언트 동작과 구성에서이를 처리하는 방법에 중점을 두 겠지만 이것이 유일한 이점이라고 생각하지는 마십시오. 느린 클라이언트에 혜택을주는 것과 동일한 방법은 빠른 클라이언트, SSL 처리, 트래픽 급증 처리 및 인터넷에서 HTTP를 제공하는 다른 측면에도 이점이 있습니다.

Gunicorn은 프리 포킹 소프트웨어입니다. 로드 밸런서와 앱 서버 간 통신 또는 서비스 간 통신과 같은 대기 시간이 짧은 통신의 경우 프리 포크 시스템은 매우 성공적 일 수 있습니다. 요청을 처리하기 위해 프로세스를 가동하는 데 드는 비용은 없으며 단일 프로세스는 단일 요청을 처리하는 데 전념 할 수 있습니다. 이러한 것들을 제거하면 동시 연결 수가 처리 할 수있는 사용 가능한 프로세스 수를 초과 할 때까지 전체적으로 더 빠르고 효율적인 시스템으로 이어질 수 있습니다.

귀하의 상황에서는 인터넷을 통해 대기 시간이 긴 클라이언트를 다루고 있습니다. 이러한 느린 클라이언트는 동일한 프로세스를 연결할 수 있습니다. QPS가 중요한 경우 응용 프로그램 코드는 가능한 한 빨리 요청을 수신, 처리 및 해결하여 다른 요청으로 이동할 수 있어야합니다. 느린 클라이언트가 시스템과 직접 통신 할 때 해당 프로세스를 묶고 속도를 느리게합니다. 요청을 가능한 한 빨리 처리하고 처리하는 대신, 그 프로세스는 또한 느린 클라이언트를 기다려야합니다. 효과적인 QPS가 다운됩니다.

CPU 및 메모리 비용이 거의없는 많은 수의 연결을 처리하는 것이 Nginx와 같은 비동기 서버에 적합합니다. 많은 클라이언트를 동시에 처리하는 데 능숙하기 때문에 느린 클라이언트에 의해 동일한 부정적인 방식으로 영향을받지 않습니다. Nginx의 경우 최신 하드웨어에서 실행하면 한 번에 수만 개의 연결을 처리 할 수 ​​있습니다.

프리 포킹 서버 앞의 Nginx는 훌륭한 조합입니다. Nginx는 클라이언트와의 통신을 처리하며 느린 클라이언트 처리에 대한 페널티를받지 않습니다. 백엔드가 해당 요청을 처리 할 수있는 한 빨리 백엔드로 요청을 보내서 백엔드가 서버 리소스를 최대한 효율적으로 사용할 수 있도록합니다. 백엔드는 결과를 계산하자마자 결과를 반환하고, Nginx는 응답 속도를 느리게하여 클라이언트를 자신의 속도로 느리게 보냅니다. 한편 백엔드는 느린 클라이언트가 여전히 결과를 수신하더라도 다른 요청을 처리 할 수 ​​있습니다.


3
nitpicking : gunicorn은 프리 포킹 이벤트 기반 서버입니다. 각 프로세스는 여러 연결을 비동기 적으로 처리합니다. 그것은 nginx가 연결 당 비용을 낮추어 나머지 설명을 유효하게 만든다는 사실을 바꾸지 않습니다.
Javier

4
또한 Nginx는 "Slow HTTP DoS Attacks"를 매우 효과적으로 중지합니다. 내가 덧붙일 한 가지 점은 Nginx를 사용할 때 Gunicorn이 X-Forwarded-For 헤더를 보는 것을 지원하지 않는 한 Gunicorn에서 할 수있는 IP 관련 작업을 엉망으로 만들 수 있다는 것입니다. 나는 Gunicorn에 익숙하지 않으므로 이것이 당신에게 얼마나 큰 문제인지 말할 수 없습니다.
Niall Donegan

정보 Javier에 감사드립니다. 저는 gunicorn에 익숙하지 않습니다.
blueben

귀하의 답변은이 질문에 적합해야합니다. stackoverflow.com/q/13182892/719276
arthur.sw

* _busy_buffer_size 옵션과 관련이 있습니까?
CMCDragonkai 2016 년

2

@blueben이 맞습니다. 리버스 프록시가 사용되지 않을 때 발생할 수있는 구체적이고 일반적인 예는 백엔드 데이터베이스가 프록시가없고 트래픽 스파이크가있는 데이터베이스 연결 핸들을 실행할 수 있다는 것입니다. @blueben에서 설명한대로 연결이 느리게 해제되기 때문입니다.

데이터베이스 핸들이 부족 해지는 것을 본 첫 번째 본능은 더 많은 데이터베이스 연결을 지원하는 것입니다. 그러나 앱 앞에 리버스 프록시를 추가하면 고부하에 필요한 데이터베이스 연결 수가 크게 떨어지고 안정화되는 것을 확인할 수 있습니다. 트래픽이 급증 할 때 데이터베이스 연결 수준은 거의 급증하지 않습니다.

Nginx는 또한 정적 콘텐츠, 캐싱 및 기타 다양한 HTTP 작업을 제공하여 앱 서버가 앱 서버에 집중할 수 있도록합니다.


0

@naill Donegan은 위의 주석에서 이것을 언급하지만 대답을 보증하는 데 중요합니다.

Nginx는 gunicorn이 처리하지 못하는 느린 로리 공격을 중지합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.