0°

Nginx 之 ngx_http_fastcgi_module 代理模块

Nginx通过ngx_http_fastcgi_module模块允许将请求传递给FastCGI服务器,一般我们常见通过FastCGI协议通信的应用就是PHP。

官方实例

location / {
    fastcgi_pass  localhost: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;
}

FastCGI语法介绍

设置一个FastCGI服务器的地址,地址可以指定为一个域名或IP地址,以及一个端口
1.fastcgi_pass

Syntax: fastcgi_pass address;
Default:    —
Context:    location, if in location

例如:

#指定域名或者IP地址及域名
fastcgi_pass localhost:9000;

#或指定一个unix域套接字路径
fastcgi_pass unix:/tmp/fastcgi.socket;

#如果你有多台PHP服务器,需要通过FastCGI协议来进行通信,你可以使用upstream模块来包含多台PHP服务器,然后使用FastCGI协议进行转发

2.fastcgi_index
fastcgi_index与平常location中的index一致,指定主页文件名,当通过fastcgi协议访问到后端服务器时,首先会解析我们指定的文件名称。

Syntax: fastcgi_index name;
Default:    —
Context:    http, server, location

3.fastcgi_param
设置应该传递给FastCGI服务器的参数,该值可以包含文本,变量及其组合,当且仅当在当前级别上没有定义fastcgi_param指令时,这些指令从上一级继承。使用fastcgi_param来定义传递给后端服务器什么参数,我个人理解为与Nginx中的proxy_set_header模块作用一样,只是fastcgi_param是通过fastcgi协议进行传输。

Syntax: fastcgi_param parameter value [if_not_empty];
Default:    —
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;

[root@jdyun_blogs nginx]# cat conf/fastcgi_params
#QUERY_STRING参数用于传递请求参数到后端服务器
fastcgi_param  QUERY_STRING       $query_string;

#以下三个参数用于POST请求脚本所支持的配置
fastcgi_param  REQUEST_METHOD     $request_method;      #传递请求方法
fastcgi_param  CONTENT_TYPE       $content_type;        #连接类型
fastcgi_param  CONTENT_LENGTH     $content_length;      #连接长度

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; #传递给后端服务器的脚本名称
fastcgi_param  REQUEST_URI        $request_uri;         #请求的URI
fastcgi_param  DOCUMENT_URI       $document_uri;        #网站目录的URI
fastcgi_param  DOCUMENT_ROOT      $document_root;       #网站目录
fastcgi_param  SERVER_PROTOCOL    $server_protocol;     #从Nginx服务器通过fastcgi传递到后端服务器的协议
fastcgi_param  REQUEST_SCHEME     $scheme;              #调度
fastcgi_param  HTTPS              $https if_not_empty;  #如果指令是用if_not_empty (1.1.11)指定的,那么只有当它的值不为空时,才会把这个参数传递给服务器:

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version; #Nginx版本

fastcgi_param  REMOTE_ADDR        $remote_addr;         #远程客户端地址
fastcgi_param  REMOTE_PORT        $remote_port;         #远程客户端端口
fastcgi_param  SERVER_ADDR        $server_addr;         #服务器地址
fastcgi_param  SERVER_PORT        $server_port;         #服务器端口
fastcgi_param  SERVER_NAME        $server_name;         #服务器名称

# PHP only, required if PHP was built with --enable-force-cgi-redirect
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;
        }






「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论