宝塔面板网站502 Bad Gateway报错的N种原因和解决方法
- 2026年7月2日
- 186 次
昨天下午有个客户的网站突然报502错误,后台还能打开但前端打不开。排查了一圈发现是php-fpm进程挂了。把完整的排查流程记录下来,宝塔用户遇到502时照着做就行。
\n
\n
什么是502错误?
502 Bad Gateway是HTTP状态码,意思是"网关错误"。在宝塔面板的场景下,通常是Nginx无法正确获取到后端PHP-FPM返回的响应。简单说就是:Nginx这个"前台"找不到PHP-FPM这个"后台"了。
排查第一步:检查PHP-FPM状态
登录宝塔面板,进入"软件商店" → "已安装",找到PHP(你网站使用的版本),查看运行状态:
# 或者用命令行
/etc/init.d/php-fpm-74 status
# 根据版本替换数字,74代表PHP 7.4
如果显示"已停止"或"未运行",那就找到了原因——PHP-FPM挂了。
常见原因和解决方法
### 原因1:PHP-FPM进程崩溃或内存不足
这是最常见的原因。PHP-FPM会占用大量内存,尤其是运行WordPress这种框架时。
现象: 服务器内存快满了,PHP-FPM被OOM Killer杀掉。
排查:
# 查看内存使用
free -h
# 查看最近被OOM Killer杀掉的进程
dmesg | grep -i "out of memory"
# 查看PHP-FPM进程数
ps aux | grep php-fpm | wc -l
解决:
- 临时:重启PHP-FPM
/etc/init.d/php-fpm-74 restart
- 长期:增加服务器内存或优化PHP-FPM配置
打开宝塔面板 → 软件商店 → PHP → 设置 → 配置修改,调整以下参数:
; 减少子进程数量(根据内存调整)
pm.max_children = 30
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
计算公式: max_children = (可用内存 - 系统保留) / 每个PHP进程平均内存
一般每个PHP进程占用30-50M内存。2G内存的服务器建议max_children设15-20。
### 原因2:PHP-FPM的socket文件丢失
有时候PHP-FPM重启后,socket文件没有正确创建,导致Nginx找不到后端。
排查:
# 检查socket文件是否存在
ls -la /tmp/php-cgi-74.sock
# 路径可能因版本而异,宝塔一般用 /tmp/php-cgi-XX.sock
# 检查Nginx配置中的fastcgi_pass指向
cat /www/server/panel/vhost/nginx/你的域名.conf | grep fastcgi_pass
解决: 重启PHP-FPM即可重新生成socket文件。
### 原因3:Nginx配置错误
如果你最近修改了Nginx配置,可能配置有误导致502。
排查:
# 测试Nginx配置
nginx -t
# 查看Nginx错误日志
tail -100 /www/server/nginx/logs/error.log
常见的Nginx配置问题:
# 错误示例:fastcgi_pass指向了不存在的路径
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # 如果PHP-FPM用的是socket,这里就错了
fastcgi_index index.php;
include fastcgi_params;
}
# 正确示例:使用socket
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi-74.sock; # 根据实际版本修改
fastcgi_index index.php;
include fastcgi_params;
}
### 原因4:磁盘空间满
磁盘满了PHP-FPM无法写入临时文件,也会报502。
df -h
如果看到磁盘使用率接近100%,清理后再重试。具体清理方法看我之前写的《df -h磁盘空间满了怎么办》那篇。
### 原因5:PHP执行超时
如果某个PHP脚本执行时间过长(超过服务器限制),Nginx会主动断开连接报502。
排查:
# 查看PHP超时设置
php -i | grep max_execution_time
php -i | grep max_input_time
php -i | | grep memory_limit
解决: 在宝塔面板中,进入PHP设置 → 配置修改:
max_execution_time = 300
max_input_time = 300
memory_limit = 256M
注意: 不要无限制调大,否则一个慢查询可能拖死整个服务器。建议设置合理阈值,配合OPcache使用。
### 原因6:SSL证书问题
如果你用的是HTTPS,SSL配置错误也会导致类似502的错误。
# 检查SSL证书是否过期
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com /dev/null | openssl x509 -noout -dates
# 宝塔面板中重新申请或更新SSL证书
### 原因7:MySQL数据库连接失败
PHP-FPM连接不上MySQL,也会导致页面502。
# 检查MySQL状态
/etc/init.d/mysqld status
# 检查MySQL错误日志
tail -100 /www/server/data/hostname.err
# 或 /var/log/mysqld.log
# 查看MySQL连接数
mysql -e "SHOW STATUS LIKE 'Threads_connected';"
解决:
# 重启MySQL
/etc/init.d/mysqld restart
如果是连接数满了,调整MySQL配置:
# /etc/my.cnf
max_connections = 500
wait_timeout = 60
interactive_timeout = 60
快速排查流程图
遇到502时,按这个顺序检查:
502错误
├─ 1. df -h 磁盘满了? → 清理磁盘
├─ 2. PHP-FPM停止? → 重启PHP-FPM
├─ 3. socket文件丢失? → 重启PHP-FPM
├─ 4. Nginx配置错误? → nginx -t 检查配置
├─ 5. MySQL挂了? → 重启MySQL
├─ 6. 内存不足? → 调整PHP-FPM pm.max_children
└─ 7. 执行超时? → 调整max_execution_time
宝塔面板一键诊断工具
宝塔自带了诊断工具,可以辅助排查:
1. 进入宝塔面板 → 诊断页面
2. 运行"网站诊断"
3. 查看诊断结果
另外推荐安装"服务器监控"插件,实时查看PHP-FPM、Nginx、MySQL的状态,出问题第一时间收到告警。
预防建议
1. 定期监控磁盘空间:设置df -h告警脚本(参考上篇)
2. 限制PHP-FPM进程数:根据内存合理设置,不要太大也不要太小
3. 开启OPcache:在PHP设置中开启,大幅提升性能
4. 定期清理日志:配置logrotate自动轮转
5. 安装监控插件:及时发现异常
总结
502错误的本质是Nginx找不到后端。排查时按照"磁盘→PHP-FPM→Nginx配置→MySQL"的顺序逐一检查,90%的情况重启PHP-FPM就能解决。
但重启只是治标,找到根本原因才是长久之计。最常见的根本原因还是PHP-FPM进程数设置不合理,导致内存不足被OOM杀掉。调整pm.max_children参数,配合监控告警,就能避免大部分502问题。
若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。
- PHP中$this和::的如何使用?PHP中$this和::使用实例代码 2022-12-06
- 用PHP的if判断语句简单制作一个计算器 2022-06-21
- PHP处理文件路径函数pathinfo()怎么用?PHP处理文件路径函数pathinfo()使用实例 2022-11-15
- PHP中getimagesize()函数使用方法 getimagesize()函数有哪些内置参数? 2022-11-23
- ZblogPHP目录索引插件不生效问题及解决办法 2022-10-20
- 实现php关联数组的增删改查学习笔记 2021-04-12
