Nginx
uWSGI 中止響應,失去與 nginx 的連接
我正在執行一個用 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
to180
,但無濟於事。nginx conf 包括uwsgi_read_timeout 180s;
和uwsgi_buffering off;
該效果大部分是可重現的,因為它在大多數時間都會發生,尤其是在響應較大的情況下,但從不會出現在相同的偏移量上。一遍又一遍地重複請求最終可能會導致完成。
結果發現我的應用程序和 nginx 都不是問題,而是兩者前面的數據包過濾器都有問題。