nginx 不解析 php,必须依赖 php-fpm 执行;若访问 .php 文件显示源码、502 或 404,说明通信链路中断,需依次验证 php-fpm 运行状态、监听地址匹配、fastcgi_pass 一致性、script_filename 路径正确性、权限及日志错误。

php-fpm 才能执行 PHP 脚本。如果访问 .php 文件只显示源码、返回 502 或 404,说明 Nginx 和 php-fpm 的通信链路断了,不是装了 PHP 就能跑。
确认 php-fpm 正在运行且监听地址匹配
这是最常被跳过的一步,但所有后续配置都依赖它。
- 运行
systemctl status php-fpm,确保状态是active (running);没启动就先systemctl start php-fpm - 查它实际监听在哪:
grep "^listen =" /etc/php/*/fpm/pool.d/www.conf,常见值是127.0.0.1:9000或unix:/run/php/php8.2-fpm.sock(版本号可能不同) - 用
ss -tlnp | grep php或ls -l /run/php/验证端口或 socket 文件真实存在且可访问 - 如果改过
www.conf,必须systemctl reload php-fpm,不是 restart —— reload 才会重读配置
location ~ \.php$ 块里三个关键参数不能错
这个 location 是 PHP 请求的入口开关,漏一项就直接退化成下载源码或 502。
-
fastcgi_pass必须和上一步查到的监听地址**完全一致**:TCP 地址写127.0.0.1:9000,Unix socket 写unix:/run/php/php8.2-fpm.sock(注意路径和版本号) -
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name这行决定 PHP 脚本能被找到;$document_root要和 server 块里的root值一致,否则报 “File not found” - 必须
include fastcgi_params(或snippets/fastcgi-php.conf),它提供REQUEST_METHOD、QUERY_STRING等基础变量;单独写fastcgi_pass不够
权限和路径一致性容易被忽略
Nginx worker 进程用户(如 www-data 或 nginx)需要同时具备:读取 PHP 文件、访问 socket 文件、进入网站目录的权限。
- 检查文件归属:
ls -l /var/www/html/info.php,确保属主/组是 Nginx 工作用户(Ubuntu 通常是www-data,CentOS 是nginx) - socket 文件权限也要对:
ls -l /run/php/php8.2-fpm.sock,如果属组不是 Nginx 用户,php-fpm配置里得设listen.group = www-data并 reload -
root指令在 server 块里写的是/var/www/html,那info.php就必须真正在这个路径下,不能少一级或多一级
验证和排错优先看日志,别猜
浏览器看到 502 不代表 PHP 挂了,可能是 Nginx 连不上 socket;看到空白页也不一定是代码错,很可能是 SCRIPT_FILENAME 拼错了路径。
- 立刻查
tail -f /var/log/nginx/error.log,典型错误如:connect() to unix:/run/php/php8.2-fpm.sock failed (13: Permission denied)或FastCGI sent in stderr: "Primary script unknown" - 对应查
php-fpm日志:tail -f /var/log/php8.2-fpm.log,看有没有子进程崩溃或权限拒绝记录 - 每次改完配置,先
nginx -t测试语法,再systemctl reload nginx;改了php-fpm配置,reload 它自己
$document_root 和物理路径差了一个斜杠、或者 php-fpm 监听用了 TCP 但 Nginx 配了 Unix socket —— 这些细节不逐项核对,光重启服务没用。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











