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

环境是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错误日志中没有信息。

user3470130 asked 2020-08-09T00:53:49Z
6个解决方案
81 votes

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

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

如果您打算接收带有许多标头的大型请求,则可以将此值增加到64k(65535)。

配置uwsgi的方法有很多,我碰巧使用了.ini文件。 因此,在我的.ini文件中,我尝试了:

buffer-size=65535

这解决了问题。 您可以调整口味。 也许从最大值开始,然后再进行计算,直到获得可接受的值为止,或者只是将其保留为最大值。

很难找到答案,因为在uwsgi方面没有错误。

user3470130 answered 2020-08-09T00:54:18Z
4 votes

我们只是将php.ini中的属性“ output_buffering”值增加到一个更大的值,例如65535或另一个合适的值。

Eduan Lenine answered 2020-08-09T00:54:39Z
3 votes

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

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

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

Rinas answered 2020-08-09T00:55:08Z
0 votes

通常,当我们收到类似keepalive_timeout的消息时,我们可以将这种错误归咎于上游。

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

我怀疑修改缓冲区大小是否会成功。 基本上,该命令会更改缓存响应头的缓冲区大小。 这将在响应头太大时生效,在这种情况下,我们会收到一条消息keepalive_timeout,这与connection reset by peer完全不同。

由于这种错误是随机触发的,因此建议您在与上游对话时检查nginx是否使用keepalive_timeout。 如果是这种情况,空闲可能超时时,上游服务器可能会重置连接,而nginx不知道该连接已被删除,因此使用相同的连接转发请求。

据我所知,目前还没有优雅的解决方案。 您可以重试或为nginx中的上游连接池设置keepalive_timeout值,以避免出现此问题。

参考:

Apache HttpClient临时错误:NoHttpResponseException

[HTTP://T engine.淘宝.org/document/HTTP_upstream_keepalive_timeout.HTML]

bjrara answered 2020-08-09T00:56:01Z
0 votes

--post-buffering 32768如建议的那样(不鼓励)在这里为我工作,由Peer提供的NGINX + uWSGI Connection Reset

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

Łukasz Kidziński answered 2020-08-09T00:56:26Z
-8 votes

您需要重新安装PHP:

apt-get install --reinstall php5-fpm
Lebnik answered 2020-08-09T00:56:45Z
translate from https://stackoverflow.com:/questions/22697584/nginx-uwsgi-104-connection-reset-by-peer-while-reading-response-header-from-u