服务器迁移后 Nginx 报 502 Bad Gateway,通常是因为 Nginx 无法连接到后端服务(如 PHP-FPM、Node.js 或上游服务器)。修复重点在于检查后端服务状态、Nginx 配置中的 upstream 地址或 Socket 权限,以及防火墙规则。
先说结论:迁移后 502 错误多为后端服务未启动、配置路径变更或权限不足导致,需按顺序排查服务状态与网络连接。
- 先确认:后端服务(如 PHP-FPM)是否正在运行且监听正确端口或 Socket 文件。
- 先处理:核对 Nginx 配置中的 upstream 地址、Socket 路径及文件权限是否与迁移后环境一致。
- 再验证:通过 curl 请求测试状态码,并检查 Nginx 错误日志确认连接成功。
命令速用版
以下命令用于快速检查服务状态、配置语法及网络连接,适用于大多数 Linux 发行版。
# 检查 Nginx 配置语法
nginx -t
# 查看后端服务状态(以 PHP-FPM 为例)
systemctl status php-fpm
# 查看 Nginx 错误日志尾行
tail -f /var/log/nginx/error.log
# 测试本地请求返回状态码
curl -I http://127.0.0.1为什么会这样
502 Bad Gateway 表示 Nginx 作为网关或代理,从上游服务器收到了无效响应。
服务器迁移后,IP 地址、文件系统路径、用户权限或防火墙规则往往发生变化。如果 Nginx 配置中写死了旧 IP,或者 Socket 文件权限导致 Nginx 用户无权访问,连接就会失败。此外,后端服务可能未随系统启动,导致 Nginx 重启后无法找到上游服务。
分步处理
按以下顺序排查,每步确认后在进行下一步,避免盲目修改配置。
1. 检查后端服务状态
确认后端服务(如 PHP-FPM、Node.js、Tomcat)是否运行。如果服务未启动,Nginx 无法建立连接。
操作:执行 systemctl status 服务名。
验证:状态应显示 active (running)。
风险:勿强制重启生产数据库等依赖服务。
2. 核对 Nginx 配置中的上游地址
迁移可能导致 IP 变化或 Socket 路径变化。检查 proxy_pass 或 fastcgi_pass 指令。
操作:查看 /etc/nginx/conf.d/ 或 nginx.conf 中的配置。
验证:确保 IP 为新服务器内网 IP,或 Socket 路径与实际文件一致。
风险:修改配置后必须执行 nginx -t 测试语法。
3. 检查 Socket 文件权限
若使用 Unix Socket 通信,Nginx 运行用户(如 www-data 或 nginx)必须有读写权限。
操作:执行 ls -l /path/to/socket.sock 查看权限。
验证:确保 Nginx 用户属于 socket 文件所属组,或权限设置为 660/666。
风险:权限过开(777)存在安全风险,建议仅开放给必要用户组。
4. 检查防火墙与 SELinux
迁移后防火墙可能重置,SELinux 可能阻止新路径的访问。
操作:检查 firewalld 或 ufw 状态,查看 SELinux 日志 /var/log/audit/audit.log。
验证:确保后端端口在本地访问不受限,SELinux 上下文正确。
风险:临时关闭 SELinux 可辅助排查,但生产环境建议配置正确策略而非永久关闭。
怎么验证是否生效
修复配置后,需通过 HTTP 状态码和日志确认连接恢复。
1. 检查 HTTP 状态码
使用 curl 请求本地服务,观察返回头。
命令:curl -I http://127.0.0.1
成功标志:第一行显示 HTTP/1.1 200 OK 或业务预期状态码,而非 502。
2. 检查错误日志
观察 Nginx 错误日志是否不再出现 upstream 相关报错。
命令:tail -f /var/log/nginx/error.log
成功标志:请求期间无 connect() failed 或 upstream prematurely closed connection 错误。
常见坑
以下场景在迁移后极易引发 502,操作时需特别谨慎。
- Socket 路径变更:不同发行版或版本的 PHP-FPM 默认 Socket 路径可能不同(如
/run/php-fpm.sock与/var/run/php.sock),需以实际文件为准。 - 用户组不匹配:Nginx 进程用户与后端服务 Socket 文件所属组不一致,导致 Permission denied。
- 监听地址限制:后端服务仅监听 127.0.0.1,但 Nginx 配置指向了局域网 IP,或反之。
- SELinux 拦截:开启 SELinux 的系统(如 CentOS/RHEL)可能阻止 Nginx 访问非标准端口或文件,需检查
setsebool设置。
常见问题
502 Bad Gateway 和 504 Gateway Timeout 有什么区别?
502 表示上游服务器返回了无效响应或连接被拒绝,504 表示上游服务器在规定时间内未响应。
迁移后 PHP 网站报 502,重点查哪里?
重点检查 PHP-FPM 服务是否启动,以及 Nginx 配置中 fastcgi_pass 指向的 Socket 路径是否存在且权限正确。
重启 Nginx 后 502 消失,过一会又出现,是什么原因?
可能是后端服务进程崩溃重启,或连接数耗尽导致无法建立新连接,需检查后端服务日志及资源限制。
参考来源
- Nginx 官方文档,ngx_http_proxy_module,关于 502 错误定义,URL: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
- PHP-FPM 官方文档,关于 Socket 配置与权限,URL: https://www.php.net/manual/en/install.fpm.configuration.php