uWSGI를 사용할 때 왜 nginx가 필요한가요?


62

Django 응용 프로그램을 배포하려고 할 때 uWGSI와 협력하도록 nginx를 구성하는 방법에 대한 많은 자습서가 있습니다.

하지만 왜이 키트에 nginx가 필요합니까? uWSGI 자체는 WSGI Python 애플리케이션을 제공 할 수 있으며 정적 파일을 제공 할 수 있으며 SSL도 수행 할 수 있습니다. 어떤 uWSGI가 할 수없는 nginx는 무엇을 할 수 있습니까?


9
이 질문은 의견에 근거하여 닫혀 있음을 알 수 있습니다. 전적으로 동의하지 않습니다. 질문 "uWSGI가 할 수없는 nginx는 무엇을 할 수 있습니까?" 사실을 기반으로합니다.
user983447

1
나는 일반적으로 재 개설에 대해 말하지 않지만,이 경우에 동의합니다. 기존의 찬성 및 수락 된 답변은 좋은 답변이며, 서면으로 질문이 현명하고 적절한 답변을 인정한다는 것을 보여줍니다. 나는 그것이 좋은 질문이 될 것이라고 생각합니다.
MadHatter

답변:


55

당신은하지 않습니다.

어쨌든 간단한 대답 입니다. 필요 하지 않습니다 . uWSGI 자체는 유능한 서버입니다.

그러나 nginx와 같은 다른 서버는 uWSGI에서 지원하지 않는 추가 기능 (예 : Expires 또는 E-Tag 조합을 통한 정적 자원 처리 개선)뿐만 아니라 더 길고 더 안전합니다 (아마도) 서버 및 네트워크로드를 크게 줄일 수있는 헤더, gzip 압축, 사전 압축 gzip 등) 또한 Django 애플리케이션 앞의 nginx와 같은 서버는 동적 컨텐츠의 캐싱을 구현하여 서버로드를 줄이며 CDN (일반적으로 동적 컨텐츠와는 잘 어울리지 않음)의 사용을 용이하게합니다. ). 정적 컨텐트 자체를 처리하면서 동적 컨텐트에 대한 프록시 요청을로드 밸런싱 된 응용 프로그램 서버 클러스터로 리버 싱하여 완전히 별도의 서버에서 nginx를 사용할 수도 있습니다.

예를 들어, 내 블로그 (워드 프레스 인 동안 nginx가 앞에 있음)는 24 시간 동안 게시물을 캐시하고 5 분 동안 인덱스 페이지를 캐시하도록 조정됩니다. 실제로 대부분의 시간에 충분한 트래픽을 볼 수는 없지만, 작은 VPS 날씨로 인해 가끔씩 급상승 할 수있는 급격한 급상승 (예 : 기사 중 하나를 선택했을 때의 트래픽 급증) 수천 명의 팔로어가있는 트위터 사용자가 많은 사람들이 트위터를 수천 명의 팔로어에게 리트 윗했습니다.

내가 "맨손으로"uWSGI 서버를 운영하고 있었다면 (그리고 WordPress가 아닌 Django 사이트라고 가정 할 때) 서버가 제대로 작동했거나 추락하여 화상을 입었을 수 있습니다. . 그 하중을 처리하기 위해 nginx를 앞에두면 실제로 도움이 될 수 있습니다.

말 그대로, 많은 트래픽을 보지 못하는 작은 사이트를 운영하고 있다면 nginx 또는 그 밖의 다른 것이 필요하지 않습니다. 원하는 경우 uWSGI를 사용하십시오. 트래픽을 많이 볼 수 있습니다 다른 한편, 만약 ... 음, 당신은 여전히 uWSGI을 할 수 있습니다,하지만 당신은 적어도 부하에 도움이 그것의 앞에 무엇인가를 고려해야한다. 실제로, 완성 된 사이트에서 다른 구성을 실제로로드 테스트하여 예상되는로드에서 가장 적합한 것이 무엇인지 결정하고 그 결과물을 사용해야합니다.


3
@Kromey가 답변에서 다룬 내용 외에도 uWSGI의 기본 프로토콜은 http가 아니라 uwsgi 프로토콜이라는 점에 주목할 가치가 있다고 생각합니다. uwsgi 프로토콜은 http보다 간단하고 효율적으로 처리되므로 uWSGI 응용 프로그램 앞에 더 많은 기능을 갖춘 웹 서버 (nginx 또는 notnot)를 고수해도 실제로 많은 처리가 복제되지 않으며 사용자에 따라 상당한 이점을 제공 할 수 있습니다 필요합니다.
Håkan Lindqvist

@ HåkanLindqvist는 절대적으로 정확합니다. 명확히하기 위해 uWSGI는 HTTP를 완벽하게 "말할 수"있지만, 자체적으로는 괜찮을 수 있지만, 웹 서버 앞에는 HTTP가 아닌 uwsgi 프로토콜을 사용한다는 점에 주목할 가치가 있습니다. uWSGI와 대화하십시오. 따라서 관련된 처리에 대한 중복은 거의 없습니다.
Kromey

이것은 훌륭한 답변이지만, 주제에 대한 uWSGI의 자체 문서에 대한 링크를 통해 개선 될 수 있습니다. 이 정보는 uWSGI로 수행 할 수있는 작업에 대해보다 구체적으로 설명합니다 : uwsgi-docs.readthedocs.io/en/latest/…
Tobias McNulty

1

IMO, 웹 사이트를 랩 대신 인터넷에 넣으면 차이가있을 수 있습니다.

네트워크 속도가 느린 개방형 웹 브라우저를 가진 다른 국가의 사용자가 웹 사이트에 액세스한다고 가정하십시오. uWSGI는 해당 Http 연결을 스레드에서 처리합니다. 이 스레드는 네트워크 속도가 느려서 전체 HTTP 요청을 기다리는 데 꽤 오랜 시간이 걸릴 수 있습니다. 스레드 풀 크기가 100 인 경우 100 명의 사용자가 그렇게 느리다고 상상하면 어떻게 될까요? 다른 HTTP 요청을 처리 할 유휴 스레드가 없습니다.

그러나 Nginx와는 상당히 다릅니다. Nginx는 '리액터 패턴'으로 설계되었습니다. 구글 '리액터 패턴'이 어떻게 작동하는지 볼 수 있습니다. 즉, 저속 연결은 다른 Http 요청을 처리하는 데 영향을 미치지 않습니다.


1
Nginx를 사용하면 그 변화가 의심됩니다. Django 애플리케이션이 WSGI를 사용하여 Apache에서 호스팅되는 경우 소켓에서 POST 데이터를 읽기 전에 뷰 함수가 호출됩니다. 따라서 클라이언트가 느리면 POST 데이터가 수신 될 때까지 요청이 수신 된 스레드를 점유합니다. Apache를 Nginx로 바꾸는 이유는 무엇입니까?
kasperd

1
내가 아는 것처럼 기본적으로 Nginx는 완전한 HTTP 요청을 얻을 때까지 HTTP 요청을 백엔드 응용 프로그램 서버로 프록시하지 않습니다. 따라서 Django와 같은 응용 프로그램 서버의 경우 항상 빠른 HTTP 연결 및 요청이며 완전한 HTTP 요청을 기다리는 데 시간을 낭비하지 않고 퀘스트를 곧 처리 한 후 실행중인 스레드가 다음 Http 요청을 위해 유휴 상태가 될 수 있습니다.
Jcyrss

1
이를 Nginx에서 기본적으로 활성화되는 요청 버퍼링이라고합니다 (이전 버전의 Nginx에서는이 기능을 끌 수 없었습니다) : nginx.org/en/docs/http/…
Tobias McNulty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.