欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

fastcgi原理 及 fastcgi_param 详解

程序员文章站 2024-02-21 10:45:46
...

一、FastCGI是什么?

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。

FastCGI的工作原理是:

1、Web Server 启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module,nginx 下 fastcgi 与服务器是分离的,fastcgi 可有lighttpd 下的 spawan-cgi或者 php-fpm 来管理));
2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。
4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi.exe在此便退出了。

在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

二、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']  

三. 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   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_hide_header,fastcgi_ignore_headers,fastcgi_pass_header
fastcgi_cache
这个命令是开启fastcgi的文件缓存。这个缓存可以将动态的页面存为静态的。以提供为加速或者容灾使用。

相关标签: PHP nginx php-fpm