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