“Primary script unknown”错误90%因SCRIPT_FILENAME路径不匹配:需在location ~ .php$块中显式添加fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,确保root定义在server级、php-fpm用户有目录读取权限,并注意Windows/WSL/Docker路径一致性。

phpEnv 下 Nginx 报 FastCGI sent in stderr: "Primary script unknown",90% 是 SCRIPT_FILENAME 路径没对上,不是 PHP 没装好、也不是端口不通。
phpEnv 默认用 fastcgi_params 文件,但它不包含 SCRIPT_FILENAME —— 这个关键参数得手动补上。否则 nginx 传给 php-fpm 的脚本路径是空或错的,php-fpm 根本找不到 index.php。
- 打开你的 nginx server 块(比如
phpenv/nginx/conf/vhost/your-site.conf) - 在
location ~ .php\( { ... }块内,确保有这行:fastcgi_param SCRIPT_FILENAME \)document_root\(fastcgi_script_name; - 不要写成
/scripts\)fastcgi_script_name或硬编码路径(如/wwwroot/…),\(document_root必须由当前server或location的root指令定义出来 - 如果
root写在location /里,但没写在location ~ .php\)里,$document_root在 PHP 块里可能为空——最稳妥是把root提到server级,或显式复制进 PHP location
phpEnv 启动的 php-fpm 默认用 www 用户,但 Windows 上没有这个用户,Linux/macOS 上若网站目录属主不是 www(或你改过的用户),就会因权限拒绝导致“脚本未知”。
- 查当前 php-fpm 进程用户:
ps aux | grep php-fpm | grep -v grep,看输出里USER列是什么 - 检查网站根目录权限:
ls -ld /path/to/your/webroot,确认该目录可被 php-fpm 用户读取(至少r-x对目录,r–对.php文件) - 修改 php-fpm 用户(以 Linux 为例):
编辑phpenv/php/etc/php-fpm.d/www.conf,改这两行:user = www→ 改成user = your_usernamegroup = www→ 改成group = staff(macOS)或www-data(Ubuntu) - 改完重启:
phpenv stop php-fpm && phpenv start php-fpm
phpEnv 在 Windows 上跑时,\(document_root 展开后可能是 C:wwwsite,但 php-fpm(尤其旧版)只认正斜杠 /,且对盘符大小写敏感;更麻烦的是,Windows 的 UNC 路径或长路径嵌套会直接让 php-fpm 返回“unknown”。
立即学习“PHP免费学习笔记(深入)”;
- 强制统一用正斜杠:
把root C:wwwmyapp;改成root /c/www/myapp;(注意是/c/不是C:/) - 避免深层嵌套路径:
别用C:UsersNameDocumentsphpEnvwwwprojectpublic这种,移到C:wwwproject级别 - 如果用了
alias(比如映射/admin到子目录),\)document_root不生效,必须显式写死:fastcgi_param SCRIPT_FILENAME /c/www/admin/public$fastcgi_script_name;
phpEnv 若跑在 WSL 或 Docker 容器里,宿主机路径和容器内路径不一致时,\(document_root 在 nginx 看是 /var/www/html,但 php-fpm 实际挂载的是 /mnt/c/www,两者对不上就必然报错。
- 确认 nginx 和 php-fpm 看到的路径完全一致:
在 nginx 配置里写root /var/www/html;,就在 php-fpm 的www.conf里配chroot = /var/www/html(慎用)或确保php_admin_value[doc_root]指向同一位置 - 更简单做法:绕过
\)document_root,直接硬编码(仅限调试):fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; - WSL 用户检查是否启用了
metadata:在/etc/wsl.conf加[automount] options = "metadata",否则 chmod 不生效,php-fpm 拒绝读取
最容易被忽略的是:phpEnv 的 nginx 配置模板常把 include fastcgi_params; 放在 fastcgi_param SCRIPT_FILENAME … 之前,结果后者被覆盖。顺序错了,加了也白加。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/282657.html