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

 

posted @ 2021-02-05 09:25  20988902  阅读(244)  评论(0)    收藏  举报