我正在运行一个用 Python 编写的小型 Web 应用程序,它在 uWSGI 中运行并通过 nginx 提供服务。有一个组件会生成 ZIP 文件供下载,这些文件有时可能非常大(几 GB)。经常发生 nginx 和 uWSGI 之间的连接中断,请求被中止;nginx 会在浏览器超时时忽略截断的响应,因为它保持连接打开,期望收到更多响应数据。该应用程序会生成正确的 Content-Length 标头。
从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 [...] !!!
我已经在 uWSGI 配置中设置了和,socket-timeout
但无济于事。nginx conf 包含和socket-send-timeout
socket-write-timeout
180
uwsgi_read_timeout 180s;
uwsgi_buffering off;
这种效果大多数情况下是可重现的,因为它大多数时候都会发生,尤其是在响应量很大的情况下,但偏移量从不会相同。反复重复请求最终可能会完成。
答案1
事实证明,问题既不是我的应用程序也不是 nginx,而是两者前面的数据包过滤器有故障。