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

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



답변

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

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

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

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

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


답변

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

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

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


답변

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

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


답변