Por que definir o Nginx como proxy reverso é uma boa idéia?

41

Eu tenho um site Django em execução no Gunicorn com um proxy reverso através do Nginx. O Nginx não é apenas uma sobrecarga extra desnecessária? Como adicionar isso em cima de Gunicorn ajuda?

Único
fonte

Respostas:

53

Vou me concentrar no comportamento lento do cliente e em como sua configuração lida com isso, mas não fique tentado a acreditar que esse é o único benefício. O mesmo método que beneficia clientes lentos também oferece benefícios para clientes rápidos, manipulação de SSL, tratamento de picos de tráfego e outros aspectos da veiculação de HTTP na Internet.

Gunicorn é um software de pré-bifurcação. Para comunicações de baixa latência, como o balanceador de carga para o servidor de aplicativos ou a comunicação entre serviços, os sistemas pré-bifurcados podem ser muito bem-sucedidos. Não há custo em acelerar um processo para lidar com a solicitação, e um único processo pode ser dedicado ao tratamento de uma única solicitação; a eliminação dessas coisas pode levar a um sistema mais rápido e eficiente em geral, até que o número de conexões simultâneas exceda o número de processos disponíveis para lidar com elas.

Na sua situação, você está lidando com clientes de alta latência pela Internet. Esses clientes lentos podem amarrar os mesmos processos. Quando o QPS importa, o código do aplicativo precisa receber, manipular e resolver a solicitação o mais rápido possível, para que possa passar para outra solicitação. Quando os clientes lentos se comunicam diretamente com seu sistema, eles amarram esse processo e o tornam mais lento. Em vez de manipular e descartar a solicitação o mais rápido possível, agora esse processo também precisa aguardar o cliente lento. QPS eficaz diminui.

Lidar com um grande número de conexões com pouquíssimo custo de CPU e memória é o que os servidores assíncronos como o Nginx são bons. Eles não são afetados da mesma maneira negativa por clientes lentos porque são hábeis em lidar com um grande número de clientes simultaneamente. No caso do Nginx, rodando em hardware moderno, ele pode lidar com dezenas de milhares de conexões ao mesmo tempo.

O Nginx na frente de um servidor de pré-bifurcação é uma ótima combinação. O Nginx lida com a comunicação com os clientes e não sofre penalidade por lidar com clientes lentos. Ele envia solicitações para o back-end o mais rápido possível para lidar com esses pedidos, permitindo que o back-end seja o mais eficiente possível com os recursos do servidor. O back-end retorna o resultado assim que o calcula, e o Nginx armazena em buffer essa resposta para alimentá-lo para retardar os clientes em seu próprio ritmo. Enquanto isso, o back-end pode passar a lidar com outra solicitação, mesmo quando o cliente lento ainda está recebendo o resultado.

blueben
fonte
3
nitpicking: gunicorn é um servidor pré-bifurcado baseado em eventos. cada processo lida com várias conexões de forma assíncrona. Isso não muda o fato de que o nginx tem um custo por conexão muito menor, validando o restante da sua explicação.
Javier
4
E, como bônus, o Nginx interrompe o "Slow HTTP DoS Attacks" com muita eficiência. O único ponto que eu acrescentaria é que, ao usar o Nginx, ele pode atrapalhar qualquer coisa relacionada ao IP que você esteja fazendo no Gunicorn, por exemplo, autenticação por ip, log etc. etc., a menos que o Gunicorn suporte a visualização do cabeçalho X-Forwarded-For. Eu não estou familiarizado com Gunicorn, então não posso dizer quão grande será esse problema para você.
Niall Donegan
Obrigado pela informação Javier, eu não sou mais do que passageiro familiar com gunicorn.
blueben
Sua resposta deve ser adequada para esta pergunta: stackoverflow.com/q/13182892/719276
arthur.sw 4/12/14
Isso tem algo a ver com a opção * _busy_buffer_size?
CMCDragonkai
2

@blueben está certo. Um exemplo específico e comum do que pode acontecer quando um proxy reverso não é usado é que um banco de dados back-end pode executar identificadores de conexão de banco de dados onde não há proxy e há um pico de tráfego. Isso ocorre porque as conexões demoram a ser liberadas, como o @blueben descreveu.

Um primeiro instinto para ver os manipuladores de banco de dados se esgotando pode ser oferecer suporte a mais conexões com o banco de dados. Mas, ao adicionar um proxy reverso na frente do aplicativo, você verá o número de conexões necessárias ao banco de dados para alta carga diminuir significativamente e se estabilizar - o nível de conexão com o banco de dados não aumentará tanto quando houver um pico de tráfego.

O Nginx também é ótimo em fornecer conteúdo estático, armazenamento em cache e várias outras tarefas HTTP, permitindo que o servidor de aplicativos se concentre em ser um servidor de aplicativos.

Mark Stosberg
fonte
0

@naill Donegan menciona isso no comentário acima, mas é importante o suficiente para justificar uma resposta.

Nginx interrompe o lento ataque de loris que o gunicorn não suporta.

rox0r
fonte