CentOS 7.9 上 nginx 和 php-fpm 通过 unix socket 通信,有人清理临时目录时把 sock 文件删了,nginx 报 connect() to unix:/run/php-fpm/www.sock failed,php-fpm 进程却一切正常。

这类报错背后常见的原因有几处,逐个排除就行。socket 文件只是目录项,删掉之后内核里的监听结构还在,进程不会感知;systemd-tmpfiles 按时间清理 /run 下的文件,把 sock 一起删了;php-fpm 没有配置 listen.mode 和目录持久化,重启才能重建;清理脚本用了 find -mtime 没排除 socket 类型。

上来先确认 sock 文件是否还存在

ls -l /run/php-fpm/www.sock && ss -xlp | grep php

然后重启 FPM 让它重建 socket

systemctl restart php-fpm && ls -l /run/php-fpm/www.sock

接着在 tmpfiles 规则里排除 socket

printf 'x /run/php-fpm/*.sock\n' > /etc/tmpfiles.d/keep-php.conf

剩下的就是确认 nginx 侧连接恢复

curl -sI http://127.0.0.1/ | head -1 && tail -5 /var/log/nginx/error.log

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

这台环境是别人交接的,不少默认值被动过,只能一项项核。

恢复的判定其实很直接。sock 文件重新出现且属主是 www,nginx 访问返回 200,error.log 里不再出现 connect failed。

socket 文件被删不会让进程退出,只会让新连接全部失败,很容易误判成后端挂了;临时目录清理必须按类型排除 sock。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189