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.