nginx 正确解析 php 需:先 include fastcgi_params,再显式设置 script_filename;必须配置 fastcgi_pass 指向 php-fpm;root 优于 alias;https 和真实 ip 需额外补参。

要让 Nginx 正确配置动态脚本解析(比如 PHP),fastcgi_params 本身不直接“配置解析”,而是作为参数传递的桥梁——它确保 Nginx 把请求上下文准确翻译成 FastCGI 协议能理解的环境变量,交由 PHP-FPM 等后端执行。关键不在改它多少行,而在用对、补全、不冲突。
核心:先 include,再覆盖关键参数
fastcgi_params 是一份预定义的键值映射清单(约 20 行),但它的默认内容不包含 SCRIPT_FILENAME 的安全路径拼接逻辑。所以标准做法是:
- 用
include fastcgi_params;引入全部基础变量(如REQUEST_METHOD、QUERY_STRING、REMOTE_ADDR) - 在它之后,**单独显式设置**
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - 这个顺序很重要:后写的会覆盖前面同名项,而
SCRIPT_FILENAME必须基于当前 location 的root和请求路径动态生成
location 块中必须指定 fastcgi_pass
没有 fastcgi_pass,Nginx 根本不会走 FastCGI 流程,fastcgi_params 再全也无效。常见写法:
-
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;(推荐,Unix socket 更快更安全) -
fastcgi_pass 127.0.0.1:9000;(TCP 方式,需确认 PHP-FPM 监听该端口) - 该指令必须出现在匹配 PHP 文件的
location ~ \.php$块内,且不能被其他嵌套配置意外屏蔽
注意 root 和 alias 的区别,影响 SCRIPT_FILENAME 路径
$document_root 的值来自当前 location 的 root 或 alias 指令,错误会导致 404 或 502:
- 用
root /var/www/site;时:$document_root$fastcgi_script_name→/var/www/site/index.php - 用
alias /var/www/site/;时:$document_root变为/var/www/site/,但$fastcgi_script_name已含路径前缀,容易重复拼接出错 - 建议统一用
root,避免alias与 FastCGI 路径逻辑冲突
必要时补充 HTTPS 和真实 IP 识别
如果站点启用了 SSL 或前端有代理(如 CDN、负载均衡),还需手动补两行:
-
fastcgi_param HTTPS $https if_not_empty;—— 让 PHP 知道当前是 HTTPS 请求,避免跳转异常 -
fastcgi_param REMOTE_ADDR $realip_remote_addr;—— 配合set_real_ip_from和real_ip_header使用,确保$_SERVER['REMOTE_ADDR']是真实客户端 IP,而非代理 IP











