解决由fastcgi通讯模式引起的502 Bad Gateway问题

最近把服务器系统切换为debian12,配置好环境以后,发现页面偶尔会出现Nginx报502 Bad Gateway错误,所以记录一下解决办法。

问题原因

首先,我们要搞清楚 http(s) 的请求流程,一般情况下,提交请求之后,Nginx 会直接把请求转交给 php-fpm,而 php-fpm 再分配 php-cgi 进程来处理相关的请求,然后再依次返回,最后由 nginx 把结果反馈给客户端浏览器。Nginx 报 502 Bad Gateway 错误就是 FastCGI 遇到了问题,我们需要逐个来排查。
先看看 Linux 服务器资源是否足够,很多前辈们都没有提及这点,有些时候 Nginx 报 502 Bad Gateway 错误就是由于服务器的 CPU 和内存资源不够导致的,这个升级服务器就好了。
接着排查 PHP FastCGI 进程数量是否够用,可以使用下列代码:

netstat -anpo | grep "php-cgi"| wc -l

如果实际使用的“FastCGI 进程数”接近预设的“FastCGI 进程数”,那么,说明“FastCGI 进程数”不够用,需要增大,需要调整 max_children 的值。

解决办法

查看 PHP 程序的执行时间是否超过了 Nginx 的等待时间,可以增加 nginx.conf 配置文件中 FastCGI 的 timeout 时间,例如:

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

这里默认就是300,我可以将配置参数改为

fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;

另外我们可以将

fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;

改为

fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;

其次还要修改 php.ini 中的 memory_limit=64M(128M也可以,根据需求修改就行),重启 Nginx,看问题是否解决。

基本上需要排查的地方就是这几处,其它还有个“request_terminate_timeout”的值,只有在服务器资源特别丰富的时候,建议大家将其设为“0”,其它就不做处理了。上面提到的“max_children”的值也不是越大越好,要看服务器内存资源的,一般每个占用在 20MB,修改时别把内存用超了。

问题解决

© 版权声明
THE END
喜欢就支持一下吧
点赞6赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情

    暂无评论内容