Estoy ejecutando una pequeña aplicación web escrita en Python, que se ejecuta en uWSGI y se sirve a través de nginx. Hay un componente que genera archivos ZIP para descargar, que en ocasiones pueden ser bastante grandes (varios GB). A menudo sucede que la conexión entre nginx y uWSGI se interrumpe y la solicitud se cancela; nginx ignora la respuesta truncada mientras el navegador agota el tiempo de espera porque mantiene la conexión abierta, esperando más datos de respuesta. La aplicación genera un encabezado Content-Length adecuado.
Desde el registro de 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 [...] !!!
Ya lo configuré socket-timeout
y socket-send-timeout
en la configuración socket-write-timeout
de 180
uWSGI, sin éxito. La configuración de nginx incluye uwsgi_read_timeout 180s;
yuwsgi_buffering off;
El efecto es mayoritariamente reproducible, ya que ocurre la mayor parte del tiempo, especialmente con respuestas grandes, pero nunca con el mismo desplazamiento. Repetir la solicitud una y otra vez podría eventualmente llevar a su finalización.
Respuesta1
Resultó que ni mi aplicación ni nginx eran el problema, sino un filtro de paquetes defectuoso delante de ambos.