我正在运行一个用 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
,socket-send-timeout
和socket-write-timeout
to 180
,但无济于事。nginx conf 包括uwsgi_read_timeout 180s;
和uwsgi_buffering off;
该效果大部分是可重现的,因为它在大多数时间都会发生,尤其是在响应较大的情况下,但从不会出现在相同的偏移量上。一遍又一遍地重复请求最终可能会导致完成。