nginx 502 原因总结

第一次写博客,不是很会写,还请见谅!

先说一下 http 的请求流程:
用户–>服务器–>nginx–>php-fpm–>php-cgi–>php-fpm–>nginx–>服务器–>用户

出现问题的点一般就是在 nginx 和php-fpm两点出现。
1.查看当前的 php fastcgi 的进程。
netstat -anpo | grep "php-cgi"| wc -l
注:这个进程数就是php-fpm.conf 里面的“max_children”的值
如果查到的php-cgi进程数,接近预设值,说明 “max_children”这个值需要加大了。

平均每个php-cgi的进程大概占用20M左右,根据自己服务器的内存情况进行设置。
ps --no-headers -o “rss,cmd” -C php-fpm | awk ‘{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,“M”) }’ #查看每个php占用多少内存
内存/平均占用内存数=max_children的值
2.php运行时间超过nginx 的等待时间(php内存不足)。
增加nginx.conf 文件的 fastcgi的timeout时间。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

还有php.ini 里面的
max_execution_time = 300; #根据程序执行情况来设定。
memory_limit=128M; #根据程序执行情况来设定。

然后重启nginx+php就可以了。

  1. 我们服务器是 lnmp 基础环境,高并发的时候经常出现 502 ,然后一些接口很卡,cpu 降低,网卡流量变少,持续几十秒,就恢复。
    原来,php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。
    因为php是把请求轮询给每个children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间被关闭。
    在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降至很低(不用处理php,更不用执行sql),而负载会升至很高(关闭和开启children、nginx等待php-fpm),
    网卡流量也降至很低(nginx无法生成数据传输给客户端)

可以增加max_children和max_requests的值来调整。(更具服务器的实际情况,来设置)我们的服务器配置比较高,所以我就设置的大一点。
max_children = 6000
max_requests = 600
然后重启php-fpm

  1. 增加缓冲区容量大小
    将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。
    查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修改办法增加了缓冲区容量大小设置,502问题彻底解决。
    后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。

  2. request_terminate_timeout
    如果主要是在一些post或者数据库操作的时候出现502这种情况,而不是在静态页面操作中常见,那么可以查看一下php-fpm.conf设置中的一项:
    request_terminate_timeout

这个值是max_execution_time,就是fast-cgi的执行脚本时间。
0s为关闭,就是无限执行下去。(当时装的时候没仔细看就改了一个数字)

优化fastcgi中,还可以改改这个值5s 看看效果。
php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。

Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关。

php-fpm.conf有两个至关重要的参数,一个是max_children,另一个是request_terminate_timeout,但是这个值不是通用的,而是需要自己计算的。在安装好使用过程中出现502问题,一般是因为默认php-cgi进程是5个,可能因为php-cgi进程不够用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值