使用Python修复uWSGI中的管道破裂错误

yk9xbfzb  于 2023-11-16  发布在  Python
关注(0)|答案(3)|浏览(124)

在Python中访问REST资源(my_resource)时,uWSGI服务器在其日志中抛出以下错误:

SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request my_resource (ip <my_ip>) !!!
uwsgi_response_write_body_do(): Broken pipe [core/writer.c line 164]
IOError: write error

字符串
这似乎与超时有关(客户端在请求完成处理之前断开连接)。
这是什么类型的超时,如何修复?

mkshixfv

mkshixfv1#

这取决于你的前端服务器。例如nginx有uwsgi_read_timeout参数。(一般设置为60秒). uWSGI http路由器作为--http-timeout默认为60秒等等.当你谈论一个rest API时,我很怀疑它需要超过60秒来生成响应,你确定你没有一些错误的响应头触发连接关闭由前端web服务器?

cu6pst1q

cu6pst1q2#

如果你正在使用uwsgi nginx插件,请考虑使用

uwsgi_connect_timeout 180;
uwsgi_read_timeout 180;
uwsgi_send_timeout 180;

字符串

t8e9dugd

t8e9dugd3#

这里的StackOverflow答案帮助我uwsgi_ignore_client_abort on
42票赞成:
问题是客户端中止连接,然后Nginx关闭连接,而不告诉uwsgi中止。然后当uwsgi返回结果时,socket已经关闭。Nginx在日志中写入499错误,uwsgi抛出IOError。
非最佳解决方案是告诉Nginx不要关闭套接字并等待uwsgi返回响应。
把uwsgi_ignore_client_abort放在你的nginx. exe中。

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问题:(将http abort/close从nginx转换到uwsgi / Django)
尤达·普拉维拉大卫·德汉

相关问题