从上游读取响应头时,Nginx uwsgi(104:由对等方重置连接)

时间:2014-03-27 19:39:50

标签: django nginx uwsgi

环境是Nginx + uwsgi。

在某些GET请求中从Nginx获取502错误的网关错误。似乎与URL的长度有关。在我们的特定情况下,它是一长串的GET参数。缩短GET参数,没有502错误。

来自nginx / error.log

[error] 22113#0: *1 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.1.100, server: server.domain.com, request: "GET <long_url_here>"

uwsgi错误日志中没有信息。

8 个答案:

答案 0 :(得分:78)

在花了很多时间之后,我终于明白了。有很多对Nginx的引用和peer的连接重置。他们中的大多数似乎与PHP有关。我找不到特定于Nginx和uwsgi的答案。

我终于找到了对fastcgi的引用和502错误的网关错误(https://support.plesk.com/hc/en-us/articles/213903705)。这导致我在uwsgi配置中查找缓冲区大小限制,该限制以buffer-size的形式存在。默认值为4096.从文档中可以看出:

  

如果您计划接收包含大量标题的大型请求,则可以将此值增加到64k(65535)。

有很多方法可以配置uwsgi,我碰巧使用.ini文件。所以在我的.ini文件中我尝试过:

buffer-size=65535

这解决了这个问题。你可以调整它来品尝。也许从最大值开始直到你有一个可接受的值,或者只留下最大值

这是令人沮丧的追踪,因为uwsgi方面没有错误。

答案 1 :(得分:3)

我得到了相同的nginx错误,而且uwsgi日志中也没有相关信息。问题是在某些情况下,应用程序没有像http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html中所建议的那样消耗整个请求主体:

  

如果HTTP请求有正文(如表单生成的POST请求),则必须在应用程序中读取(使用)它。如果不这样做,与您的网络服务器的通信套接字可能会被破坏。如果你很懒,你可以使用后缓冲选项,它会自动为你读取数据。对于Rack应用程序,这将自动启用。

当然,在您的情况下这不是问题,但对于获得相同nginx错误的其他人可能会有用。

答案 2 :(得分:3)

谢谢,在PHP服务器的情况下采用相同的解决方案。我们只需要增加属性&#34; output_buffering&#34;在php.ini中,值为更大的值,如65535或其他适当的值。

答案 3 :(得分:0)

当我们收到像(104: Connection reset by peer) while reading response header from upstream这样的消息时,通常情况下,我们可以将此类错误归咎于上游方面。

如上所述,连接由上游对等方重置,而不是由nginx本身重置。作为客户端的Nginx几乎无法做任何事情来使其正确。

我怀疑修改缓冲区大小是否会起到作用。基本上,该命令会更改缓存响应头的缓冲区大小。这将在响应标头太大时生效,在这种情况下,我们收到一条消息upstream sent too big header while reading response header from upstream,这与connection reset by peer完全不同。

由于这种错误是随机触发的,我建议你在与上游交谈时检查nginx是否使用keepalive。如果是这种情况,当空闲超时时,上游服务器可能会重置连接,而nginx不知道连接已被丢弃,因此使用相同的连接转发请求。

据我所知,没有优雅的解决方案来修复它。您可以重试或在nginx中为上游连接池设置keepalive_timeout值以避免此问题。

参考:

Apache HttpClient Interim Error: NoHttpResponseException

http://tengine.taobao.org/document/http_upstream_keepalive_timeout.html

答案 4 :(得分:0)

--post-buffering 32768 按照建议(并且气馁)为我工作NGINX + uWSGI Connection Reset by Peer

我目前没有时间进一步调查(快速原型模式:),但由于我花了很多时间才找到这个黑客,所以可能值得在这里发帖。

答案 5 :(得分:0)

它偶尔不会出现。

我认为最可能的原因是您的php-fpm.log的尺寸过大。尝试将log_level中的php-fpm.conf更改为更高级别,然后清除日志。

无论如何,它对我有用。

答案 6 :(得分:0)

如果您的请求/响应标头很大,就会发生这种情况。

要修复此问题,请在 /etc/uwsgi/apps-available/your-app.ini 中添加buffer-size=65535

答案 7 :(得分:-7)

您需要重新安装PHP:

apt-get install --reinstall php5-fpm