问题描述
在启动或重启 PHP-FPM 服务时,可能会遇到类似 "ERROR: An another FPM instance seems to already listen on /tmp/php-cgi.sock" 的错误。这表明系统中已有一个 PHP-FPM 进程正在运行并占用了指定的 Unix Socket 文件(如 /tmp/php-cgi.sock),导致新实例无法启动。
解决方法
请按以下步骤操作,彻底停止旧的 PHP-FPM 进程并重新启动服务。
步骤一:检查 PHP-FPM 进程状态
首先,使用以下命令检查 PHP-FPM 进程是否正在运行:
ps aux | grep php-fpm
如果看到类似 php-fpm: master process 和多个 php-fpm: pool www 的进程,则说明 PHP-FPM 服务正在运行。
步骤二:停止所有 PHP-FPM 进程
如果确认 PHP-FPM 正在运行,需要先停止所有相关进程。可以使用以下命令:
sudo killall php-fpm
注意: 在某些系统上,可能需要使用 pkill 命令或指定完整的进程名(如 php-fpm7.4)。如果 killall 无效,请尝试:
sudo pkill -9 php-fpm
或者,使用系统服务命令停止(如果 PHP-FPM 是通过服务管理的):
sudo systemctl stop php-fpm # 适用于使用 systemd 的系统
# 或
sudo service php-fpm stop # 适用于使用 SysV init 的系统
步骤三:重启 PHP-FPM 服务
成功停止旧进程后,使用适合你系统的方式重新启动 PHP-FPM:
sudo systemctl start php-fpm # systemd 系统
# 或
sudo service php-fpm start # SysV init 系统
你也可以使用 restart 命令,它会先尝试停止服务再启动:
sudo systemctl restart php-fpm
步骤四:验证服务状态
重启后,请检查服务状态和 Socket 文件是否已正常创建:
sudo systemctl status php-fpm # 检查服务状态
ls -la /tmp/php-cgi.sock # 检查 Socket 文件是否存在(路径可能不同)
根本原因与预防
此错误通常由以下原因引起:
- 非正常关闭: PHP-FPM 进程被强制终止(如系统崩溃、
kill -9),导致 Socket 文件未被清理。 - 配置冲突: 多个 PHP-FPM 配置指向了同一个监听地址(Socket 或端口)。
- 手动启动冲突: 在通过系统服务管理的同时,又手动启动了 PHP-FPM。
预防建议:
- 始终使用系统服务命令(
systemctl或service)来管理 PHP-FPM。 - 确保服务器上只有一个 PHP-FPM 主配置在运行。
- 如果遇到 Socket 文件残留,可以在停止服务后手动删除它(例如
sudo rm -f /tmp/php-cgi.sock),然后再启动服务。