Se você pode atualizar para o Nginx 1.8.x ou Nginx 1.9.x, você pode usar esta diretiva para desabilitar o buffer de requisição:
proxy_request_buffering off
Pense que isso deve resolver seu problema.
Primeiro, alguns antecedentes: temos um dispositivo incorporado que envia muitos eventos pequenos para um servidor da web. A codificação em partes é usada para postar essas informações. Todo evento é enviado como um bloco separado, portanto, o servidor da Web (node.js) pode reagir imediatamente aos eventos. Tudo isso está funcionando como um encanto.
Desativar os servidores e executar o netcat no servidor mostra o que o dispositivo envia:
sudo nc -l 8080
POST /embedded_endpoint/ HTTP/1.1
Host: url.com
User-Agent: spot/33-dirty
Transfer-Encoding: chunked
Accept: text/x-events
Content-Type: text/x-events
Cache-Control: no-cache
120
{"some","json message"}
232
{"other","json event"}
232
{"and a lot more","up to 150 messages per second!"}
0
Agora eu instalei o nginx no meu servidor web (versão 1.6.0). No final, eu quero lidar com SSL e quero agilizar o tráfego normal da web.
Se eu agora ativar o nginx com esta configuração do servidor:
server {
listen 8080;
location / {
proxy_http_version 1.1;
expires off;
proxy_buffering off;
chunked_transfer_encoding on;
proxy_pass http://localhost:5000;
}
}
Então eu recebo isso:
sudo nc -l 8080
POST /embedded_endpoint/ HTTP/1.1
Host: localhost:5000
Connection: close
Content-Length: 2415
User-Agent: spot/33-dirty
Accept: text/x-events
Content-Type: text/x-events
Cache-Control: no-cache
{"some","json message"}
{"other","json event"}
{"and a lot more","up to 150 messages per second!"}
O problema é que isso é armazenado em buffer, as solicitações agora são enviadas a cada 2 segundos. Todas as mensagens estão incluídas e podem ser manipuladas. Mas há um atraso agora ...
Posso instruir o nginx a encaminhar meus pedaços diretamente? Isso só precisa acontecer para esse endpoint incorporado. Eu entendo que não há muito uso no nginx quando você desativa isso para todos os endpoints.
Com proxy_buffering off
, nginx não deve armazenar em buffer as respostas em partes do back-end. Você não precisa definir chunked_transfer_encoding on
explicitamente, é o padrão. O próximo passo que eu daria para o diagnóstico é observar o fluxo entre o nginx e o backend (um pouco rápido de tcpdump -i lo -n port 5000
deve fazer o truque) para ver se o nginx está, de fato, em buffer ou se o comportamento do backend mudou por algum motivo.
Para mim, o remédio foram essas duas configurações:
No arquivo:
/etc/nginx/nginx.conf
Adicionar:
proxy_max_temp_file_size 0;
proxy_buffering off;
Entre as linhas client_max_body_size 128M;
e server_names_hash_bucket_size 256;
:
http {
client_max_body_size 128M;
proxy_max_temp_file_size 0;
proxy_buffering off;
server_names_hash_bucket_size 256;
Tags nginx reverse-proxy http request chunked