首先要明确502的错误是怎么出现的,我们先看看nginx+php-fpm的请求流程图,如下:
如上图所示,nginx将浏览器的请求转发给后端的php-fpm进程进行处理,后端的php-fpm进程数量和请求处理次数可以在php-fpm.conf中max_children或者max_requests 进行设置。
那么如果php-fpm进程执行php代码的时间过长,那么nginx将新的请求发给php-fpm的时候,由于后端的php-fpm都在忙,就会造成没人处理改请求,nginx就会抛出502错误,还有一种情况就是nginx在浏览器第一次请求的时候,会指定将该浏览器的请求指定给后端的一个php-fpm进程,如果该进程执行php代码时间过长,也会导致无法处理新请求而抛出502错误。
好了,知道原因后那怎么解决这个问题呢?
1、增加php-fpm进程数量
一般情况下php-fpm进程数量可以按照内存计算,比如说1G设置64个,2G设置128个。
还可以通过查看当前的php-fpm进程数是否够用来决定要不要增加,查看命令为:netstat -napo |grep "php-fpm" | wc -l
如果实际使用的“php-fpm进程数”接近预设的“php-fpm进程数”,那么,说明“php-fpm进程数”不够用,需要增大。
修改方法:
打开php-fpm.conf中的找到max_children项,进行设置,另外max_requests 表示一个php-fpm进程的最大处理请求数,也可以设置大一些。
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.系统架构调整
建议将耗时的操作通过异步队列的方式处理,缩短php进程的执行时间。
网友回复