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

看 nginx error.log 里具体报什么
别猜,直接打开 Nginx 错误日志(通常是 phpenv/nginx/logs/error.log 或 /usr/local/nginx/logs/error.log),搜 FastCGI sent in stderr。后面跟着的引号内容才是关键:
- 如果是
"Primary script unknown":90% 是路径没对上,不是 PHP 挂了,也不是端口不通 - 如果是
"Access denied.":大概率是security.limit_extensions没配对,或文件后缀被拦截 - 如果是
"PHP message: PHP Fatal error: ...":问题在 PHP 层,比如扩展缺失、disable_functions拦了proc_open或file_get_contents
确认 SCRIPT_FILENAME 是否拼对了
SCRIPT_FILENAME 是 Nginx 传给 PHP-FPM 的“要执行哪个文件”,它必须是磁盘上真实存在的绝对路径。常见错法:
- 用的是默认
fastcgi_params文件,但它不包含SCRIPT_FILENAME—— 必须手动加:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; -
$document_root为空:因为root写在location /里,没写在location ~ \.php$或 server 级;应统一提到server块顶层 - Windows 下写成
C:\www\site,但 PHP-FPM 只认正斜杠;改成/c/www/site(注意是/c/不是C:/)
检查 php-fpm 用户能不能读到那个文件
PHP-FPM 进程以某个用户身份运行(如 www、www-data、your_username),它得能 stat() 到 SCRIPT_FILENAME 指向的 .php 文件。
- 查当前用户:
ps aux | grep php-fpm | grep -v grep,看 USER 列 - 查目录权限:
ls -ld /path/to/webroot,确保该用户对目录有r-x,对.php文件有r-- - Linux/macOS:改
phpenv/php/etc/php-fpm.d/www.conf中的user和group,匹配网站目录属主 - Windows:右键目录 → 属性 → 安全 → 给对应用户(如
SYSTEM或你的登录用户名)加“读取”权限
验证 fastcgi_pass 是否连得上
路径和权限都对了,但 PHP-FPM 根本没收到请求,也一样报 Primary script unknown。
- 确认 PHP-FPM 真启了:
phpenv status或ps aux | grep php-fpm - 查监听地址:看
phpenv/php/etc/php-fpm.conf里的listen =行,是127.0.0.1:9000还是unix:/tmp/php-fpm.sock - TCP 方式测试:
telnet 127.0.0.1 9000能连上说明端口通;连不上就先停再启phpenv start php-fpm - socket 方式测试:
ls -l /tmp/php-fpm.sock看文件是否存在、权限是否允许 Nginx worker 进程访问
phpenv restart nginx 或 nginx -s reload;很多人改对了却没重载,一直复现旧错误。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











