李涛自留地
回到顶部
首页 > 建站 > 宝塔面板网站502 Bad Gateway报错的N种原因和解决方法

宝塔面板网站502 Bad Gateway报错的N种原因和解决方法

文章目录

昨天下午有个客户的网站突然报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问题。


若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。