“No input file specified”等错误本质是Nginx未正确传递PHP文件路径给PHP-FPM,主因包括fastcgi_param SCRIPT_FILENAME拼接错误、location ~ .php$块缺失root/alias、PHP-FPM权限不足或fastcgi_split_path_info正则误截。

location 块里怎么配 PHP 虚拟目录
直接在 location 中用 alias 配 PHP 路径,但必须配合 fastcgi_param SCRIPT_FILENAME 手动拼出真实路径,否则 php-fpm 会找不到脚本文件。
常见错误现象:浏览器返回 502(connect() to unix:/run/php/php7.4-fpm.sock failed),或 500(Primary script unknown),本质是 SCRIPT_FILENAME 指向了不存在的路径。
-
alias不会自动映射到磁盘路径,它只影响 URI 到文件系统的映射,而fastcgi_param SCRIPT_FILENAME默认用的是$document_root$fastcgi_script_name,这依赖root,不兼容alias - 正确做法是显式重写
SCRIPT_FILENAME:比如虚拟目录映射到/opt/myapp/,则写fastcgi_param SCRIPT_FILENAME /opt/myapp$fastcgi_script_name; - 别漏掉
try_files $uri =404;,防止用户直接请求 PHP 文件之外的路径被绕过
fastcgi_pass 用 socket 还是 TCP?
优先用 Unix socket(如 unix:/run/php/php7.4-fpm.sock),性能更好、更安全;只有跨主机或调试时才用 127.0.0.1:9000。
容易踩的坑:
立即学习“PHP免费学习笔记(深入)”;
- socket 文件权限不对:
php-fpm进程用户(如www-data)和 Nginx worker 用户必须对 socket 文件有读写权限,常见报错Permission denied - socket 路径不一致:Debian/Ubuntu 默认是
/run/php/php7.4-fpm.sock,CentOS 可能是/var/run/php-fpm/www.sock或/tmp/php-fpm74.sock,得看php-fpm.conf里的listen配置 - 没启动
php-fpm:装完php7.4-fpm后必须手动systemctl start php7.4-fpm,且确认状态为active (running)
index.php 不生效?检查 root 和 index 的顺序
Nginx 查找默认首页时,严格按 index 指令中列出的顺序匹配。如果 index.php 写在 index.html 后面,而目录下存在 index.html,那永远进不到 PHP。
实操建议:
- 把
index.php放最前:index index.php index.html index.htm; - 确保
root指向的目录下真有index.php,且文件权限允许 Nginx 读取(如chmod 644,属主可为www-data或nginx) - 别在
server块外写index,它只在http、server、location三级生效,且子块会覆盖父块
PHP 脚本执行报错但页面空白?打开 error_log
默认 PHP 错误不会输出到页面,尤其在生产模式下。Nginx 日志只记录 HTTP 状态,不记录 PHP 内部错误。
必须同时查两处日志:
- Nginx 错误日志:
tail -f /var/log/nginx/error.log,看是否有FastCGI sent in stderr或recv() failed - PHP-FPM 错误日志:查
php-fpm.conf中的error_log(如/var/log/php7.4-fpm.log),重点看PHP message:行 - 临时开启 PHP 显示错误:在站点配置里加
fastcgi_param PHP_FLAG "display_errors=on";,仅限调试,上线前删掉
虚拟目录配置真正麻烦的不是语法,而是路径拼接和权限链:Nginx → socket → php-fpm → 磁盘路径 → 文件权限 → PHP 解析器本身。任一环断开,就静默失败。动手前先用 curl -I http://localhost/test.php 看状态码,再盯紧两个日志文件,比反复改配置高效得多。



















