+
80
-

请问如何解决nginx+php-fpm频繁出现502 bad gateway错误的问题?

最近我的网站在执行耗时操作的时候,老是出现502错误,请问这个问题怎么优化解决?


网友回复

+
0
-

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

我知道答案,我要回答