Estou executando um pequeno aplicativo da web escrito em Python, executado em uWSGI e servido por meio de nginx. Existe um componente que gera arquivos ZIP para download, que ocasionalmente podem ser bem grandes (vários GB). Muitas vezes acontece que a conexão entre o nginx e o uWSGI é interrompida e a solicitação é abortada; O nginx ignora a resposta truncada enquanto o navegador atinge o tempo limite porque mantém a conexão aberta, esperando mais dados de resposta. O aplicativo gera um cabeçalho Content-Length adequado.
Do registro do uWSGI:
uwsgi_response_write_body_do(): Broken pipe [core/writer.c line 429] during GET [...]
OSError: write error
SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request [...] !!!
Já configurei socket-timeout
, socket-send-timeout
e socket-write-timeout
na 180
configuração do uWSGI, sem sucesso. O conf nginx inclui uwsgi_read_timeout 180s;
euwsgi_buffering off;
O efeito é principalmente reprodutível, pois acontece na maior parte do tempo, especialmente com respostas grandes, mas nunca no mesmo deslocamento. Repetir a solicitação continuamente pode levar à conclusão.
Responder1
Acontece que nem meu aplicativo nem o nginx eram o problema, mas um filtro de pacotes com defeito na frente de ambos.