Mac中搭配PHP
+Nginx
环境,遇到"Primary script unknown"
,以及类似File not found
、502 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-fpm
和nginx
保持一致比较好。直接说方法,具体原理请另行查阅相关资料。
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_params
和 fastcgi.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
中的第一行屏蔽掉,全局生效,每个网站自定义路径,灵活性更高,这个根据自己实际情况而定吧。