+
95
-

回答

首先要明确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进程的执行时间。

网友回复

我知道答案,我要回答