【问题标题】:uwsgi: OSError: write error during GET requestuwsgi:OSError:GET请求期间写入错误
【发布时间】:2020-03-20 10:27:58
【问题描述】:

这是我在长期使用应用程序时收到的错误日志。

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 

另外,我需要详细了解操作系统写入错误和管道损坏的原因。

【问题讨论】:

标签: python django nginx uwsgi


【解决方案1】:

之前遇到过类似的问题,当客户端发出请求然后关闭它时会发生这种情况(因为服务器响应时间过长或客户端已中断)但 uwsgi 仍在处理该请求.

从标签中我注意到您使用的是 nginx+uwsgi 配置,有多种方法可以解决这个问题:

  • 找到你最耗时的请求,并在 nginx 和 uwsgi(原切)。请注意,当客户端本身中断时,这不起作用。
  • 在你的 nginx 配置集 uwsgi_ignore_client_abort on 为 uwsgi 路线。
  • 或者您可以禁用写入错误的记录 ignore-write-errors = true

【讨论】:

    【解决方案2】:

    根据我的经验,这些都是合法的断开连接,其中 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 这样的工具,如果您正在使用类似的工具。

    【讨论】:

      猜你喜欢
      • 2016-07-09
      • 2019-07-17
      • 2017-09-15
      • 1970-01-01
      • 2017-06-29
      • 2017-04-15
      • 2016-08-09
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多