php 8 在 nginx 下必须通过 php-fpm 处理动态请求,核心是 nginx 准确转发 .php 请求:需确认 php-fpm 服务名(如 php8.2-fpm)已启动、fastcgi_pass 严格匹配其 listen 地址(如 unix:/run/php/php8.2-fpm.sock)、script_filename 动态拼写为 $document_root$fastcgi_script_name,并确保 nginx 进程对 socket 具备读写权限。

PHP 8 要在 Nginx 下运行,必须通过 PHP-FPM 处理动态请求。配置本质是让 Nginx 把 .php 请求准确、安全地转给 PHP-FPM,关键不在“装了什么”,而在“地址对不对、路径拼得准不准、权限够不够”。
确认 PHP-FPM 已安装并监听正确地址
PHP 8 的 FPM 服务名通常是 php8.2-fpm 或 php8.3-fpm(取决于你装的版本),不是 php-fpm 这个通用名:
- 检查是否运行:
sudo systemctl status php8.2-fpm - 若未启动,执行:
sudo systemctl start php8.2-fpm && sudo systemctl enable php8.2-fpm - 查看它实际监听哪:打开
/etc/php/8.2/fpm/pool.d/www.conf,找listen =行,常见值为:listen = /run/php/php8.2-fpm.sock(Unix socket)或listen = 127.0.0.1:9000(TCP,需手动开启)
Nginx 配置 fastcgi_pass 必须严格匹配 listen 值
这是 502 错误最常发生的环节。Nginx 的 fastcgi_pass 必须和上面看到的 listen 值一字不差:
- 如果 PHP-FPM 是
listen = /run/php/php8.2-fpm.sock,Nginx 就写:fastcgi_pass unix:/run/php/php8.2-fpm.sock; - 漏掉
unix:前缀 → Nginx 当成 IP 解析 → 直接报错 502 - 路径多一个空格、少一个斜杠、
/run写成/var/run→ 连不上 socket → 502 或 503 - 不推荐直接用
fastcgi_pass 127.0.0.1:9000,除非你明确改过www.conf并确认端口没被占用
SCRIPT_FILENAME 必须动态拼出真实路径
这个参数告诉 PHP-FPM “当前要执行的 .php 文件到底在磁盘哪个位置”。写死或缺失会导致 404、空白页,甚至直接输出 PHP 源码:
- 正确写法(放在
location ~ \.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会失败
检查 socket 文件权限与属组
socket 文件不是“存在就能连”。Nginx worker 进程(用户如 www-data 或 nginx)必须对 socket 有读写权限:
- 运行:
ls -l /run/php/php8.2-fpm.sock - 看输出类似:
srw-rw---- 1 root www-data→ 若 Nginx 用户是nginx,就得改www.conf中:listen.group = nginxlisten.mode = 0660 -
0600:Nginx 写不了 → 502;0644或更松:可能被安全扫描警告
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











