Nginx 之 ngx_http_fastcgi_module 代理模块
Nginx通过ngx_http_fastcgi_module模块允许将请求传递给FastCGI服务器,一般我们常见通过FastCGI协议通信的应用就是PHP。
官方实例
1 location / { 2 fastcgi_pass localhost:9000; 3 fastcgi_index index.php; 4 fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name; 5 fastcgi_param QUERY_STRING $query_string; 6 fastcgi_param REQUEST_METHOD $request_method; 7 fastcgi_param CONTENT_TYPE $content_type; 8 fastcgi_param CONTENT_LENGTH $content_length; 9 }
FastCGI语法介绍
设置一个FastCGI服务器的地址,地址可以指定为一个域名或IP地址,以及一个端口
1.fastcgi_pass
1 Syntax: fastcgi_pass address; 2 Default: — 3 Context: location, if in location
例如:
1 #指定域名或者IP地址及域名 2 fastcgi_pass localhost:9000; 3 4 #或指定一个unix域套接字路径 5 fastcgi_pass unix:/tmp/fastcgi.socket; 6 7 #如果你有多台PHP服务器,需要通过FastCGI协议来进行通信,你可以使用upstream模块来包含多台PHP服务器,然后使用FastCGI协议进行转发
2.fastcgi_index
fastcgi_index与平常location中的index一致,指定主页文件名,当通过fastcgi协议访问到后端服务器时,首先会解析我们指定的文件名称。
1 Syntax: fastcgi_index name; 2 Default: — 3 Context: http, server, location
3.fastcgi_param
设置应该传递给FastCGI服务器的参数,该值可以包含文本,变量及其组合,当且仅当在当前级别上没有定义fastcgi_param指令时,这些指令从上一级继承。使用fastcgi_param来定义传递给后端服务器什么参数,我个人理解为与Nginx中的proxy_set_header模块作用一样,只是fastcgi_param是通过fastcgi协议进行传输。
1 Syntax: fastcgi_param parameter value [if_not_empty]; 2 Default: — 3 Context: http, server, location
fastcgi_param的语法与proxy_set_header指令还不太一样,proxy_set_header指令可以自定文本然后指定Nginx内置变量再将文本得到的值传递给后端服务器,而fastcgi_param则是有固定的文本和指定的Nginx内置变量,这些可用文本和变量放在nginx家目录下的conf/fastcgi_param文件中。
例如,以下是将Nginx内置变量$query_string传递给QUERY_STRING来完成将连接状态信息向后端进行传递
fastcgi_param QUERY_STRING $query_string;
1 [root@jdyun_blogs nginx]# cat conf/fastcgi_params 2 #QUERY_STRING参数用于传递请求参数到后端服务器 3 fastcgi_param QUERY_STRING $query_string; 4 #以下三个参数用于POST请求脚本所支持的配置 5 fastcgi_param REQUEST_METHOD $request_method; #传递请求方法 6 fastcgi_param CONTENT_TYPE $content_type; #连接类型 7 fastcgi_param CONTENT_LENGTH $content_length; #连接长度 8 fastcgi_param SCRIPT_NAME $fastcgi_script_name; #传递给后端服务器的脚本名称 9 fastcgi_param REQUEST_URI $request_uri; #请求的URI 10 fastcgi_param DOCUMENT_URI $document_uri; #网站目录的URI 11 fastcgi_param DOCUMENT_ROOT $document_root; #网站目录 12 fastcgi_param SERVER_PROTOCOL $server_protocol; #从Nginx服务器通过fastcgi传递到后端服务器的协议 13 fastcgi_param REQUEST_SCHEME $scheme; #调度 14 fastcgi_param HTTPS $https if_not_empty; #如果指令是用if_not_empty (1.1.11)指定的,那么只有当它的值不为空时,才会把这个参数传递给服务器: 15 fastcgi_param GATEWAY_INTERFACE CGI/1.1; 16 fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; #Nginx版本 17 fastcgi_param REMOTE_ADDR $remote_addr; #远程客户端地址 18 fastcgi_param REMOTE_PORT $remote_port; #远程客户端端口 19 fastcgi_param SERVER_ADDR $server_addr; #服务器地址 20 fastcgi_param SERVER_PORT $server_port; #服务器端口 21 fastcgi_param SERVER_NAME $server_name; #服务器名称 22 # PHP only, required if PHP was built with --enable-force-cgi-redirect 23 fastcgi_param REDIRECT_STATUS 200; #如果PHP是用--enable-force-cgi-redirect配置参数构建的,那么REDIRECT_STATUS参数的值也应该是“200”:
我们在默认使用中,会将以上参数全部开启的,例如
include fastcgi_params;
但是除了以上配置,我们还需要指定一个SCRIPT_FILENAME参数,这个是fastcgi_param文件中没有的
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
SCRIPT_FILENAME参数用于确定脚本名
/usr/local/nginx/html用于指定网站目录,(PHP代码项目所在的目录)
$fastcgi_script_name变量值包含了网站目录下的所有文件,只是用于变量获取。
比如我们访问了 https://k8sops.cn/admin/login.php 那么我们网站的根目录就是我们上面指定的 /usr/local/nginx/html,而 $fastcgi_script_name 获取的就是 admin/login.php,这样就组成了一段完整的URI,将这段完整的URI赋值给 SCRIPT_FILENAME
4.fastcgi_keep_conn
默认情况下,FastCGI服务器将在发送响应后立即关闭连接。但是,当这个指令被设置为值on时,nginx将指示FastCGI服务器保持连接打开。
fastcgi_keep_conn on | off;
案例配置
我们平常使用中使用以下配置足以满足需求
location / {
root /usr/local/nginx/html;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
}
以上的 /usr/local/nginx/html也可以使用$document_root变量去自动获取,改写为如下
location / {
root /usr/local/nginx/html;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
如果你想做到动静分离,那么就让.php文件让php处理,其它的像静态的图片以及静态的页面交给Nginx处理则配置如下
location ~* \.php$ { #以 .php 结尾的文件通过fastcgi协议转发给后端服务器处理
root /usr/local/nginx/html;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location / { #如果以上没有匹配到 .php 结尾的文件,则在此由Nginx处理
root /usr/local/nginx/html;
index index.html index.htm;
}

浙公网安备 33010602011771号