本文介绍在ECS实例上使用浏览器访问网站时,提示“Nginx 502 Bad Gateway”错误的问题原因和解决方案。
问题原因
“Nginx 502 Bad Gateway”错误表示访问请求的php-cgi进程已经开始执行,但是由于读取资源失败等原因没有执行完毕,导致php-cgi进程终止。
常见的问题原因如下:
解决方案
您可以参考如下操作进行逐一排查。
本文中/usr/local/php/etc/php-fpm.conf
、/usr/local/php/etc/php.ini
、/etc/nginx.conf
等配置文件需要根据安装环境不同来更换路径,请以您的实际部署安装的软件路径为准。
磁盘空间不足
如果访问网站时,直接提示“Nginx 502 Bad Gateway”错误,可能是ECS实例的磁盘空间不足导致。您需要执行如下步骤进行排查:
远程登录ECS实例。
具体操作,请参见连接方式概述。
执行
df -h
命令,查看是否磁盘空间是否充足。如果磁盘空间充足,则该问题不是由于磁盘空间问题导致。
如果磁盘空间不足,则您需要扩容云盘,具体操作,请参见云盘扩容指引。
php-cgi进程数不够用
如果在已安装Nginx且可以正常访问网站的环境中,运行一段时间才后出现“Nginx 502 Bad Gateway”错误,则可能是php-cgi进程数不够用导致。
此时,您需要修改/usr/local/php/etc/php-fpm.conf
配置文件,将文件中pm.max_children
参数的值调高,即增加php-cgi进程数。
PHP执行超时
如果访问网站时,直接提示“Nginx 502 Bad Gateway”错误,可能是PHP执行超时导致。
此时,您需要修改/usr/local/php/etc/php.ini
配置文件,将文件中max_execution_time
参数的值改为300
。如下图所示,您需要将该参数的值从30
修改为300
。
php-cgi进程异常中断
如果访问网站时,直接提示“Nginx 502 Bad Gateway”错误,可能是php-cgi进程异常中断导致。您需要执行如下步骤进行法排查:
远程登录ECS实例。
具体操作,请参见连接方式概述。
依次执行如下命令,查看php fastcgi的进程数和
pm.max_children
参数的值。netstat -anop | grep php-cgi | wc -l netstat -anpo | grep php-fpm | wc -l
执行如下命令,查看当前进程。
ps aux | grep php-fpm
回显示例如下,查看fastcgi、php-fpm的进程数。如果进程数大于或等于5个,则表示需要增加进程数。
修改
/usr/local/php/etc/php-fpm.conf
配置文件中的相关参数。将
pm.max_children
参数的值修改为5
,表示支持5个进程。说明pm.max_children
最多支持设置5个进程。按照每个进程20 MB内存,最多支持100 MB,即资源消耗时间为1分钟。如果pm.max_children
增多,则php-cgi的进程增多,进程处理速度就会加快、排队的请求就会变少。但是设置pm.max_children
也需要根据服务器的性能进行设定,一台服务器正常情况下,每一个php-cgi进程所耗费的内存在20 MB左右,您需要根据实际购买的服务器内存来决定pm.max_children
的值。将
request_terminate_timeout
参数的值修改为60
,表示内存回收机制为1分钟(60秒)。说明request_terminate_timeout
的值可以根据服务器的性能进行设定,常见设置为60秒。通常服务器性能越好,您可以设置的值越高。
如果PHP进程的执行时间超过了Nginx的等待时间,则您需要适当增加Nginx的
/etc/nginx.conf
配置文件中fastcgi_connect_timeout
,fastcgi_send_timeout
和fastcgi_read_timeout
参数的timeout
时间,您需要修改的参数如下: