mac部署nginx + php 时,问题总结

1,484 阅读2分钟

部署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哦!