这是我长期放置应用程序时收到的错误日志。
Oct 22 11:41:18 uwsgi[4613]: OSError: write error
Oct 22 11:41:48 uwsgi[4613]: Tue Oct 22 11:41:48 2019 - uwsgi_response_write_body_do(): Broken pipe [core/writer.c line 341] during GET /api/events/system-alarms/
Nov 19 19:11:01 uwsgi[30627]: OSError: write error
Nov 19 19:11:02 uwsgi[30627]: Tue Nov 19 19:11:02 2019 - uwsgi_response_writev_headers_and_body_do(): Broken pipe [core/writer.c line 306] during GET /api/statistics/connected-clients/?type=auto&required_fields=0,11
另外,我需要详细了解操作系统写入错误和管道损坏的原因。
之前遇到过类似的问题,当客户端发出请求然后关闭它时(因为服务器响应时间太长或客户端已中断(,但 uwsgi 仍在处理该请求。
从标签中我注意到您正在使用nginx + uwsgi配置,有多种方法可以解决此问题:
- 找到您最耗时的请求,并在nginx和nginx之间进行匹配 乌斯吉(哈拉基里(。请注意,当客户端本身中断时,这不起作用。
- 在你的nginx配置集上,uwsgi的
uwsgi_ignore_client_abort on
路线。 - 或者您可以禁用写入错误的日志记录
ignore-write-errors = true
.
根据我的经验,这些是合法的断开连接,其中HTTP客户端(浏览器(关闭连接,Nginx反过来关闭uWSGI正在写入响应的文件描述符。
我可以通过访问任何重要的 Django 页面并快速敲击 F5(刷新(键几次来可靠地复制该问题。这表明这些错误是正常操作的一部分,不会造成任何负面的用户体验,因此可以安全地忽略。
要在日志中隐藏这些异常,您需要以下所有三个uWSGI设置:
ignore-sigpipe
ignore-write-errors
disable-write-exception
每个对应于以下错误行之一:
mysite - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request / (ip 1.2.3.4) !!!
mysite - uwsgi_response_writev_headers_and_body_do(): Broken pipe [core/writer.c line 306] during GET / (1.2.3.4)
OSError: write error
如果您使用类似的东西,disable-write-errors
选项还可以防止错误发送到像 Sentry 这样的工具。