Nginx e buffer de grandes respostas

3

Na configuração de nosso aplicativo, o nginx atua como um proxy reverso na frente de gunicorn .

Nosso aplicativo responde às solicitações frontend com respostas pequenas, de maneira geral ... mas alguns endpoints geram respostas maiores que uma página de memória (4K).

Quando isso acontece, o nginx registra esse aviso:

an upstream response is buffered to a temporary file 
/path/to/nginx/proxy_temp/4/86/0000000864 while reading upstream, 
client: 1.2.3.4, server: api.ourdomain.com, request: "GET /pdf/..."

Nossos registros nginx acabam inundados com esse aviso - e, até onde eu sei, as únicas soluções para fazer esse aviso desaparecer de nossos registros são soluções ruins :

  • Eu posso definir nginx proxy_max_temp_file_size para 0 - basicamente desabilitando o buffer de respostas de grande porte. Isso impediria o buffer de arquivos - mas também significaria que, para os terminais que geram grandes respostas (por exemplo, geradores de PDF que criam respostas de 1 a 2 MB), um cliente lento atrasaria o funcionário de concórdia correspondente ... Se os funcionários do Gunicorn, seria necessário apenas N clientes gerando PDFs por trás de conexões de rede lentas, e nosso aplicativo estaria em baixo ...

  • Eu posso aumentar o proxy_buffer_size para mais de 4K (uma página de memória, isto é). Tenho certeza que isso teria um impacto severo no desempenho do nginx - 70% de nossas respostas realmente se encaixam em 4K, e nós forçamos o nginx a alocar ... o que? 2MB de buffers para cada um deles, apenas para estar pronto para o pedido ocasional de geração de PDF? EDITAR : Na verdade, isso não é uma opção - Michael (abaixo) comentou que os únicos valores permitidos são 4K e 8K.

  • Eu poderia desativar proxy_buffering - mas isso é tão ruim quanto a primeira solução (clientes lentos = > morte).

Em essência, o nginx inunda nossos logs sobre algo que desejamos - buffer temporário para arquivos quando as respostas são grandes.

Nós só queremos impedir isso de inundar nossos logs, "marcando" como não sendo realmente um aviso (eu nem sei ao certo por que isso é um aviso - o que "algo ruim" está nos alertando sobre?)

Além de editar o código-fonte e recompilar nginx , há alguma outra solução que esteja faltando?

    
por ttsiodras 02.10.2015 / 10:24

1 resposta

2

Isso é resultado do nível de log na diretiva error_log do Nginx.

link

error_log logs/error.log warn;

messages of warn, error crit, alert, and emerg levels are logged.

The default setting of the error log works globally. To override it, place the error_log directive in the main (top-level) configuration context. Settings in the main context are always inherited by other configuration levels. The error_log directive can be also specified at the http, stream, server and location levels and overrides the setting inherited from the higher levels.

Essa linha sobre armazenamento em buffer está no nível de aviso:

[warn] 30055#0: *1428 an upstream response is buffered to a temporary file 

Portanto, se você garantir que seu nível de registro de erros não esteja definido para o aviso, ou seja, deixe-o no padrão ou diminua, você não verá mais esse aviso. Qualquer uma das soluções abaixo irá suprimi-las:

Deixe-o no padrão (nível 'erro' e acima):

error_log logs/error.log;

Mesma coisa:

error_log logs/error.log error;

Você também pode aumentar o limite além de error , até crit , alert e emerg .

    
por 24.11.2016 / 15:16

Tags