Por que preciso do nginx quando tenho uWSGI

62

Existem muitos tutoriais sobre como configurar o nginx para cooperar com o uWGSI quando eu quiser implantar o aplicativo Django.

Mas por que preciso do nginx neste kit? O próprio uWSGI pode servir aplicativos WSGI Python, pode servir arquivos estáticos, também pode fazer SSL. O que o nginx pode fazer que o uWSGI não pode?

user983447
fonte
9
Percebo que esta questão está encerrada com base em opiniões. Eu discordo absolutamente. Pergunta "O que o nginx pode fazer que o uWSGI não pode?" é baseado em fatos.
User983447 de
11
Geralmente não falo por reabertura, mas neste caso eu concordo. A resposta votada e aceita existente é boa, o que mostra que a pergunta, como escrita, admite respostas sensíveis e relevantes; Eu acho que isso provavelmente faz uma boa pergunta.
MadHatter

Respostas:

55

Você não

Essa é a resposta simples, de qualquer maneira - você não precisa dela. O próprio uWSGI é um servidor capaz.

No entanto, outros servidores como o nginx existem há mais tempo e são (provavelmente de qualquer maneira) mais seguros, além de ter recursos adicionais não suportados pelo uWSGI - por exemplo, melhor gerenciamento de recursos estáticos (por meio de qualquer combinação de Expira ou E-Tag cabeçalhos, compactação gzip, gzip pré-compactado etc.) que podem reduzir significativamente a carga do servidor e da rede; Além disso, um servidor como o nginx na frente do seu aplicativo Django também pode implementar o cache do seu conteúdo dinâmico, ajudando a reduzir a carga do servidor e até facilitando o uso de uma CDN (que normalmente não funciona bem com conteúdo dinâmico). ) Você pode ir além e ter o nginx em um servidor completamente separado, revertendo as solicitações de proxy de conteúdo dinâmico para um cluster de servidores de aplicativos com balanceamento de carga enquanto lida com o próprio conteúdo estático.

Por exemplo, meu blog (enquanto é o WordPress, tem o nginx à frente) é ajustado para armazenar em cache postagens por 24 horas e para armazenar em cache as páginas de índice por 5 minutos; embora eu não veja tráfego suficiente para que isso realmente importe a maior parte do tempo, ele ajuda meu minúsculo VPS a resistir ao aumento ocasional que poderia derrubá-lo - como o grande aumento de tráfego quando um dos meus artigos foi escolhido por um twitterer com muitos milhares de seguidores, muitos dos quais re-twittaram para seus milhares de seguidores.

Se eu estivesse executando um servidor uWSGI "vazio" (e supondo que fosse um site Django, em vez de WordPress), ele pode ter resistido muito bem - ou pode ter travado e queimado, me custando visitantes perdidos . Ter o nginx na frente dele para lidar com essa carga pode realmente ajudar.

Tudo o que foi dito, se você está executando um pequeno site que não recebe muito tráfego, não há necessidade real de nginx ou qualquer outra coisa - basta usar o uWSGI por conta própria, se é isso que você deseja fazer. Por outro lado, se você vir muito tráfego ... bem, você ainda pode querer o uWSGI, mas pelo menos considere algo à sua frente para ajudar no carregamento. Na verdade, você realmente deve testar a carga de configurações diferentes com o site finalizado para determinar o que funciona melhor para você sob a carga esperada e usar o que quer que seja.

Kromey
fonte
3
A única coisa que me vem à mente que acho que vale a pena observar além do que o @Kromey abordou em sua resposta é que o protocolo nativo para o uWSGI não é http, mas o protocolo uwsgi. O protocolo uwsgi é mais simples e mais eficiente de lidar do que o http e, assim, colocar um servidor da Web com mais recursos (nginx ou outros enfeites) na frente do aplicativo uWSGI na verdade não duplica muito processamento e pode fornecer benefícios significativos, dependendo do seu necessidades.
Håkan Lindqvist
@ HåkanLindqvist está absolutamente correto; apenas para esclarecer, o uWSGI é totalmente capaz de "falar" HTTP, no entanto, pode se manter por conta própria, mas sim, vale a pena notar que um servidor Web à sua frente usaria o protocolo uwsgi, não HTTP, para fale com o uWSGI e, portanto, sim, muito pouca duplicação do processamento envolvido.
Kromey
Essa é uma boa resposta, no entanto, poderia ser aprimorada com um link para a documentação do uWSGI sobre o tópico, que explica com mais detalhes o que você pode fazer com o uWSGI: uwsgi-docs.readthedocs.io/en/latest/…
Tobias McNulty
1

Na IMO, se você colocar seu site na Internet em vez de no Lab, poderá ver a diferença.

Imagine um usuário de outro país com navegador aberto de baixa velocidade de rede para acessar seu site. O uWSGI manipulará essa conexão HTTP em um encadeamento. Esse encadeamento pode demorar muito tempo para aguardar uma solicitação HTTP completa devido à baixa velocidade da rede. Se o tamanho do seu pool de threads for 100, imagine 100 usuários tão lentos, o que acontecerá? Nenhuma thread ociosa para lidar com outra solicitação de HTTP.

Mas as coisas são bem diferentes para o Nginx. O Nginx foi projetado no 'Padrão do reator'. Você pode pesquisar no Google 'Reactor Pattern' para ver como funciona. Em resumo, a conexão de velocidade lenta não afeta a manipulação de outras solicitações de HTTP.

Jcyrss
fonte
11
Duvido que o uso do Nginx mude isso. Quando um aplicativo Django é hospedado no Apache usando WSGI, a função view será chamada antes que qualquer dado POST seja lido a partir de um soquete. Portanto, se o cliente estiver lento, ele ocupará um encadeamento da solicitação recebida até que os dados POST sejam recebidos. Por que substituir o Apache pelo Nginx mudaria isso?
Kasperd # 26/15
11
Pelo que sei, por padrão, o Nginx não fará proxy da solicitação HTTP para fazer back-end do servidor de aplicativos até obter uma solicitação HTTP completa. Portanto, para servidores de aplicativos como o Django, o que eles obtêm é sempre uma conexão e solicitação HTTP rápidas, sem perda de tempo em aguardar uma solicitação http completa. Após o manuseio da busca em breve, o encadeamento em execução pode ficar ocioso para a próxima solicitação Http em breve.
JCyrss
11
Ele é chamado de buffer de solicitação, que é ativado por padrão no Nginx (nas versões anteriores do Nginx não era possível desativá-lo): nginx.org/en/docs/http/…
Tobias McNulty