博客 / Linux/ 解决 PHP-FPM 错误:另一个实例已在监听 /tmp/php-cgi.sock

解决 PHP-FPM 错误:另一个实例已在监听 /tmp/php-cgi.sock

解决 PHP-FPM 错误:另一个实例已在监听 /tmp/php-cgi.sock

问题描述

在启动或重启 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。

预防建议:

  1. 始终使用系统服务命令(systemctlservice)来管理 PHP-FPM。
  2. 确保服务器上只有一个 PHP-FPM 主配置在运行。
  3. 如果遇到 Socket 文件残留,可以在停止服务后手动删除它(例如 sudo rm -f /tmp/php-cgi.sock),然后再启动服务。

发表评论

您的邮箱不会公开。必填项已用 * 标注。