nginx错误“从上游读取响应头时,recv()失败(104:对等连接重置)”


44

我有一台服务器可以正常工作,直到2013年10月3日上午10:50,该服务器开始间歇性地向客户端返回“ 502 Bad Gateway”错误。

在5个浏览器请求中,大约有4个成功,但在502中,约有五分之一失败。

Nginx错误日志包含数百种此类错误;

2013/10/05 06:28:17 [error] 3111#0: *54528 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 66.249.66.75, server: www.bec-components.co.uk  request: ""GET /?_n=Fridgefreezer/Hotpoint/8591P;_i=x8078 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.bec-components.co.uk"

但是,PHP错误日志不包含任何匹配的错误。

有没有一种方法可以使PHP给我更多有关为何重置连接的信息?

这是nginx.conf;

user              www-data;
worker_processes  4;
error_log         /var/log/nginx/error.log;
pid               /var/run/nginx.pid;

events {
   worker_connections  1024;
}

http {
  include          /etc/nginx/mime.types;
  access_log       /var/log/nginx/access.log;

  sendfile               on;
  keepalive_timeout      30;
  tcp_nodelay            on;
  client_max_body_size   100m;

  gzip         on;
  gzip_types   text/plain application/xml text/javascript application/x-javascript text/css;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";

  include /gvol/sites/*/nginx.conf;

}

这是.conf该网站的;

server {

  server_name   www.bec-components.co.uk bec3.uk.to bec4.uk.to bec.home;
  root          /gvol/sites/bec/www/;
  index         index.php index.html;

  location ~ \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires        2592000;   # 30 days
    log_not_found  off;
  }

  ## Trigger client to download instead of display '.xml' files.
  location ~ \.xml$ {
    add_header Content-disposition "attachment; filename=$1";
  }

   location ~ \.php$ {
      fastcgi_read_timeout  3600;
      include               /etc/nginx/fastcgi_params;
      keepalive_timeout     0;
      fastcgi_param         SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      fastcgi_pass          127.0.0.1:9000;
      fastcgi_index         index.php;
   }
}

## bec-components.co.uk ##
server {
   server_name   bec-components.co.uk;
   rewrite       ^/(.*) http://www.bec-components.co.uk$1 permanent;
}

那天发生了什么变化?更新了您的应用程序还是PHP?你的申请是什么?您是否在php-fpm中启用了调试功能?
Pothi Kalimuthu 2013年

那天什么都没改变。服务器配置未更改,任何PHP脚本也未更改。它没有磁盘空间不足。我的应用程序只是一组PHP脚本。我没有用php-fpm,我只是在php-fastcgi做事而已php-cgi -b 127.0.0.1:9000。它已经连续三年没有故障了。我无法弄清楚为什么它导致了这个问题。
Nigel Alderton

最近我遇到了类似的问题,nginx在从上游读取响应标头时抱怨对等方重置连接,在我的情况下,这是uWSGI才是真正的问题,重新启动uWSGI为我解决了该问题,原因是它是单独发生的问题。
APZ 2014年

您的上游服务(php-cgi -b 127.0.0.1:9000)间歇性失败,可能是由于流量增加和资源不足所致。
LinuxDevOps

Answers:


22

我总是相信我的网络服务器是否告诉我: 502 Bad Gateway

  • 您的fastcgi / nginx-进程的正常运行时间是多少?
  • 您是否监视网络连接?
  • 您可以确认/拒绝当天那一天的访客数变化吗?

这是什么意思:

  • nginx无法访问您的fastcgi-process; 要么变慢要么根本不对应。错误的网关意味着:nginx无法fastcgi_pass到定义的资源127.0.0.1:9000;在那非常具体的时刻

  • 您的初始错误日志说明了这一切:

recv() failed 
    -> nginx failed

(104: Connection reset by peer) while reading response header from upstream, 
    -> no complete answer, or no answer at all
upstream: "fastcgi://127.0.0.1:9000", 
    -> who is he, who failed???

从我的观点来看,我建议:

  • 重新启动fastcgi_process /服务器
  • 检查您的访问日志
  • 启用调试日志

好。我的网络服务器告诉我什么?
奈杰尔·奥尔德顿

看到我的编辑(这是什么意思)
那边那个家伙

2
我知道了,因此Gateway在这种情况下是PHP服务器。谢谢。
Nigel Alderton

restart your fastcgi_process / server是什么帮助了我,而不是
realtebo

11

我知道这个主题很旧,但是仍然偶尔会弹出,因此,在网络上寻找答案时,我想到了以下三种可能性:

  1. 编程错误有时会导致php-fpm出现段错误,这又意味着与nginx的连接将被切断。通常,这至少会留下一些日志和/或核心转储,可以对其进行进一步分析。
  2. 由于某种原因,PHP无法编写会话文件(通常是:)session.save_path = "/var/lib/php/sessions"。这可能是错误的权限,错误的所有权,错误的用户/组或更深奥的/晦涩的问题,例如该目录(甚至是完整的磁盘!)上的inode用完了。通常,这不会留下很多核心转储,甚至在PHP错误日志上也不会留任何东西。
  3. 调试起来更加棘手:扩展名行为不正常(有时会达到某种内部限制,或者是并非一直触发的错误),segfaulting,并导致php-fpm进程关闭—从而关闭了与nginx的连接。通常的罪魁祸首是APC,memcache / d等(在我的情况下是New Relic扩展),因此这里的想法是关闭每个扩展,直到错误消失。

+1在我的情况下是#1-编程错误。
Nimbuz '16

我们遇到了此错误,并且禁用了New Relic APM PHP扩展后发现了一个更具体的错误,该错误使我们可以跟踪问题:[29-Jan-2018 16:47:48 UTC] PHP致命错误:允许的内存大小为805306368字节在第142行[供应商/magento/module-configurable-product/Pricing/Price/ConfigurableRegularPrice.php中用尽(尝试分配262144字节)[29-Jan-2018 16:47:48 UTC] PHP致命错误:允许的内存大小805306368在第0行的Unknown中用尽了字节(尝试分配323584字节)我的猜测是New Relic在“ Unknown”路径上阻塞了。
Erik Hansen

7

保持得到以及。opcache如果使用内存限制,则可以通过增加内存限制来解决(替换APC)。每当缓存太满时,PHP-FPM似乎都会断开连接。这也是shgnInc的答案在短时间内修复它的原因。

因此,找到文件/etc/php5/fpm/php.ini(或分发中的等效文件)并将其增加到memory_consumption您的站点需要的任何级别。禁用opcache也可以。

[opcache]
opcache.memory_consumption = 196 


2

在我遇到相同问题的情况下,我只重新启动了php-fpm服务即可解决。

sudo service php5-fpm restart

有时由于大量请求而发生此问题。默认情况下pm.max_requests,php5-fpm中的值可能是100或更低。

要解决它,增加价值取决于您网站的要求,例如500。

之后,您必须重新启动服务


2

就我而言,禁用xdebug扩展确实有所帮助。


同上,在我的情况下,我为断点设置了条件,并且在那一刻我禁用了breackpoint,错误消失了。
roman204

1

我只是有一个类似的问题:

您在端口9000上连接到php-fpm。(fastcgi://127.0.0.1:9000)

我的服务器上Ubuntu的标准配置为:

/etc/php/7.0/fpm/pool.d/www.conf:

listen = /run/php/php7.0-fpm.sock

您必须将其更改为:

listen = 0.0.0.0:9000

就我而言,我确实在1 1/2个月前更新了服务器,并用默认值覆盖了costom配置。现在重新启动了php-fpm,此错误开始延迟生效。



1

对我来说是因为php-fpm达到了max_children极限。有关池的php-fpm日志为我指明了正确的方向


0

如果PHP-FPM进程超出其分配的内存限制,也可能会出现此问题。发生这种情况时,NGINX和PHP-FPM之间的连接被切断,NGINX返回502 Bad Gateway。PHP-FPM进程内存限制由memory_limit变量控制。可以php_admin_value[memory_limit]在PHP-FPM配置文件中进行设置。

重要的是要注意,内存限制适用于每个脚本。使用nPHP-FPM进程,总内存使用量可达memory_limit * n。确保检查机器是否有足够的内存空间!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.