第一次写博客,不是很会写,还请见谅!
先说一下 http 的请求流程:
用户–>服务器–>nginx–>php-fpm–>php-cgi–>php-fpm–>nginx–>服务器–>用户
出现问题的点一般就是在 nginx 和php-fpm两点出现。
1.查看当前的 php fastcgi 的进程。
注:这个进程数就是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就可以了。
- 我们服务器是 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
-
增加缓冲区容量大小
将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。
查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修改办法增加了缓冲区容量大小设置,502问题彻底解决。
后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。 -
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值适当增加。