Linux + Nginx +PHP 网站无法访问,错误:502 Bad Gateway

其它 wes 6 hours ago (2026-09-18) 17 views
📑 本文导航

Nginx 502 Bad Gateway 含义

502 不是 Nginx 本身挂了,Nginx 已经正常运行,但是 Nginx 转发请求给后端服务(PHP-FPM / Node / Java / Python 应用)的时候,连不上后端、后端进程崩溃、返回无效响应,就抛出 502。

第一步:先看错误日志(最重要!)

# 查看nginx错误日志
tail -f /var/log/nginx/error.log

日志关键字对应原因:

  1. connect() failed (111: Connection refused)后端服务没启动 / 端口写错(最常见)
  2. connect() failed (13: Permission denied) → socket 权限不足 / SELinux 拦截
  3. upstream sent too big header → 后端响应头过大
  4. prematurely closed connection → 后端程序崩溃、被 OOM 内存杀手杀掉

第二步:检查后端服务(分两种场景)

场景 A:PHP 网站(使用 PHP-FPM)

  1. 查看 php-fpm 状态
systemctl status php-fpm
# 或者指定版本,如 php8.1-fpm
systemctl status php8.1-fpm

没运行就启动:

systemctl start php8.1-fpm
systemctl enable php8.1-fpm
  1. 核对 Nginx 配置里的 fastcgi_pass
# nginx站点配置
location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 这里路径必须和php-fpm的listen一致
    # 或者端口形式 fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

查看 php-fpm 监听:cat /etc/php/8.1/fpm/pool.d/www.conf | grep listen

  1. socket 权限问题(日志报 13 权限拒绝)
ls -l /run/php/php8.1-fpm.sock
# 修改属主为www-data
chown www-data:www-data /run/php/php8.1-fpm.sock

场景 B:反向代理(Node/Java/Gunicorn,proxy_pass)

nginx 配置示例:

location / {
    proxy_pass http://127.0.0.1:3000; #后端地址端口
    proxy_set_header Host $host;
}
  1. 直接测试后端能不能通:
curl http://127.0.0.1:3000

curl 报错 = 后端服务本身挂了,需要启动应用。 2. 检查后端进程是否监听端口:

netstat -tlnp | grep 3000
# 或者 ss -tlnp | grep 3000

第三步:系统资源排查(间歇性 502,忽好忽坏)

# 内存,看是否内存耗尽被OOM杀进程
free -m
# 磁盘满了也会502
df -h
# 看内核是否OOM杀死后端程序
dmesg | grep -i kill

第四步:超时 / 缓冲区调优(可选)

PHP-FPM 增加超时

http {
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;
}

proxy 反向代理增加超时

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_connect_timeout 300s;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    proxy_buffers 8 128k;
    proxy_buffer_size 128k;
}

改完校验语法,重载 nginx:

nginx -t
systemctl reload nginx

快速应急顺序

  1. tail /var/log/nginx/error.log 看日志报错关键词
  2. 启动 / 重启后端服务(php-fpm /node/java 应用)
  3. 核对 nginx fastcgi_pass / proxy_pass 的地址、端口、socket 路径
  4. curl 直接访问后端地址,确认后端独立可访问
  5. 检查内存、磁盘、socket 权限、SELinux

区分:

  • 502:Nginx 连不上后端
  • 504:连上后端,但后端响应太慢超时