返回博客

如何修复 Ubuntu 上卡住的 PHP-FPM 服务(502 Bad Gateway)

2025-09-156 min read

您的 Nginx 站点出现 502 Bad Gateway 错误。您重启 PHP-FPM 时遇到类似 Job for php8.3-fpm.service failed... 的错误。这是我修复此问题的快速、可靠的方法。

1) 找出真正的问题

systemctl 显示类似 status=78 的失败时,通常指向配置错误。首先测试配置:

sudo php-fpm8.3 -t

如果此命令通过但服务仍无法启动,请检查完整的服务日志:

sudo journalctl -xeu php8.3-fpm.service

查找类似以下的 ERROR 行:

ERROR: Another FPM instance seems to already listen on /var/run/php/your-socket-name.sock

这意味着一个旧的/卡住的 PHP-FPM 进程仍在监听该套接字,阻止了新实例的启动。

2) 修复方法:清除旧进程

在下面的命令中,将 /var/run/php/your-socket-name.sock 替换为您错误日志中的实际套接字路径。

  1. 查找卡住的进程 (PID)

    sudo lsof /var/run/php/your-socket-name.sock

    此命令会打印出占用该套接字的进程(可能以 root 用户运行)。记下其 PID

  2. 停止该进程

    # 将 12345 替换为实际的 PID
    sudo kill 12345

    如果几秒钟后它仍拒绝关闭,您可以强制终止它(谨慎使用):

    sudo kill -9 12345
  3. 删除过时的套接字文件

    sudo rm /var/run/php/your-socket-name.sock

    PHP-FPM 在启动时会重新创建它。

  4. 启动 PHP-FPM

    sudo systemctl start php8.3-fpm

    您的服务现在应该可以干净地启动了。验证状态:

    systemctl status php8.3-fpm

3) 为什么会发生这种情况

如果 PHP-FPM 崩溃或被意外终止,它可能会留下一个正在运行的子进程或一个过时的套接字。Systemd 会尝试启动一个新的主进程,但套接字已被占用。

4) 下次如何预防

  • 优雅重启:对于配置更改,优先使用 systemctl reload php8.3-fpm
  • 监控日志:监控 /var/log/php8.3-fpm.log(或您的发行版的路径)以发现崩溃。
  • 套接字 vs. 端口:如果您持续遇到套接字冲突,在调试期间可以考虑暂时使用 TCP (127.0.0.1:9000)。

快速复制粘贴清单

# 1) 检查配置是否正常
sudo php-fpm8.3 -t

# 2) 检查服务日志
sudo journalctl -xeu php8.3-fpm.service

# 3) 如果出现 "already listen" 错误 -> 释放套接字
sudo lsof /var/run/php/your-socket-name.sock
sudo kill <PID>
sudo rm /var/run/php/your-socket-name.sock

# 4) 启动服务
sudo systemctl start php8.3-fpm

# 5) 验证
systemctl status php8.3-fpm