Mac中PHP+Nginx关于“Primary script unknown“ 报错的解决方法汇总

Mac中搭配PHP+Nginx环境,遇到"Primary script unknown",以及类似File not found502 Bad Gateway等报错,主要有两个原因:没有访问权限和文件不存在

日志信息:

2025/02/24 11:16:32 [error] 5024#0: *407 FastCGI sent in stderr: “Primary script unknown” while reading r esponse header from upstream, client: 127.0.0.1, server: xxxxxx.com, request: “GET /test_php.php HTTP/ 1.1”, upstream: “fastcgi://127.0.0.1:9000”, host: “xxxxxx.com”

实测参考版本:

  • mac 12.7.4
  • php 7.1
  • nginx 1.26.3

一、文件访问权限

文件访问权限核心是配置正确的用户名和用户组,而且php-fpmnginx保持一致比较好。直接说方法,具体原理请另行查阅相关资料。

1.查看网站目录

使用命令 ls -l,查看网站文件和目录的详细信息,比如我这里用户名和用户组为:pury、staff,如图:

请添加图片描述

2.修改php-fpm配置

通常是要修改名为www.conf的配置文件,具体位置根据本机实际安装方式为准,我用的是MacPorts安装php 7.1,默认路径为/opt/local/etc/php71/php-fpm.d/www.conf

user = pury
group = staff

# 这里确保Nginx配置中的fastcgi_pass与之匹配
listen = 127.0.0.1:9000

修改完成后保存并重启服务,查看端口监听状态命令: sudo lsof -i :9000,有如下返回说明启动成功。

请添加图片描述

3.修改nginx配置

配置文件是nginx.conf,默认路径:/opt/local/etc/nginx/nginx.conf,在文件开头指定用户名和用户组:

user pury staff;

同样,修改完成后保存并重启服务。

二、配置文件资源路径

报错信息Primary script unknown,意为无法识别php脚本文件/目录,在nginx中搭配php-fpm,核心配置如下:

server {
   #  ....
    root   /Users/xxxxx/nginx/test;
    
	location ~ \.php$ {
	    fastcgi_pass   127.0.0.1:9000;
	    fastcgi_index  index.php;
	    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
	    include        fastcgi_params;
	}
	
   #  ....
}

这是网上流传很广泛的配置,然而,这个已经相对落后了,这里仔细解读下。

php-fpm找脚本文件,路径配置是fastcgi_param SCRIPT_FILENAME,可以看到上面写的是$document_root$fastcgi_script_name,分为两个部分:$document_root$fastcgi_script_name,后者是实际请求的脚本名(或包含子路径),不用动,重点在前者。

nginx中,$document_root 是一个内置变量,它表示当前请求的资源所在的根目录,这个值由server块中的root指令定义,如示例中的:/Users/xxxxx/nginx/test

如此,可以换个写法,也无伤大雅:

	location ~ \.php$ {
	    fastcgi_pass   127.0.0.1:9000;
	    fastcgi_index  index.php;
	    fastcgi_param  SCRIPT_FILENAME  /Users/xxxxx/nginx/test$fastcgi_script_name;
	    include        fastcgi_params;
	}

好了,接下来是include fastcgi_params;,很明显作用是引入一个名为fastcgi_params的文件,该文件已经是过去时,新版本中是fastcgi.conf ,这也是很多小伙伴直接复制粘贴上面的配置,依旧出错的原因之一。

nginx的配置中,fastcgi_paramsfastcgi.conf 十分相似,功能几乎相同,仅存在细微的区别。这种差异主要体现在nginx的发展历程中,随着版本的更新和用户需求的变化而产生的调整。

如果还想用旧的命名方式,需要复制一份:

$ sudo cp  fastcgi.conf fastcgi_params

还没完,来看一个默认配置,截取前面一部分:

 
 # fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
 fastcgi_param  QUERY_STRING       $query_string;
 fastcgi_param  REQUEST_METHOD     $request_method;
 fastcgi_param  CONTENT_TYPE       $content_type;
 fastcgi_param  CONTENT_LENGTH     $content_length;
 
 fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
 fastcgi_param  REQUEST_URI        $request_uri;
 fastcgi_param  DOCUMENT_URI       $document_uri;
 fastcgi_param  DOCUMENT_ROOT      $document_root;
 fastcgi_param  SERVER_PROTOCOL    $server_protocol;
 fastcgi_param  REQUEST_SCHEME     $scheme;
 fastcgi_param  HTTPS              $https if_not_empty;
 

最关键的是第一行!!!很熟悉吧,就是在nginx中的配置fastcgi_param SCRIPT_FILENAME,重复了,所以include该文件的这一行位置很重要,千万不要被覆盖了。

如果本机上有很多个网站,可以考虑把fastcgi.conf 中的第一行屏蔽掉,全局生效,每个网站自定义路径,灵活性更高,这个根据自己实际情况而定吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值