PHP-FPM核心配置在池文件中,Ubuntu/Debian路径为/etc/php/8.x/fpm/pool.d/www.conf,CentOS/RHEL为/etc/php-fpm.d/www.conf;关键参数是listen=,Nginx的fastcgi_pass必须与其严格一致,并注意socket权限、SCRIPT_FILENAME动态拼接及重启顺序。

PHP-FPM 的核心配置不在 Nginx 里,而是在 PHP-FPM 自己的池(pool)配置文件中;Nginx 只负责把请求发给它——发给谁、怎么发,才是 Nginx 配置要管的事。
PHP-FPM 的进程池配置文件在哪
实际路径取决于系统和 PHP 版本,但规律很固定:
- Ubuntu/Debian 系:/etc/php/
8.2/fpm/pool.d/www.conf(或自定义站点名如site-a.com.conf) - CentOS/RHEL/宝塔:/www/server/php/
82/etc/php-fpm.d/www.conf - 关键不是文件名,而是
listen =这一行——它决定了 PHP-FPM 听哪个地址,Nginx 必须严格匹配 - 别改
php.ini来调进程数或 socket 路径,那是 PHP 执行参数,不是通信入口
Nginx 中必须改的 fastcgi_pass 地址
这个值不是随便写的,它必须和 PHP-FPM 的 listen = 值完全一致,并带 unix: 前缀:
- 如果 PHP-FPM 配置是
listen = /run/php/php8.2-fpm.sock,Nginx 就得写:fastcgi_pass unix:/run/php/php8.2-fpm.sock; - 漏掉
unix:前缀 → Nginx 当成 TCP 地址解析 → 直接 502 - 路径多一个空格、少一个斜杠、
/run写成/var/run→ 连不上 socket → 502 或 503 - 不要用
fastcgi_pass 127.0.0.1:9000除非你明确开了 TCP 监听且端口映射好了(比如 Docker 场景)
SCRIPT_FILENAME 参数必须动态拼接
这是最常被抄错、又最难排查的一环:Nginx 必须告诉 PHP-FPM “当前请求的 PHP 文件到底在哪儿”:
立即学习“PHP免费学习笔记(深入)”;
- 正确写法:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - 错误写法:
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;(硬编码路径,换目录就崩) - 如果用了
alias指令而不是root,$document_root会失效,得手动算路径,否则require或include找不到文件 - 不设这一行,或设错,PHP 会报
File not found或静默返回空白页
权限和属组容易被忽略的点
socket 文件不是“存在就能连”,Nginx worker 进程用户(www-data 或 nginx)必须有读写权限:
- 运行
ls -l /run/php/php8.2-fpm.sock,看输出里的 group 是否匹配 Nginx 用户组 - 如果显示
srw-rw---- 1 root www-data,而 Nginx 是nginx用户,就得改 PHP-FPM 配置里的listen.group = nginx -
listen.mode = 0660是底线,0644或更松可能引发安全警告,0600则 Nginx 无法写入 - 重启顺序不能乱:先
php-fpm8.2 -t校验,再nginx -t,最后systemctl reload php8.2-fpm→systemctl reload nginx
真正卡住人的从来不是“该改哪”,而是“改了但没对齐”——PHP-FPM 听的地址、Nginx 发的地址、文件路径拼接逻辑、socket 权限,四者差一不可。验证时直接看 phpinfo() 页面里的 Loaded Configuration File 和 open_basedir,比猜日志快得多。



















