nginx 本身不执行 php,必须通过 fastcgi_pass 将请求转发给 php8.1-fpm 处理;502 错误主因是 php8.1-fpm 未运行、监听地址(socket 或 tcp)与 fastcgi_pass 不一致、socket 权限不足或缺失 script_filename 参数。

直接说结论:Nginx 本身不执行 PHP,它必须把 PHP 请求交给 php-fpm(PHP 8.1 版本)处理;所谓“Nginx 支持 PHP 8.1”,本质是配置 location ~ \.php$ 块正确转发给运行在指定端口或 socket 的 php8.1-fpm 进程——这和反向代理逻辑一致,但目标不是外部服务,而是本地 PHP 处理器。
确认 php8.1-fpm 是否已安装并监听
很多 502 错误其实卡在这一步:Nginx 配置写对了,但 php8.1-fpm 根本没跑,或者监听地址不匹配。
- 检查进程是否存在:
systemctl status php8.1-fpm(Ubuntu/Debian)或systemctl status php-fpm-81(CentOS/RHEL) - 确认监听方式:默认通常用 Unix socket(如
/run/php/php8.1-fpm.sock),少数情况用 TCP(如127.0.0.1:9001);查配置文件/etc/php/8.1/fpm/pool.d/www.conf中的listen =行 - 确保 socket 文件权限可读写:Nginx worker 进程用户(通常是
www-data或nginx)必须对 socket 文件有读写权限,否则报connect() to unix:/run/php/php8.1-fpm.sock failed
在 server 块中配置 PHP 处理 location
这不是“加个插件”,而是显式告诉 Nginx:以 .php 结尾的请求,不要自己 serve,要转给 php8.1-fpm。
- 必须用
location ~ \.php$(注意波浪线和美元符),不能只写location /或漏掉正则匹配,否则 PHP 文件会被当作静态文件直接返回源码 -
fastcgi_pass必须与php8.1-fpm实际监听地址严格一致:是 socket 就写unix:/run/php/php8.1-fpm.sock,是 TCP 就写127.0.0.1:9001;写错端口或路径,立刻 502 - 必加
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,否则 PHP 找不到脚本路径,报No input file specified - 建议加上
try_files $fastcgi_script_name =404;,防止任意文件执行漏洞(如/a.jpg/xx.php被解析)
示例片段:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files $fastcgi_script_name =404;
}
为什么不能用 proxy_pass 代理到 PHP?
有人试图用 proxy_pass http://127.0.0.1:9001 把 PHP 请求当 HTTP 服务代理——这是错的。PHP-FPM 不是 HTTP 服务器,它用的是 FastCGI 协议,和 HTTP 完全不兼容。
-
proxy_pass只用于 HTTP/HTTPS 后端(如 Node.js、Python Flask、另一台 Nginx) -
fastcgi_pass是专为 FastCGI 协议设计的指令,负责序列化 CGI 环境变量、解析响应包头等 - 混用会导致 502 或空响应,且 Nginx error log 里会明确报
upstream sent no valid HTTP/1.0 header
PHP 8.1 特有注意事项
PHP 8.1 引入了更严格的类型检查和弃用警告,这些不会影响 Nginx 配置本身,但会影响你是否能顺利加载页面:
- 检查
php.ini中display_errors = Off(生产环境必须关),否则 PHP 错误会直接输出到 HTML,破坏 JSON/API 响应格式 - 若用到
mbstring、curl、gd等扩展,确认它们已为 PHP 8.1 编译安装:php8.1 -m | grep mbstring - WordPress 等老程序可能依赖已被移除的函数(如
create_function()),需升级插件或主题,否则 500 错误日志里会出现Deprecated: Function create_function() is deprecated
最常被忽略的其实是 php8.1-fpm 的用户组权限和 socket 文件路径一致性——改完配置不 reload php8.1-fpm,或改了 socket 路径却忘了同步更新 Nginx 配置,问题就出在这里。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











