uma resposta upstream é armazenada em buffer para um arquivo temporário

48

Eu tenho um aplicativo da Web bastante grande e lento (dados complexos, interface complexa) criado em RoR e veiculado por Puma com nginx como proxy reverso. Olhando para o log de erros nginx , 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 eu não acho que o armazenamento em buffer da resposta no disco seja necessário / útil.

Eu sei sobre proxy_max_temp_file_size e defini-lo como 0, mas parece-me um pouco estranho (meu proxy tenta armazenar em buffer, mas não tem nenhum arquivo para armazenar em buffer ... como isso pode ser mais rápido?). / p>

Minhas perguntas são:

  1. Como posso remover o [warn] e evitar as respostas do buffer? É melhor desativar proxy_buffering ou definir proxy_max_temp_file_size para 0? Por quê?

  2. Se nginx buffers uma resposta: quando ela atende a resposta do buffer, para quem e por quê?

  3. Por que nginx ativa proxy_buffering por padrão e, em seguida, [avisa você se ela realmente armazena em buffer uma resposta?

  4. Quando uma resposta aciona essa opção? Quando leva > alguns segundos (quantos?) para servir a resposta? Isso é configurável?

TIA, ngw.

    
por ngw 08.04.2014 / 10:01

2 respostas

62

1) How can I remove the [warn] and avoid buffering responses? Is it better to turn off proxy_buffering or set proxy_max_temp_file_size to 0? Why?

Você deve definir proxy_max_temp_file_size para 0 para removê-lo. A diretiva proxy_buffering não está diretamente relacionada ao aviso. Você pode desativá-lo para parar qualquer buffer, mas isso não é recomendado em geral (a menos que seja necessário para Comet ).

2) If nginx buffers a response when does it serve the buffered response, to whom and why?

Ele é servidor imediatamente, mas um cliente geralmente tem uma conexão muito mais lenta e não pode consumir os dados de resposta tão rapidamente quanto 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: link

3) Why nginx turns proxy_buffering on by default and then [warn]s you if it actually buffers a response?

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 de maneira a diminuir o desempenho e a taxa de transferência.

O Nginx só 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ê.

4) When does a response triggers that option? When it takes > than some seconds (how many?) to serve the response? Is this configurable?

Aciona quando os buffers de memória estão cheios. Por favor, olhe para os documentos, todo o mecanismo é explicado: link

Você pode querer aumentar os buffers de memória.

    
por 08.04.2014 / 13:17
10

A configuração a seguir funciona bem no meu servidor.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;
    
por 04.07.2016 / 17:51