learn.log - 进程管理器fastcgi原理及fastcgi_param详解

一、 何为FastCGI?  in all : 快-不崩溃-优雅 fast-strong-high

    FastCGI官方站点:http://www.fastcgi.com。common gateway interface,CGI解释器的反复加载时CGI性能低下(low)的主要原因。因而CGI解析器保持在内存中并接收FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。FastCGI的存在还避免了某个CGI管理器突然崩溃的问题。FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解析器进程保存在内存中并因此获得较高的性能。

    FastCGI的工作原理是:

    1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module,nginx下fastcgi与服务器是分离 的,fastcgi :9000 可有lighttpd下的spawan-cgi或者php-fpm管理)。

    2、FastCGI进程管理器自身初始化,启动多个CGI解析器进程并等待来自web server的连接。

    3、当客户端请求到达web server时,FastCGI进程管理器选择并连接到一个CGI解释器。web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe

    4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回web server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在web server中)的连接。在正常的CGI模式中,php-cgi.exe在此便退出了。

    Now you can know how slow if cgi is "alone": 每一个web请求都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构.

    But when it is not "alone" because of "FastCGI": 所有这些只在进程启动时发生一次.

    And they make a "son" : Persistent database connection can hold to work.

二、"stay hungry,stay foolish" is bring you idea of survival .

    无论是IIS ISAPI还是Apache Module  作为web server,多线程CGI解释器总是不够strong而崩溃。而FastCGI的出现当然是为了解决这个问题。新强者必然out多线程CGI解释器。物竞天择,适者生存。

三、FastCGI的技术原理

    让我们先了解what is "短生存期应用程序" and "长生存期应用程序"

    Let me talk about "CGI" and "FastCGI": 

    CGI: 每当客户请求web server,web server请求OS生成一个新CGI进程。当CGI满足要求后,web server会  要求杀死这个进程。服务器对客户端的每个请求都要重复这样的过程。

    FastCGI: 程序一旦产生,将持续工作到客户的请求被明确终止。

    FastCGI不需要不断产生新进程,不需要不断重复加载和解析。因而极大地降低了服务器的压力(if your pressure is bug , if small , smart people can know it seem nothing help ,emmmm, like one connection , in all .)。生活例子,比比皆是。如果需要协同工作,可以请求web server运行多个worker - fastCGI应用程序的副本。

    to now,较为流行的Java语言Servlet技术与FastCGI的技术设计有异曲同工之处。

四、FastCGI的特点

    1.打破传统页面处理技术

    传统的页面处理技术,程序必须与web服务器或Application服务器处理同一台服务器中。而FastCGI技术的应用程序在被安装在服务器群的任何一台服务器,可通过TCP/IP协议与web服务器通讯,this make us can 开发大型分布式web群 and 高效数据库 control。

    2.明确的请求模式

    CGI技术没有明确的role,but inFastCGI procedure :分工明细,响应器role,认证期role,过滤器role

    3.合理的程序结构

    完全规范的结构 make your procedure to be efficiently

    稳定性:fastcgi是以独立的进程池来运行cgi,单独一个进程死掉,OS将重新分配新进程来运行逻辑

    安全性:fastcgi和宿主的server完全独立,fastcgi怎么down也不会崩掉server

    高性能:fastcgi把动态逻辑的处理从server中分离出来,大负荷的IO处理还是留给宿主server。大量的静态IO处理完全不需要逻辑程序的参与

    扩展性:fastcgi是中立的技术标准,完全支持任何语言写的处理程序(java,php,python)

    目前fastcgi和server沟通还不够智能,一个fastcgi进程如果执行时间过长会被当成死进程杀掉重起,这样处理长时间任务的时候很麻烦,这样做也使得fastcgi无法允许联机调试

    SCGI等类似的技术都可以替换fastcgi,SCGI在python中很成功,功能完备,SCGI也开始支持rails了(python社区牛人太多,精力旺盛搞了个SCGI)rails流行。

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/fastc

这里的设置需要和fastcgi自身配置的listen_address做相应地对应。
比如上面那个例子,listen_addree就应该这么配置:

<value name="listen_address">/tmp/fastcgi.socket</value>


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的文件缓存。这个缓存可以将动态的页面存为静态的。以提供为加速或者容灾使用。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值