【问题标题】:Nginx uwsgi (104: Connection reset by peer) while reading response header from upstreamNginx uwsgi (104: Connection reset by peer)同时从上游读取响应头
【发布时间】:2014-05-07 00:21:26
【问题描述】:

环境是Nginx + uwsgi。

在某些 GET 请求上从 Nginx 获取 502 bad gateway 错误。似乎与网址的长度有关。在我们的特殊情况下,它是一长串 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 错误日志中没有信息。

【问题讨论】:

标签: django nginx uwsgi


【解决方案1】:

它不会偶尔出现。

我想最可能的原因是您的php-fpm.log 的大小过大。尝试将您的log_level 更改为php-fpm.conf 中的更高级别并清除日志。

无论如何,它对我有用。

【讨论】:

    【解决方案2】:

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

    要修复它,在 /etc/uwsgi/apps-available/your-app.ini 添加buffer-size=65535

    【讨论】:

      【解决方案3】:

      我们只需要将 php.ini 中的“output_buffering”属性值增加到更大的值,例如 65535 或其他适当的值。

      【讨论】:

      • 我猜,这应该是对其他答案之一的评论?
      • 我已经查看了很多天来解决我在服务器上断断续续地看到的这个问题,这为我解决了这个问题。就我而言,我将默认值 4096 加倍为 8192。谢谢!
      【解决方案4】:

      花了很多时间在这上面,我终于弄明白了。对 Nginx 和对等点重置连接有很多引用。其中大多数似乎与PHP有关。我找不到特定于 Nginx 和 uwsgi 的答案。

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

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

      配置uwsgi的方法有很多种,我碰巧用了一个.ini文件。所以在我的 .ini 文件中我尝试了:

      buffer-size=65535
      

      这解决了问题。你可以根据口味调整它。也许从最大值开始,然后再返回,直到你有一个可以接受的值,或者把它留在最大值。

      这很令人沮丧,因为在 uwsgi 方面没有错误。

      【讨论】:

      • 既然错误说明了关于从上游读取响应头的内容,那么不应该是关于上游 HTTP 响应头字节大小,而不是 HTTP 请求头字节大​​小吗?
      • 很多标题或来自文档,uwsgi-docs.readthedocs.org/en/latest/Options.html#buffer-size,还有大查询字符串。
      • 在我的例子中,工作参数是你提到的 php.ini 中的output_buffering = 65535,祝您服务愉快!!!
      • 我使用 gunicorn(Django) + nginx + docker 并想更改我的缓冲区大小值,如何实现?
      • 真的好用,我输入/etc/uwsgi/sites/xxx.ini,这个值我已经重启了uwsgi服务,如果是django和python,谢谢贡献
      【解决方案5】:

      --post-buffering 32768 按照这里的建议(但不鼓励)为我工作NGINX + uWSGI Connection Reset by Peer

      目前我没有时间进一步研究它(快速原型制作模式:),但由于我花了很多时间才找到这个 hack,因此可能值得在这里发布。

      【讨论】:

        【解决方案6】:

        当我们收到(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

        【讨论】:

          【解决方案7】:

          你需要重新安装PHP:

          apt-get install --reinstall php5-fpm
          

          【讨论】:

          • 如何重新安装 PHP 来解决这个问题?
          • 我相信这个答案与@eduan-lenine 的答案有关。不影响任何事情。另外,apt-get install --only-upgrade php5-fpm 给了我php5-fpm is already the newest version.
          【解决方案8】:

          我遇到了同样的 nginx 错误,而且 uwsgi 日志中也没有任何信息。问题在于,在某些情况下,应用程序并未按照http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html 中的建议使用整个请求正文:

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

          当然,这对你来说不是问题,但它可能对其他遇到相同 nginx 错误的人有用。

          【讨论】:

            猜你喜欢
            • 2012-03-27
            • 2019-02-02
            • 2019-03-29
            • 2013-03-13
            • 2018-10-15
            • 2019-04-30
            • 2016-06-21
            • 1970-01-01
            • 2014-10-27
            相关资源
            最近更新 更多