macOS使用brew搭建nginx php环境 浏览器运行访问 提示 File not found 错误

问题:

使用php-fpm解析PHP,如果提示 "No input file specified"、"File not found"等之类的话语时,是令nginx新手非常头疼的常见错误,原因是php-fpm进程找不到SCRIPT_FILENAME配置的要执行的.php文件,php-fpm返回给nginx的默认404错误提示。

解决:

使用brew命令安装完nginx和php之后,在nginx.conf中的默认配置中, 对于php-fpm的配置是有问题的!SCRIPT_FILENAME 原配置中的 值为/scripts$fastcgi_script_name; 需要修改为 $document_root$fastcgi_script_name; 这样才能使路径随着上面设置的root进行变化,否则当访问一个php文件时就会出现File not found 的问题。


另外 务必删去 location ~ \.php$ {里面的root项},并在location外层添加root项。(这一步骤,视自己的需求情况而定,通常情况下 这一步骤是需要做的。)


最终nginx转发到php的实际配置如下:

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;
       	}

这样配置完成后 重启或重载nginx,再用浏览器访问就可以解析php了。

其它注意事项:

1、nginx.conf是nginx的配置文件,在同级文件夹下还有个文件:nginx.conf.default,是配置文件的默认备份,当你想使用默认nginx时,可重命名使用nginx.conf.default文件


2、如果使用brew services start nginx命令启动nginx之后,终端提示启动成功,但是实际查看nginx进程,却发现有时候并不会真正的启动成功,则可以 以超管权限进行启动,命令如下:

sudo brew services start nginx

一、fastcgi_param 更多参数配置详解:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;#脚本文件请求的路径
fastcgi_param  QUERY_STRING       $query_string; #请求的参数;如?app=123
fastcgi_param  REQUEST_METHOD     $request_method; #请求的动作(GET,POST)
fastcgi_param  CONTENT_TYPE       $content_type; #请求头中的Content-Type字段
fastcgi_param  CONTENT_LENGTH     $content_length; #请求头中的Content-length字段。
 
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; #脚本名称 
fastcgi_param  REQUEST_URI        $request_uri; #请求的地址不带参数
fastcgi_param  DOCUMENT_URI       $document_uri; #与$uri相同。
fastcgi_param  DOCUMENT_ROOT      $document_root; #网站的根目录。在server配置中root指令中指定的值 
fastcgi_param  SERVER_PROTOCOL    $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
 
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;#cgi 版本
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;#nginx 版本号,可修改、隐藏
 
fastcgi_param  REMOTE_ADDR        $remote_addr; #客户端IP
fastcgi_param  REMOTE_PORT        $remote_port; #客户端端口
fastcgi_param  SERVER_ADDR        $server_addr; #服务器IP地址
fastcgi_param  SERVER_PORT        $server_port; #服务器端口
fastcgi_param  SERVER_NAME        $server_name; #服务器名,域名在server配置中指定的server_name

#fastcgi_param  PATH_INFO         $path_info;#可自定义变量  
  
# PHP only, required if PHP was built with --enable-force-cgi-redirect  
#fastcgi_param  REDIRECT_STATUS    200;  
  
在php可打印出上面的服务环境变量  
如:echo $_SERVER['REMOTE_ADDR']

二、其它相关补充:

2.1、nginx的fastcgi模块提供的命令

fastcgi_pass:

这个命令是 指定 将http代理到哪个fastcgi服务端接口。fastcgi_pass后面是填写fastcgi服务端地址的,这个地址可以是域地址,也可以是Uninx-域套接字。

fastcgi_pass localhost:9000;
 
fastcgi_pass unix:/tmp/fastcgi.socket;

这里的设置需要和fastcgi自身配置的listen_address做相应地对应。


fastcgi_param:

这个命令是设置fastcgi请求中的参数,具体设置的东西可以在$_SERVER中获取到。

比如 你想要设置当前的机器环境,可以使用fastcgi_param ENV test;来设置。


对于php来说,最少需要设置的变量有:

fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
fastcgi_param QUERY_STRING    $query_string;


对于POST请求,还需要设置:

fastcgi_param REQUEST_METHOD content_type;
fastcgi_param CONTENT_LENGTH $content_length;


fastcgi_param 还可以使用 if_not_empty 进行设置。意思是 如果value非空 才进行设置。

fastcgi_param HTTPS   $https if_not_empty;


fastcgi_index

这个命令设置了fastcgi默认使用的脚本。就是 当SCRIPT_FILENAME没有命中脚本的时候,使用的就是fastcgi_index设置的脚本。


以上三个命令能组成最基本的fastcgi设置了(示例如下):

location / {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
 
  fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$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;
}

三、资料补充:

nginx中文文档之ngx_http_fastcgi_module模块



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

小周博客
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复 0人评论 7,777人参与

loading