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

61

Eu tenho um pouco grandes e lentas (dados complexos, complexo frontend) aplicação web construir em RoRe servidos por Pumacom nginxproxy como inversa. Observando o nginxlog 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, e eu não acho que o buffer da resposta no disco seja necessário / útil.

Eu conheço proxy_max_temp_file_sizee defini-lo como 0, mas me parece 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?).

Minhas perguntas são:

  1. Como posso remover o [aviso] e evitar respostas do buffer? É melhor desligar proxy_bufferingou definir proxy_max_temp_file_sizecomo 0? Por quê?

  2. Se nginxuma resposta é armazenada em buffer: quando ela serve a resposta em buffer, para quem e por quê?

  3. Por que nginxliga proxy_bufferingpor padrão e depois avisa se ele realmente armazena uma resposta?

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

TIA, agora.

ngw
fonte
1
Tenho a sensação de que você está confundindo buffer com cache. O buffer é o procedimento que permite carregar mais dados do que o permitido pela alocação de memória.
Slavic

Respostas:

75

1) Como posso remover o [aviso] e evitar respostas do buffer? É melhor desativar proxy_buffering ou definir proxy_max_temp_file_size como 0? Por quê?

Você deve definir proxy_max_temp_file_sizecomo 0 para removê-lo. A proxy_bufferingdiretiva 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 o Comet ).

2) Se o nginx armazena em buffer uma resposta, quando ela serve a resposta em buffer, para quem e por quê?

Ele servidores 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: http://aosabook.org/en/nginx.html

3) Por que o nginx ativa o proxy_buffering por padrão e então [avisa] você se ele realmente armazena em buffer uma resposta?

Como eu já mencionei, o proxy_bufferingnã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 bem para você.

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

É 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.

VBart
fonte
5
Para o número 1, como a remoção do limite de tamanho de arquivos temporários impede o aviso de armazenamento em buffer? Eu não acho que isso esteja correto, porque eu tenho essa diretiva definida como 0 e ainda recebo avisos.
Phil
Esta resposta não é clara o suficiente, é melhor para o desempenho definir proxy_max_temp_file_sizecomo 0ou isso é apenas uma maneira de remover esse aviso?
Offir Pe'er 20/10
12

A seguinte configuração funciona bem no meu servidor.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;
Haluk
fonte
2
A segunda diretiva é redundante, ou seja, 16ka primeira linha está fazendo exatamente o mesmo que a segunda linha?
EoghanM
1
@EoghanM de acordo com os documentos, não. Proxy_Buffer_size (buffer, não plural) se aplica à primeira parte da resposta do servidor proxy (também conhecida como cabeçalho) Sets the size of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response header. Proxy_buffers é para o resto da resposta.
Cde 08/12
2
Você salvou um pouco do meu cabelo hoje. Eu estava movendo o nginx do nosso servidor para um contêiner de docker e ele começou a ficar incrivelmente lento. Isso "consertou" isso. Não tenho certeza se a versão em nosso servidor a ativou por padrão ou não, mas a versão no contêiner definitivamente precisava dessas configurações.
Krystian