新配的一台 nginx 加 php-fpm,域名解析过去,浏览器弹出一行 No input file specified.,连 404 页面都没有。这个报错不是 nginx 写的,是 PHP 那边返回的,说明请求已经转给了 php-fpm,但脚本文件没找到。

报错到底在说什么

php-fpm 收到请求后会读环境变量 SCRIPT_FILENAME,按这个绝对路径去找 PHP 文件。路径为空、文件不存在、或者 php-fpm 进程没有权限读,就返回这句。它和 404 不一样:404 是 nginx 自己没找到文件直接返回,这句是文件交给了 PHP 却打不开。

先看路径拼成了什么

常见配置是 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name。如果 location 里用 alias 或者重新定义了 root,$document_root 可能还是上一层的值,拼出来的路径就是错的。用 nginx -T 把最终配置打出来看,别只盯着站点文件。

四个高频原因

  • root 指错:站点根目录写成 /var/www 而代码在 /data/www,路径差一层。
  • 入口缺失:目录下没有 index.php,请求打到目录上,PHP 拿不到具体文件。
  • 权限:php-fpm 以 www-data 运行,代码属主是 root 且目录是 700,读不了。
  • 容器路径:nginx 和 php 分在两个容器,挂载路径不一致,nginx 看到的路径在 php 容器里不存在。

一段能用的配置

location ~ [.]php$ { root /data/www/site; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }

注意 include 要写在设置 SCRIPT_FILENAME 之前,否则会被覆盖。改完先 nginx -t 再 reload。

定位最快的办法

打开 php-fpm 的错误日志,把 request_slowlog_timeout 也开上,日志里会打印实际访问的脚本路径。再对照 ls -l 看一眼文件在不在、权限对不对,基本一眼定案。路径和权限都对还报错,检查 SELinux 的 httpd_sys_content_t 上下文。