Eu tenho um aplicativo da Web bastante grande e lento (dados complexos, front-end complexo) construído RoR
e servido Puma
com nginx
proxy reverso. Olhando para o nginx
log de erros, vejo algumas entradas como:
2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file
/var/lib/nginx/proxy/8/47/0000038478 while reading upstream,
client: 5.144.169.242, server: engagement-console.foo.it,
request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0",
upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2",
host: "ec.reputationmonitor.it",
referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"
Estou bastante curioso, pois é muito improvável que a página permaneça a mesma para diferentes usuários e diferentes interações de usuários, e não acho que armazenar em buffer a resposta no disco seja necessário/útil.
Eu sei proxy_max_temp_file_size
e defini-lo como 0, mas me parece um pouco estranho (meu proxy tenta buffer, mas não tem arquivo para armazenar em buffer ... como isso pode ser mais rápido?).
Minhas perguntas são:
Como posso remover o [aviso] e evitar o buffer de respostas? É melhor desligar
proxy_buffering
ou colocarproxy_max_temp_file_size
em 0? Por quê?Se
nginx
armazena uma resposta em buffer: quando ela fornece a resposta em buffer, para quem e por quê?Por que
nginx
ligaproxy_buffering
por padrão e depois [avisa] se ele realmente armazena uma resposta em buffer?Quando uma resposta aciona essa opção? Quando leva > alguns segundos (quantos?) para servir a resposta? Isso é configurável?
TIA, ngw.
Você deve definir
proxy_max_temp_file_size
como 0 para removê-lo. Aproxy_buffering
diretiva não está diretamente relacionada ao aviso. Você pode desativá-lo para interromper qualquer buffer, mas isso não é recomendado em geral (a menos que seja necessário para Comet ).Ele atende a resposta imediatamente, mas um cliente geralmente tem uma conexão muito mais lenta e não pode consumir os dados de resposta tão rápido quanto são produzidos pelo seu aplicativo. O Nginx tenta armazenar em buffer toda a resposta para liberar seu aplicativo o mais rápido possível.
Veja também: http://aosabook.org/en/nginx.html
Como já mencionei, o
proxy_buffering
não está diretamente relacionado ao aviso. Geralmente é necessário para operações de proxy otimizadas e desativá-lo degrada o desempenho e a taxa de transferência.O Nginx apenas avisa quando uma resposta não se encaixa nos buffers de memória configurados. Você pode ignorar o aviso se estiver tudo bem para você.
Ele é acionado quando os buffers de memória estão cheios. Por favor, veja os documentos, todo o mecanismo é explicado: http://nginx.org/r/proxy_max_temp_file_size
Você pode querer aumentar os buffers de memória.
A configuração a seguir funciona bem no meu servidor.