nginx代理php-fpm的核心是通过location匹配php请求,用fastcgi_pass转发并配合fastcgi_param script_filename等关键参数准确定位脚本、防止目录穿越,推荐使用location ~ .php(/|$)匹配和unix socket通信。

要让 Nginx 正确代理 FastCGI 应用(如 PHP-FPM),核心是通过 location 块匹配请求,并用 fastcgi_pass 将其转发给后端 FastCGI 服务,同时传递必要参数确保脚本能被准确定位和安全执行。配置不复杂,但关键参数缺一不可。
匹配 PHP 请求的 location 规则
推荐使用更严谨的正则匹配,避免路径欺骗或误匹配静态文件:
-
location ~ \.php(/|$):匹配/index.php或/api/v1/test.php/abc这类常见路由,兼顾兼容性与安全性 - 避免仅用
location ~ \.php$,它可能匹配到/static/logo.php.jpg等伪装路径 - 若项目有固定入口(如 Laravel 的
public/index.php),可进一步限定:location = /index.php
必需的 fastcgi_param 参数
仅靠 fastcgi_pass 不足以运行 PHP,必须显式设置关键变量,尤其是脚本路径:
-
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;:用$realpath_root替代$document_root,防止目录穿越攻击(例如../../etc/passwd) -
fastcgi_param PATH_INFO $fastcgi_path_info;:支持框架路由(如/index.php/user/list中的/user/list) -
fastcgi_param REQUEST_METHOD $request_method;和fastcgi_param QUERY_STRING $query_string;:确保请求方法与查询参数正确传递 -
include fastcgi_params;加载基础变量(如REMOTE_ADDR、SERVER_NAME),再覆盖关键项
连接后端 FastCGI 服务的方式
根据部署结构选择通信方式,两者性能与安全性略有差异:
-
TCP 方式:
fastcgi_pass 127.0.0.1:9000;—— 适合跨主机或调试,需确认 PHP-FPM 监听该地址及listen.allowed_clients允许 Nginx IP -
Unix Socket 方式:
fastcgi_pass unix:/run/php/php8.2-fpm.sock;—— 同机部署更高效,权限需对齐(Nginx worker 用户需有 socket 读写权限) - 建议搭配
upstream块管理多个 PHP-FPM 实例,便于负载均衡或故障转移
安全与健壮性补充措施
防止源码泄露、空文件执行等常见风险:
- 在 PHP location 内加
try_files $uri =404;,拒绝访问不存在的 .php 文件 - 对上传目录(如
/uploads/)单独设location ^~ /uploads/,并禁用 PHP 执行:fastcgi_intercept_errors on; deny all; - 避免在非 PHP location 中暴露
.php文件,例如 root 下直接放config.php且无 location 保护,易被下载 - 启用
fastcgi_hide_header X-Powered-By;减少指纹暴露











