Nginx中FastCGI参数应通过fastcgi.conf(非fastcgi_params)配置,启用$realpath_root提升路径安全性;需在location块中按需覆盖SCRIPT_FILENAME、PATH_INFO等参数,移除SERVER_SOFTWARE等冗余项,并禁用HTTP_PROXY防范CVE-2016-5385。

在 Nginx 中,FastCGI 参数配置通常不单独存为“FastCGI 参数文件”,而是以 fastcgi_param 指令形式出现在 fastcgi.conf(或旧版 fastcgi_params)中,该文件被 include 到 server 或 location 块中。优化的关键不是新建文件,而是合理定义、覆盖和精简这些参数,尤其针对 PHP-FPM 场景。
明确 fastcgi.conf 与 fastcgi_params 的区别
现代 Nginx(1.10+)默认提供 /etc/nginx/fastcgi.conf,它比旧版 fastcgi_params 多了一行关键配置:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
这行启用 $realpath_root,能正确解析符号链接后的实际路径,避免因软链导致的 404 或安全绕过。建议统一使用 fastcgi.conf,并确认其已被正确 include:
- 检查主配置中是否包含
include fastcgi.conf;(而非fastcgi_params) - 若自定义了 root 或 alias,确保
$realpath_root能准确映射到 PHP 文件所在真实目录 - 如需兼容旧逻辑(例如某些 CMS 强依赖
$document_root),可局部覆盖该参数
按需覆盖关键参数,避免硬编码路径
不要直接修改系统级 fastcgi.conf,应在 site 配置的 location ~ \.php$ 块中覆盖必要参数。常见需调整项:
-
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;—— 保持默认即可,除非项目有特殊路径规则 -
fastcgi_param PATH_INFO $fastcgi_path_info;—— 对支持 PATH_INFO 的框架(如 Laravel、ThinkPHP)必须开启,且需配合try_files $uri =404;和正则捕获 -
fastcgi_param HTTPS on;—— 若前端有 TLS 终结(如 CDN 或反代),需根据$http_x_forwarded_proto动态设置,防止硬写on导致 PHP 判定错误 - 移除冗余参数:如
fastcgi_param SERVER_PORT等,Nginx 默认已传递,重复定义无意义
安全与性能兼顾的精简实践
默认 fastcgi.conf 包含约 20+ 参数,但多数 PHP 应用仅需其中 10 个左右。过度传递可能引发兼容问题或暴露服务端信息:
- 删除
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;—— 避免泄露 Nginx 版本 - 禁用
fastcgi_param HTTP_PROXY "";(若存在)—— 防止 HTTP 代理劫持(CVE-2016-5385) - 用
fastcgi_hide_header X-Powered-By;隐藏 PHP 版本头(需在 http/server 级配置) - 对静态资源目录(如 uploads),禁用 PHP 解析:用
location ~ ^/uploads/.*\.php$ { return 403; }
验证与调试方法
配置生效后,通过简单脚本确认 FastCGI 传参是否符合预期:
- 创建
info.php,内容为<?php phpinfo(); ?>,访问后搜索 “_SERVER” 查看SCRIPT_FILENAME、PATH_INFO等值 - 用
curl -I http://yoursite/test.php/abc检查是否返回 200 而非 404(验证 PATH_INFO 是否生效) - 执行
nginx -t && nginx -s reload确保语法正确,避免因 include 路径错误导致 502

















