uwsgi IOError:写入错误

Posted

技术标签:

【中文标题】uwsgi IOError:写入错误【英文标题】:uwsgi IOError: write error 【发布时间】:2016-04-18 12:51:36 【问题描述】:

我的 django 应用程序的 nginx+uwsgi 配置有问题,我在 uwsgi 错误日志中不断收到此错误:

2016 年 1 月 13 日星期三 15:26:04 - uwsgi_response_writev_headers_and_body_do():POST /company/get_unpaid_invoices_chart/ (86.34.48.7) 期间管道损坏 [core/writer.c 第 296 行] IOError: 写入错误

2016 年 1 月 13 日星期三 15:26:20 - uwsgi_response_write_headers_do():损坏 在 GET 期间管道 [core/writer.c line 238] /gestiune/print_pdf/nir/136194/ (89.122.255.186) IOError: 写入错误

我没有收到所有请求,但我确实每分钟都会收到几个。 我搜索了它,我知道这是因为 nginx 在 uwsgi 想要写入响应时关闭了与 uwsgi 的连接。 这看起来很奇怪,因为在我的 nginx 配置中我有这个:

包括 uwsgi_params;

uwsgi_pass unix:/home/project/django/sbo_cloud/site.sock;

uwsgi_read_timeout 600;

uwsgi_send_timeout 600;

uwsgi_connect_timeout 60;

我确定出现错误的请求均未超过 600 秒超时。 知道为什么会发生这种情况吗?

谢谢

【问题讨论】:

【参考方案1】:

问题是客户端中止连接,然后 Nginx 关闭连接而没有告诉 uwsgi 中止。然后当 uwsgi 返回结果时,套接字已经关闭。 Nginx 在日志中写入 499 错误,uwsgi 抛出 IOError。

非最佳解决方案是告诉 Nginx 不要关闭套接字并等待 uwsgi 返回响应。

把 uwsgi_ignore_client_abort 放到你的 nginx.config 中。

location @app 
    include uwsgi_params;
    uwsgi_pass unix:///tmp/uwsgi.sock;

    # when a client closes the connection then keep the channel to uwsgi open. Otherwise uwsgi throws an IOError
    uwsgi_ignore_client_abort on;

不清楚是否可以告诉 Nginx 关闭 uwsgi 连接。关于这个问题还有另一个 SO questin:(Propagate http abort/close from nginx to uwsgi / Django)

【讨论】:

这不仅会使 uwsgi 的线程充满死客户端连接吗? 没有。一旦 uwsgi 完成,它会将数据交给 nginx 并继续前进。所以它不会被阻塞等待客户端。 nginx 会等待客户端流式传输结果,但在这种情况下,nginx 也不会等待并在 uwsgi 返回后关闭连接【参考方案2】:

另一种解决方案是将以下设置放入 uWSGI 配置中:

ignore-sigpipe = true
ignore-write-errors = true
disable-write-exception = true

见https://github.com/getsentry/raven-python/issues/732

【讨论】:

这只会隐藏错误日志,但不会阻止实际发生的错误。对吗?

以上是关于uwsgi IOError:写入错误的主要内容,如果未能解决你的问题,请参考以下文章

如何解决打开文件时出现IOError[errno 17]文件?

以“w”模式打开文件:IOError:[Errno 2]没有这样的文件或目录

多处理 IOError:错误消息长度

关于 PIL 错误 -- IOError: decoder zip not available

IOError:[Errno 套接字错误] 使用 BeautifulSoup

机器人框架[错误]意外错误:IOError:[Errno 0]错误