FastCGI技术参考


一个网站的性能,主要表现在以下几个方面:系统响应时间、处理时间、用户等待时间和系统的输出负载,如果考虑经济因素还要加上技术成本。要提高网站的性能,在不改变硬件和网络结构的基础上,那么就是把精力放在优秀的程序编码上。
FastCGI Implementation details
Instead of creating a new process for each request, FastCGI uses persistent processes to handle a series of requests. These processes are owned by the FastCGI server, not the web server.
To service an incoming request, the web server sends environment information and the page request itself to a FastCGI process over a socket (in the case of local FastCGI processes on the web server) or TCP connection (for remote FastCGI processes in a server farm). Responses are returned from the process to the web server over the same connection, and the web server subsequently delivers that response to the end-user. The connection may be closed at the end of a response, but both the web server and the FastCGI service processes persist.
Each individual FastCGI process can handle many requests over its lifetime, thereby avoiding the overhead of per-request process creation and termination. Processing of multiple requests simultaneously can be achieved in several ways: by using a single connection with internal multiplexing (i.e. multiple requests over a single connection); by using multiple connections; or by a combination of these techniques. Multiple FastCGI servers can be configured, increasing stability and scalability.
Web site administrators and programmers can find that the separation of web applications from the web server in FastCGI has many advantages over embedded interpreters (mod_perl, mod_php, etc.). This separation allows server and application processes to be restarted independently – an important consideration for busy web sites. It also enables the implementation of per-application / hosting service security policies, which is an important requirement for ISPs and web hosting companies. Different types of incoming requests can be distributed to specific FastCGI servers which have been equipped to handle those particular types of requests efficiently.
FastCGI的技术原理
如果想了解FastCGI的技术原理就要了解何为"短生存期应用程序",何为"长生存期应用程序"。
先从CGI技术说起,以下是CGI技术的理论:每次当客户请求一个CGI的时候,Web服务器就请求操作系统生成一个新的CGI进程。当CGI满足要求后,服务器就杀死这个进程。服务器对客户端的每个请求都要重复这样的过程。
而FastCGI技术的理论为:FastCGI程序一旦产生后,他可以持续工作,足够满足客户的请求直到被明确的终止。如果你希望通过协同处理来提高程序的性能,你可以请求Web服务器运行多个FastCGI 应用程序的副本。
CGI就是所谓的短生存期应用程序,FastCGI就是所谓的长生存期应用程序。
由于FastCGI程序并不需要不断的产生新进程,可以大大降低服务器的压力,并且产生较高的应用效率。当负载很低时,CGI能很好地工作,但是一个大型的站点上的各种不同类型的请求随时发生,在客户请求的负载很高时,服务器进程的设置和初始化所用的时间就成为网站性能的瓶颈。特别是像和数据库这样的应用程序连接时,初始化所用的时间较长。
自今,较为流行的Java语言Servlet技术在设计上是以参考FastCGI的技术运行所设计。
FastCGI的特点
1. 打破传统页面处理技术
传统的页面处理技术,程序必须与Web服务器或Application服务器处于同一台服务器中。这种历史已经早N年被FastCGI技术所打破,FastCGI技术的应用程序可以被安装在服务器群中的任何一台服务器,而通过TCP/IP协议与Web服务器通讯,这样做既适合开发大型分布式Web 群,也适合高效数据库控制。
2. 明确的请求模式
CGI技术没有一个明确的角色,在FastCGI程序中,程序被赋予明确的角色(响应器角色、认证器角色、过滤器角色)。
3. 合理的程序结构
起初,真的很讨厌FastCGI应用程序的结构要求。没关系,您经过一段时间编写后就会喜欢这种结构,只有这种完全规范的结构才能让您的程序更有效率。
FastCGI技术支持语言与Web服务器
在本手册中仅介绍如何用Perl语言来实现FastCGI技术。实际,只要符合FastCGI技术规范,都可以使用本技术。FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。
FastCGI技术需要在Web服务器中安装支持部分才能运行,目前这部分已经完全支持:Apache、IIS、Nginx等。
配置Apache的httpd.conf
1).设置FastCGI文件的处理类型,请在httpd.conf包含Addhandler部分添加一句
AddHandler fastcgi-script .fcgi .fpl
这样,Apache就知道.fcgi与.fpl处理为fastcgi文件
2).还要为您的网站设置ScriptAlias解析,这个解析很容易,与普通CGI设置方式相同
ScriptAlias /fcgi-bin/ /usr/local/apache/fcgi-bin/
我这里这样设置后fcgi程序将安装在/usr/local/apache/fcgi-bin/下
测试安装test.fcgi
#!/usr/bin/perl
use FCGI;
my $count =0;
my $request = FCGI::Request();
while($request->Accept() >= 0) {
print “Content-type: text/html\n\n”;
print $count++;
}
当然前提是已经安装好FCGI.pm模块。
FastCGI的程序结构
一个FastCGI的应用程序主要包含两部分:初始化部分、回应循环部分。
#初始化编码
#开始回应循环
#回应内容
#回应结束循环
#!/usr/bin/perl
#以下内容都是初始化部分
use FCGI;
my $count =0;
my $request = FCGI::Request();
#以下内容都是回应部分
while($request->Accept() >= 0) {
print “Content-type: text/html\n\n”;
print $count++;
}
当应用程序被初始化后,初始编码仅仅只运行一次。初始编码就像开启数据库和编译后的应用程序一样常常是十分耗时的操作。
整个回应部分循环始复,直到客户要求终止。回应循环部分从调用FCGI_Accept开始。FCGI_Accept程序执行后会挂启程序(程序循环部分虽在内存中,但是并不运行),除非客户对FastCGI应用程序发出请求。客户的请求一旦到达程序,FCGI_Accept会运行回应部分的内容一次,然后再次中止程序,等待客户下一个请求的到来。整个回应循环部分只会在系统管理员或者Web服务器杀死了FastCGI应用程序后才能消除。
FastCGI应用程序举例
1).一个典型的FastCGI应用程序,这个程序将在初始化部分初始变量$count为0,每次请求运行都将累加一。
#!/usr/bin/perl
use FCGI;
use strict;
my $count = 0;
my $request = FCGI::Request;
while($request->Accept >=0){
$count++;
print “Content-type: text/html\n\n”;
print qq~
<HTML>
<HEAD>
<TITLE>FastCGI</TITLE>
</HEAD>
<BODY>请求已发生次数:$count
</BODY>
</HTML>~;
}
2).FastCGI程序为长生存期应用程序,如在设计中有缺陷会产生内存溢出问题,对服务器造成安全隐患。且这种溢出是不可预见性。本程序初始化了一个控制变量,一旦用户请求次数达到预先设置的数量程序结束,下一次请求将重新初始化。
#!/usr/bin/perl
use FCGI;
use strict;
my $count = 0;
my $request = FCGI::Request;
my $session_life = 1000;
while($request->Accept >=0){
$count++;
print “Content-type: text/html\n\n”;
print qq~
<HTML>
<HEAD>
<TITLE>FastCGI</TITLE>
</HEAD>
<BODY>请求已发生次数:$count
</BODY>
</HTML>~;
if ($count>$session_life) {
end;
}
}
编写FastCGI的规范要求
FastCGI应用程序对编写者提出了一种严格要求的挑战。
1.在程序头必须加载strict模块。格式为use strict;
2.任何变量的使用之前一定不要忘记声明变量my $variable;
3.不要将一些初始化的内容放在回应部分,这样不仅无法提高效率还会降低效率。例如对数据库的连接部分。
4.同样,也不要把什么东西都放在初始化部分。
5.在程序调试后发现有BUG或修改,请先直接修改程序。然后杀死系统中的程序进程,要不你的修改永远不被执行。如果杀不好,就重启Apache吧。
FCGI.pm模块的使用
模块名称:Fast CGI Module
使用格式:
use FCGI;
$request = FCGI::Request();
while($request->Accept() >=0) {
#CGI Process..
}
FCGI支持的使用方法:
FCGI::Request
$request = FCGI::Request(
$input_fh,
$output_fh,
$error_fh,
fileno($socket),
);
$input_fh,$output_fh,$error_fh是设置input/output/error的句柄,默认情况下分别是STDIN、STDOUT、STDERR
$socket的用处在分离FastCGI应用程序与Web服务器的情况下才需要使用。它允许程序通过设置的套接字与Web服务器通讯。
FCGI::OpenSocket(path, backlog)
在程序中创建一个套接字,在建立独立的FastCGI应用程序中用到。
FCGI::CloseSocket(socket)
关闭打开的FCGI::OpenSocket。
$request->Accept
当有新的请求产生,以上句子返回0,其他情况下返回-1。
$request->Attach
重新设置文件句柄连接到相关服务器上。
$request->Detach
临时分离文件句柄。
$request->Finish
结束当前请求,这本来由Accept来自动完成,但有写程序中在返回给客户请求后可能需要做一些其他工作,比如操作数据库。
$request->Flush
清洗当前连接中的所有输入输出。
$env = $req->GetEnvironment()
返回来环境变量。
($in, $out, $err) = $req->GetHandles()
返回标准文件句柄。
$isfcgi = $req->IsFastCGI()
返回当前程序运行的状态是否FastCGI。
FastCGI的效率与应用范围
效率这个词不仅仅一词出现过。我也不仅一次讲解过效率的由来。
现在所有的解释性语言(Perl、Java、Python)的运行效率,都要比编译形语言(ANSI C)慢的多(一到几十倍)。但奇怪的是,大家似乎看到的是Jsp/Servlet不错的效率。这是因为在网络世界中,对效率的影响不在语言的本身,而在以下几个方面:
1、技术模型
2、系统I/O带宽
3、程序设计
FastCGI是一种半成熟的技术,它经过多年的应用实践已经获得广泛的支持。
参考来源:FastCGI中文参考手册 (Perl语言相关部分),原作者:hoowa .sun,作者有改动。
FastCGI Implementation details
Instead of creating a new process for each request, FastCGI uses persistent processes to handle a series of requests. These processes are owned by the FastCGI server, not the web server.
To service an incoming request, the web server sends environment information and the page request itself to a FastCGI process over a socket (in the case of local FastCGI processes on the web server) or TCP connection (for remote FastCGI processes in a server farm). Responses are returned from the process to the web server over the same connection, and the web server subsequently delivers that response to the end-user. The connection may be closed at the end of a response, but both the web server and the FastCGI service processes persist.
Each individual FastCGI process can handle many requests over its lifetime, thereby avoiding the overhead of per-request process creation and termination. Processing of multiple requests simultaneously can be achieved in several ways: by using a single connection with internal multiplexing (i.e. multiple requests over a single connection); by using multiple connections; or by a combination of these techniques. Multiple FastCGI servers can be configured, increasing stability and scalability.
Web site administrators and programmers can find that the separation of web applications from the web server in FastCGI has many advantages over embedded interpreters (mod_perl, mod_php, etc.). This separation allows server and application processes to be restarted independently – an important consideration for busy web sites. It also enables the implementation of per-application / hosting service security policies, which is an important requirement for ISPs and web hosting companies. Different types of incoming requests can be distributed to specific FastCGI servers which have been equipped to handle those particular types of requests efficiently.
FastCGI的技术原理
如果想了解FastCGI的技术原理就要了解何为"短生存期应用程序",何为"长生存期应用程序"。
先从CGI技术说起,以下是CGI技术的理论:每次当客户请求一个CGI的时候,Web服务器就请求操作系统生成一个新的CGI进程。当CGI满足要求后,服务器就杀死这个进程。服务器对客户端的每个请求都要重复这样的过程。
而FastCGI技术的理论为:FastCGI程序一旦产生后,他可以持续工作,足够满足客户的请求直到被明确的终止。如果你希望通过协同处理来提高程序的性能,你可以请求Web服务器运行多个FastCGI 应用程序的副本。
CGI就是所谓的短生存期应用程序,FastCGI就是所谓的长生存期应用程序。
由于FastCGI程序并不需要不断的产生新进程,可以大大降低服务器的压力,并且产生较高的应用效率。当负载很低时,CGI能很好地工作,但是一个大型的站点上的各种不同类型的请求随时发生,在客户请求的负载很高时,服务器进程的设置和初始化所用的时间就成为网站性能的瓶颈。特别是像和数据库这样的应用程序连接时,初始化所用的时间较长。
自今,较为流行的Java语言Servlet技术在设计上是以参考FastCGI的技术运行所设计。
FastCGI的特点
1. 打破传统页面处理技术
传统的页面处理技术,程序必须与Web服务器或Application服务器处于同一台服务器中。这种历史已经早N年被FastCGI技术所打破,FastCGI技术的应用程序可以被安装在服务器群中的任何一台服务器,而通过TCP/IP协议与Web服务器通讯,这样做既适合开发大型分布式Web 群,也适合高效数据库控制。
2. 明确的请求模式
CGI技术没有一个明确的角色,在FastCGI程序中,程序被赋予明确的角色(响应器角色、认证器角色、过滤器角色)。
3. 合理的程序结构
起初,真的很讨厌FastCGI应用程序的结构要求。没关系,您经过一段时间编写后就会喜欢这种结构,只有这种完全规范的结构才能让您的程序更有效率。
FastCGI技术支持语言与Web服务器
在本手册中仅介绍如何用Perl语言来实现FastCGI技术。实际,只要符合FastCGI技术规范,都可以使用本技术。FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。
FastCGI技术需要在Web服务器中安装支持部分才能运行,目前这部分已经完全支持:Apache、IIS、Nginx等。
配置Apache的httpd.conf
1).设置FastCGI文件的处理类型,请在httpd.conf包含Addhandler部分添加一句
AddHandler fastcgi-script .fcgi .fpl
这样,Apache就知道.fcgi与.fpl处理为fastcgi文件
2).还要为您的网站设置ScriptAlias解析,这个解析很容易,与普通CGI设置方式相同
ScriptAlias /fcgi-bin/ /usr/local/apache/fcgi-bin/
我这里这样设置后fcgi程序将安装在/usr/local/apache/fcgi-bin/下
测试安装test.fcgi
#!/usr/bin/perl
use FCGI;
my $count =0;
my $request = FCGI::Request();
while($request->Accept() >= 0) {
print “Content-type: text/html\n\n”;
print $count++;
}
当然前提是已经安装好FCGI.pm模块。
FastCGI的程序结构
一个FastCGI的应用程序主要包含两部分:初始化部分、回应循环部分。
#初始化编码
#开始回应循环
#回应内容
#回应结束循环
#!/usr/bin/perl
#以下内容都是初始化部分
use FCGI;
my $count =0;
my $request = FCGI::Request();
#以下内容都是回应部分
while($request->Accept() >= 0) {
print “Content-type: text/html\n\n”;
print $count++;
}
当应用程序被初始化后,初始编码仅仅只运行一次。初始编码就像开启数据库和编译后的应用程序一样常常是十分耗时的操作。
整个回应部分循环始复,直到客户要求终止。回应循环部分从调用FCGI_Accept开始。FCGI_Accept程序执行后会挂启程序(程序循环部分虽在内存中,但是并不运行),除非客户对FastCGI应用程序发出请求。客户的请求一旦到达程序,FCGI_Accept会运行回应部分的内容一次,然后再次中止程序,等待客户下一个请求的到来。整个回应循环部分只会在系统管理员或者Web服务器杀死了FastCGI应用程序后才能消除。
FastCGI应用程序举例
1).一个典型的FastCGI应用程序,这个程序将在初始化部分初始变量$count为0,每次请求运行都将累加一。
#!/usr/bin/perl
use FCGI;
use strict;
my $count = 0;
my $request = FCGI::Request;
while($request->Accept >=0){
$count++;
print “Content-type: text/html\n\n”;
print qq~
<HTML>
<HEAD>
<TITLE>FastCGI</TITLE>
</HEAD>
<BODY>请求已发生次数:$count
</BODY>
</HTML>~;
}
2).FastCGI程序为长生存期应用程序,如在设计中有缺陷会产生内存溢出问题,对服务器造成安全隐患。且这种溢出是不可预见性。本程序初始化了一个控制变量,一旦用户请求次数达到预先设置的数量程序结束,下一次请求将重新初始化。
#!/usr/bin/perl
use FCGI;
use strict;
my $count = 0;
my $request = FCGI::Request;
my $session_life = 1000;
while($request->Accept >=0){
$count++;
print “Content-type: text/html\n\n”;
print qq~
<HTML>
<HEAD>
<TITLE>FastCGI</TITLE>
</HEAD>
<BODY>请求已发生次数:$count
</BODY>
</HTML>~;
if ($count>$session_life) {
end;
}
}
编写FastCGI的规范要求
FastCGI应用程序对编写者提出了一种严格要求的挑战。
1.在程序头必须加载strict模块。格式为use strict;
2.任何变量的使用之前一定不要忘记声明变量my $variable;
3.不要将一些初始化的内容放在回应部分,这样不仅无法提高效率还会降低效率。例如对数据库的连接部分。
4.同样,也不要把什么东西都放在初始化部分。
5.在程序调试后发现有BUG或修改,请先直接修改程序。然后杀死系统中的程序进程,要不你的修改永远不被执行。如果杀不好,就重启Apache吧。
FCGI.pm模块的使用
模块名称:Fast CGI Module
使用格式:
use FCGI;
$request = FCGI::Request();
while($request->Accept() >=0) {
#CGI Process..
}
FCGI支持的使用方法:
FCGI::Request
$request = FCGI::Request(
$input_fh,
$output_fh,
$error_fh,
fileno($socket),
);
$input_fh,$output_fh,$error_fh是设置input/output/error的句柄,默认情况下分别是STDIN、STDOUT、STDERR
$socket的用处在分离FastCGI应用程序与Web服务器的情况下才需要使用。它允许程序通过设置的套接字与Web服务器通讯。
FCGI::OpenSocket(path, backlog)
在程序中创建一个套接字,在建立独立的FastCGI应用程序中用到。
FCGI::CloseSocket(socket)
关闭打开的FCGI::OpenSocket。
$request->Accept
当有新的请求产生,以上句子返回0,其他情况下返回-1。
$request->Attach
重新设置文件句柄连接到相关服务器上。
$request->Detach
临时分离文件句柄。
$request->Finish
结束当前请求,这本来由Accept来自动完成,但有写程序中在返回给客户请求后可能需要做一些其他工作,比如操作数据库。
$request->Flush
清洗当前连接中的所有输入输出。
$env = $req->GetEnvironment()
返回来环境变量。
($in, $out, $err) = $req->GetHandles()
返回标准文件句柄。
$isfcgi = $req->IsFastCGI()
返回当前程序运行的状态是否FastCGI。
FastCGI的效率与应用范围
效率这个词不仅仅一词出现过。我也不仅一次讲解过效率的由来。
现在所有的解释性语言(Perl、Java、Python)的运行效率,都要比编译形语言(ANSI C)慢的多(一到几十倍)。但奇怪的是,大家似乎看到的是Jsp/Servlet不错的效率。这是因为在网络世界中,对效率的影响不在语言的本身,而在以下几个方面:
1、技术模型
2、系统I/O带宽
3、程序设计
FastCGI是一种半成熟的技术,它经过多年的应用实践已经获得广泛的支持。
参考来源:FastCGI中文参考手册 (Perl语言相关部分),原作者:hoowa .sun,作者有改动。
该文章最后由 阿炯 于 2020-10-11 19:13:57 更新,目前是第 2 版。