nginx 502 recv() failed (104: Connection reset by peer) while reading response header from upstrea

上周维护的一个网站一直出现宕机 之前一直是运行的挺好的  不管怎么访问都是502 去服务器看看错误日志 

tail -f /var/log/nginx/error.log

一直出现以下错误 第一反应这个以前应该是服务器的问题毕竟以前也遇到过 什么memory_limit 也调整了 max_children也调整了就是没好难道是服务器坏了?最后花了十几分钟重装了一下系统发现然而并没什么用,这下就蒙蔽了 google了很多答案都没有头绪  rds也能连接

2018/04/15 08:27:51 [error] 11128#0: *119439 recv() failed (104: Connection reset by peer) while
 reading response header from upstream, client: 47.93.90.175, server: , requ
est: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "39.104.55.193:80"           
2018/04/15 10:36:23 [error] 11128#0: *140248 recv() failed (104: Connection reset by peer) while
 reading response header from upstream, client: 87.147.199.113, server: , re
quest: "HEAD http://47.96.130.217:80/phpmyadmin/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000"
, host: "47.96.130.214" 

想想是不是哪里疏忽了 没错rds没有重启 服务器没有重启 于是去做了一下最后的尝试 重启服务器没效果 重启rds很神奇的事发生了 网站居然可以访问了 最后有句mmp不知当讲不当讲 原来rds也有不要谱的时候 还是重启大法好 搞了半天不如一个重启来的实在

接下来整理下这个错误出现的几个问题 均来自网上网友归纳

1. php.ini的memory_limit 过小(如果有个别php程序进程需要占用极大内存时这个必须注意)

2. php-fpm.conf中max_children或者max_requests  设置不合理(设置过小会因为没有足够的cgi进程处理请求,设置过大会出现一会儿有响应正常,一会儿等很久才有响应的情况,一般情况下children按 照内存计算,比如说1G设置64,2G128。这个根据实际情况自行调整。另外查看当前的PHP FastCGI进程数是否够用的命令为:netstat  -anpo |grep “php-cgi” | wc -l   如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。)

3. 查看nginx错误日志,发现 pstream sent too big header while reading response  headerfrom upstream ,则检查client head buffer,fastcgi buffer  size是否过小,可设置为32K

4. php程序执行时间过长而超时,检查nginx和fastcgi中各种timeout设置。(nginx 中的  fastcgi_connect_timeout 300;fastcgi_send_timeout 300  :fastcgi_read_timeout300; keepalive_timeout ;  php-fpm中的request_terminate_timeout,php.ini中的max_execution_time)


5. php-fpm有一个参数 max_requests ,该参数指明了每个children最多处理多少个请求后便会被关闭。在大量处理请求下,如果该值设置过小会导致children频繁的自杀和建立而浪费 大量时间,若所有的children差不多都在这个时候自杀,则重建前将没有children响应请求,于是出现502  。可以将该值设置大一些或者是0[无限]。

6 将ip监听由sock方式改为端口监听



如果你服务器并发量非常大,那只能先增加机器,然后按以下方式优化会取得更好效果;但如果你并发不大却出现502,一般都可以归结为配置问题,脚本超时问题

1.php-fpm进程数不够用

使用netstat -napo |grep "php-fpm" | wc -l查看一下当前fastcgi进程个数,如果个数接近conf里配置的上限,就需要调高进程数。

但也不能无休止调高,可以根据服务器内存情况,可以把php-fpm子进程数调到100或以上,在4G内存的服务器上200就可以。

2. 调高调高linux内核打开文件数量

可以使用这些命令(必须是root帐号)

echo 'ulimit -HSn 65536'>> /etc/profile

echo 'ulimit -HSn 65536'>> /etc/rc.local

source /etc/profile

 3.脚本执行时间超时

如果脚本因为某种原因长时间等待不返回,导致新来的请求不能得到处理,可以适当调小如下配置。

nginx.conf里面主要是如下

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

php-fpm.conf里如要是如下

request_terminate_timeout =10s

4.缓存设置比较小

修改或增加配置到nginx.conf

proxy_buffer_size 64k;
proxy_buffers  512k;
proxy_busy_buffers_size 128k;

5. recv()failed (104: Connection reset by peer) while reading response header fromupstream(先重启数据库试试)

可能的原因机房网络丢包或者机房有硬件防火墙禁止访问该域名

但最重要的是程序里要设置好超时,不要使用php-fpm的request_terminate_timeout,

最好设成request_terminate_timeout=0;

因为这个参数会直接杀掉php进程,然后重启php进程,这样前端nginx就会返回104: Connection reset by peer。这个过程是很慢,总体感觉就是网站很卡。

May 01 10:50:58.044162[WARNING] [pool www] child 4074, script'/usr/local/nginx/html/quancha/sameip/detail.php' execution timed out(15.129933 sec), terminating
May 01 10:50:58.045725 [WARNING] [pool www] child 4074 exited on signal 15SIGTERM after 90.227060 seconds from start
May 01 10:50:58.046818 [NOTICE] [pool www] child 4082 started

说一千道一万最重要的就是程序里控制好超时,gethostbyname、curl、file_get_contents等函数的都要设置超时时间。

另一个就是多说,这个东西是增加了网站的交互性,但是使用的多了反应就慢了,如果你网站超时且使用了多说是,可以关闭它。

修改完各项参数一定要记得重启nginx php-fpm

我使用的是ubuntu 

service nginx restart
service php7.0-fpm restart
nginx的参数调优有很多需要我们去做的 有机会需要尝试各种参数带来的性能变化



你可能感兴趣的:(linux,php)