Nginx通过fastcgi_pass将PHP请求转发给PHP-FPM是标准部署方式,需确保PHP-FPM已运行、fastcgi_pass与listen地址严格匹配(如unix:/run/php/php8.2-fpm.sock或127.0.0.1:9000)、SCRIPT_FILENAME正确拼接为$document_root$fastcgi_script_name,并配置include fastcgi_params。

在 Nginx 中通过 fastcgi_pass 将 PHP 请求转发给 PHP-FPM(FastCGI 进程管理器)是部署 PHP 应用的标准做法。关键在于正确配置 FastCGI 参数、指定后端地址,并确保 PHP-FPM 服务正常监听。
确认 PHP-FPM 已安装并运行
FastCGI 本身不是独立服务,Nginx 依赖 PHP-FPM 提供 FastCGI 接口。需先验证:
- 执行
systemctl status php-fpm(CentOS/RHEL)或systemctl status php8.2-fpm(Ubuntu/Debian,版本号依实际调整)确认服务已启动 - 检查 PHP-FPM 配置中
listen指令:通常为listen = /run/php/php8.2-fpm.sock(Unix 域套接字)或listen = 127.0.0.1:9000(TCP 端口) - 确保 Nginx 用户(如
www-data或nginx)对 socket 文件有读写权限,或能访问对应 TCP 端口
在 server 或 location 块中配置 fastcgi_pass
核心是匹配 PHP 脚本请求,并将它们交给 PHP-FPM 处理。典型配置如下:
location ~ \.php$ {
root /var/www/html;
fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 或 127.0.0.1:9000
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
说明:
-
location ~ \.php$:正则匹配以.php结尾的 URI(注意避免过度匹配,如不建议用.*\.php) -
fastcgi_pass必须与 PHP-FPM 的listen地址严格一致;Unix socket 路径需存在且权限正确,TCP 地址需确保端口未被占用 -
fastcgi_param SCRIPT_FILENAME是关键参数,用于告诉 PHP-FPM 实际脚本的磁盘路径;务必使用$document_root而非硬编码路径 -
include fastcgi_params加载 Nginx 默认的 FastCGI 参数集(位于/etc/nginx/fastcgi_params),其中已定义常用变量如QUERY_STRING、REQUEST_METHOD等
常见问题与调试要点
配置后若返回 502 Bad Gateway 或空白页,可按以下顺序排查:
- 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log,常见报错如 “connect() to unix:/... failed (13: Permission denied)” 表示权限问题,“Connection refused” 表示 PHP-FPM 未运行或地址错误 - 确认
SCRIPT_FILENAME对应的文件真实存在且可读(例如请求/info.php,则/var/www/html/info.php必须存在) - 若使用 Unix socket,用
ls -l /run/php/php8.2-fpm.sock查看属主和权限,必要时在 PHP-FPM 配置中设置listen.owner、listen.group和listen.mode - 临时添加
fastcgi_param PHP_VALUE "error_log=/var/log/php-error.log";可让 PHP 错误输出到指定文件,便于定位脚本级问题
安全增强建议
生产环境中应避免潜在风险:
- 禁止直接执行上传目录中的 PHP 文件:对
uploads、images等目录单独配置location ~ \.php$ { deny all; } - 限制只允许入口脚本(如
index.php)被处理,其余 PHP 文件返回 404:location ~ ^/(?!index\.php).+\.php$ { return 404; } - 禁用危险的 PHP 函数可在
php.ini中设置disable_functions = exec,passthru,shell_exec,system,而非仅靠 Nginx 控制
配置本质是建立 Nginx 与 PHP-FPM 的通信通道,重点在于路径/地址一致、权限到位、参数准确。只要 PHP-FPM 正常监听,Nginx 能连上,再配对 SCRIPT_FILENAME,基本就能跑通。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











