php-fpm的listen必须设为带.sock后缀的绝对路径(如/run/php/php-fpm.sock),同步配置listen.owner、listen.group、listen.mode,并确保nginx的fastcgi_pass与之完全一致,否则将导致502或permission denied错误。

PHP-FPM 的 listen 配置必须设为绝对路径的 .sock 文件
Unix Socket 比 TCP 更快、更安全,但 PHP-FPM 不接受相对路径或无扩展名的 socket 名。常见错误是写成 listen = php-fpm.sock 或 listen = /tmp/php-fpm,这会导致启动失败并报错:failed to listen on address '/tmp/php-fpm': Permission denied 或直接静默退出。
正确做法是:
- 使用带
.sock后缀的绝对路径,例如/run/php/php-fpm.sock(推荐 systemd 环境)或/var/run/php/php8.2-fpm.sock - 确保该路径所在目录存在且 PHP-FPM 进程用户(通常是
www-data)有读写权限 - 在
php-fpm.conf或对应 pool 配置(如www.conf)中修改,不要只改主配置而忽略 pool 级设置
Nginx 的 fastcgi_pass 必须与 PHP-FPM 的 listen 完全一致
很多人改了 PHP-FPM 的 listen,却忘了同步更新 Nginx 配置里的 fastcgi_pass,结果 502 Bad Gateway。Nginx 不会自动补全路径或后缀,它严格按字符串匹配。
检查点:
-
fastcgi_pass值必须是unix:/绝对路径/xxx.sock格式,不能少unix:前缀 - 路径需与 PHP-FPM 中
listen = /xxx/yyy.sock完全相同(包括大小写和斜杠结尾) - 如果用了 SELinux,还需确认上下文允许 Nginx 访问该 socket:
ls -Z /var/run/php/php8.2-fpm.sock
权限问题:socket 文件属主和 socket 目录权限常被忽略
PHP-FPM 创建 socket 文件时,会以 listen.owner 和 listen.group 指定的用户/组来 chown,但前提是目录本身允许创建。典型现象是 socket 文件没生成,或生成后 Nginx 报 connect() to unix:/xxx.sock failed (13: Permission denied)。
关键配置项(写在 pool 配置里):
-
listen.owner = www-data(必须与 Nginx worker 进程用户一致) listen.group = www-data-
listen.mode = 0660(太松如 0666 可能被拒绝,太严如 0600 会让 Nginx 无法读写) - 确保 socket 所在目录(如
/var/run/php/)对www-data可写:sudo chown root:www-data /var/run/php && sudo chmod 0775 /var/run/php
验证是否真走 Unix Socket 而非回退到 TCP
改完配置后 reload 并不等于生效。有些环境因权限或路径问题,PHP-FPM 会静默 fallback 到默认 TCP 端口(如 127.0.0.1:9000),而 Nginx 仍连着旧 socket —— 表现为页面空白或 502,但进程看似正常。
快速验证方法:
- 查 PHP-FPM 实际监听项:
sudo ss -tuln | grep ':9000\|php;若只看到u_str行(不是tcp),说明走 socket - 看 socket 文件是否存在且有内容:
ls -l /var/run/php/php8.2-fpm.sock,大小应 > 0 - 临时删掉 socket 文件再 reload PHP-FPM:
sudo systemctl reload php8.2-fpm,观察是否重新生成 —— 不生成基本就是权限或路径配置错了
socket 路径拼错、目录权限漏调、listen.owner 与 Nginx 用户不一致——这三个点出错频率最高,修完记得逐个确认,别只信 reload 成功就以为通了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











