错误:在读取上游时,readv()失败(104:对等方重置连接)。

10

我有一个使用flask、nginx和uwsgi的Facebook应用程序。每当它从Facebook接收到POST请求时,总是会出现错误:

readv() failed (104: Connection reset by peer) while reading upstream

但是当我直接访问我的应用程序(使用GET方法)时,它运行顺畅。我已经采取的措施:

  1. 仅使用POST方法限制@app.route - 不起作用。
  2. 在wsgi中添加限制:uwsgi_buffer_size(以防来自facebook的请求很大),uwsgi_harakiri(以防uwsgi在完成请求之前提供超时)- 不起作用。

我在django中有解决方法,但还不知道如何在flask中实现。请问有人能帮忙吗?


对我来说,这个答案有点荒谬。即使我的处理程序什么也不做,我也必须处理所有的POST数据。如果请求中没有“nothing”,就跳过。它能够工作...顺便说一句,Facebook会使用POST请求打开应用程序,所以我应该为每个路由添加它。肯定有更好的方法来解决这个问题... - asofyan
如果套接字上有数据,您必须读取它们(没有其他选择)。在Flask Wiki上,您可以找到一个中间件来绕过代理设置中的这个常见问题:http://flask.pocoo.org/snippets/47/。uWSGI可以通过--post-buffering选项帮助您,但这只是一个快捷方式,其中没有任何魔法。 - roberto
2个回答

4
这是uwsgi的一个bug。你可以在[uWSGI] Several bugs了解更多信息。
简单的解决方法是使用wsgi.input读取POST body,即使POST body为空或者你不需要POST参数。

这与uWSGI无关(当然也不是一个bug)。关闭一个未读取其中数据的套接字是错误的编程行为。如果您不想更改代码,uWSGI可以通过--post-buffering选项自动缓冲后续数据来帮助您。 - roberto
@roberto 谢谢。当在uwsgi设置中添加post-buffering选项时,它可以工作。但在某些情况下,例如post请求没有参数,就不需要从wsgi.input读取post body。因此,我认为这不是程序员的错误。 - Yang Juven

2
问题在于“上游”(nginx代理的实际进程)关闭了连接。
在我的情况下,Django是我的Web服务器,我需要将DATA_UPLOAD_MAX_NUMBER_FIELDS设置得更大,因为POST请求中有太多的字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接