CentOS 7.9 上把 PHP-FPM 从 127.0.0.1:9000 改成 unix socket,nginx 里配 fastcgi_pass unix:/run/php-fpm/www.sock,reload 之后所有 php 页面都五零二,error.log 写 connect() failed (13: Permission denied)。
一开始怀疑是「/run 是 tmpfs,重启后由 systemd 重建目录,属组没设对,手工改的权限全丢」,查了一圈,方向不对。
原因不止一个,得分开看。sock 文件属主是 root 属组 root 权限 660,nginx 用 nginx 用户跑,压根连不上。也可能是SELinux 的 httpd_t 不允许写 php-fpm 的目录,报错文案和权限问题几乎一样。
还有一种情况,pool 里 listen.mode 是 0660 而属组不是 nginx,socket 建出来就不可写。
动手时先看 sock 当前的属主与权限位
ls -l /run/php-fpm/www.sock
临时改正属组和权限,先把站点拉起来
chown root:nginx /run/php-fpm/www.sock && chmod 660 /run/php-fpm/www.sock && systemctl reload php-fpm
接着把属主写进 pool 配置,重启后不再丢
sed -i 's/^;*listen.owner.*/listen.owner = nginx/; s/^;*listen.group.*/listen.group = nginx/; s/^;*listen.mode.*/listen.mode = 0660/' /etc/php-fpm.d/www.conf && systemctl restart php-fpm
等前面都确认过,再确认不是 SELinux 在拦
ausearch -m avc -ts recent | grep php-fpm | tail -5
中途换过一次思路,把范围缩到最小的那一层,反而快了。
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
改完先别撤,确认这几项。ls -l 显示 sock 属组为 nginx 且权限 660,curl 请求 php 页面返回 200,error.log 里不再出现 Permission denied。
补一句。临时 chown 能立刻恢复,但重启就失效,属主要写进 pool 配置,不然过几天又被当成新问题。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
