问题:
使用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模块
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论