部署nginx+php时,测试页面出现File not found. 查看nginx的报错日志显示FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
-
解决思路
确定配置参数
SCRIPT_FILENAME的路径是能被有效访问的,如location ~ \.php$ { root /home/web; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; include fastcgi_params; }需改为
location ~ \.php$ { root /usr/local/var/www/lara/public; # 设置监听端口 fastcgi_pass 127.0.0.1:9000; # 设置nginx的默认首页文件 fastcgi_index index.php; # 设置脚本文件请求的路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $document_root$fastcgi_script_name; include fastcgi_params; }确定nginx和php-fpm的用户、用户组权限一致
最简单的方法便是查看php-fpm的
www.conf和nginx的nginx.conf文件权限,拿到对应的所属用户和所属用户组,并填入即可。如果做完这一步重启nginx后依然无法正常反问,通过错误日志会看到跟我类似的报错:getgrnam("wangshimin") failed in /usr/local/etc/nginx/nginx.conf:2这里有个坑需要注意的是,通过手册可得知user 语法:user user [group] 默认值:nobody nobody 如果主进程以root运行,Nginx将会调用setuid()/setgid()来设置用户/组,如果没有指定组,那么将使用与用户名相同的组,默认情况下会使用nobody用户与nobody组(或者nogroup),或者在编译时指定的--user=USER和--group=GROUP的值。 user www users;
nginx.conf中的user一栏,如果不指定group用户组的话,将默认使用与用户名相同的组名,因此我这里error.log会报错告知我该用户匹配失败。解决办法便是把用户组补全,这里我用的是admin,因此我的配置项如下:
www.conf文件
user = wangshimin
group = admin
nginx.conf文件
user wangshimin admin;
再重启nginx时,依然报错nginx: [emerg] unknown log format "main" in ~/usr/local/etc/nginx/nginx.conf:35
http {
...
# 设置日志的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# access_log记录访问的用户、页面、浏览器、ip和其他的访问信息
access_log logs/access.log main;
...
}
这里把上面的log_format去掉注释再重启nginx,发现还有报错nginx: [error] open() "/usr/local/Cellar/nginx/1.21.3/logs/nginx.pid" failed (2: No such file or directory)
每个人的环境不一样,我这里之所以报错是因为这个目录下确实没有这个文件,倒是在另一个目录下找到了这个文件,于是做了修改(参考即可)
pid /usr/local/var/run/nginx.pid;
别忘了sudo nginx -s reload哦!