FastCGI中文参考手册

(Perl语言相关部分
)
作者:
hoowa.sun
想必所有人都了解
CGI技术的通用性与效率有多糟糕。那么本文所描述的所有内容仅限于一种可以
大幅度提高页面处理技术的东东,它的名字叫
FastCGI,他的速度效率最少要比
CGI技术提高
5倍以上
(要知道目前各种流行的页面处理技术
ASP、PHP、JSP/Servlet还没有哪个能超过
)。这并不是一种新技术,
笔者在
2000年第一次用过此技术。大家一定惊讶,既然有这种技术为什么我们还要编写这本参考手册,
原因显而易见,虽然此技术已经产生自今,但中文资料还是少的可怜。好!废话到此为之止。

FastCGI的技术原理
如果想了解
FastCGI的技术原理就要了解何为
"短生存期应用程序
",何为
"长生存期应用程序
"。
先从
CGI技术开刀,以下是
CGI技术的理论:每次当客户请求一个
CGI的时候,
Web服务器就请求
操作系统生成一个新的
CGI进程。当
CGI满足要求后,服务器就杀死这个进程。服务器对客户端的
每个请求都要重复这样的过程。

FastCGI技术的理论为:
FastCGI程序一旦产生后,他可以持续工作
,足够满足客户的请求直到被明
确的终止。如果你希望通过协同处理来提高程序的性能,你可以请求
Web服务器运行多个
FastCGI
应用程序的副本。

CGI就是所谓的短生存期应用程序,
FastCGI就是所谓的长生存期应用程序。
由于
FastCGI程序并不需要不断的产生新进程,可以大大降低服务器的压力。并且产生较高的应用效率。
自今,较为流行的
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、
Pi3Web、Zeus等。

1. Apache服务器安装方法
Linux系统
Apache:
首先需要准备好一些安装包,如果您已经安装过
Apache请参考以下步骤重新编译。

Apache HTTP SERVER
在本文编写的时候,稳定版为
apache.1.3.27。我们这里所使用的是源代码版
http://apache.linuxforum.net/dist/httpd/apache_1.3.27.tar.gz
其他版或则这个地址有错误请到
www.apache.org找相关版本。

Mod_FastCGI
当前是
2.3.0版! http://www.fastcgi.com/dist/mod_fastcgi.tar.gz
如果需要下载其他版或地址有错误请到
www.fastcgi.com
Servers部分找到相关版本。
好!安装包准备完毕,我们可以开始安装过程了。

1.
解压
Apache安装包 tar zxvf apache_1.3.27.tar.gz
2.
解压
mod_fastcgi.tar.gz包
3.
将解压
mod_fastcgi.tar.gz包后的目录复制到
apache_1.3.27解压后目录的
src/modules下并更名为
fastcgi
4.
使用
Apache安装配置命令 ./configure --activate-module=src/modules/fastcgi/libfastcgi.a
5.
执行
make
6.
执行
make install
7.
如过程没出现错误说明安装成功。请测试 <Apache安装后目录>/bin/httpd –l
8.
如果列表中有
mod_fastcgi.c表示成功!
配置 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++;
}
Win32系统
Apache:
准备安装包
1.下载 Apache for win32的版本,我们就下稳定版 1.3.27
http://nagoya.apache.org/mirror/httpd/binaries/win32/apache_1.3.27-win32-x86-no_src.msi
配置 Apache以支持
http服务

1.安装
ActivePerl,最好安装到
C盘,因为
Apache默认是在
C下
2.安装
Apache,装好后修改其目录下的
conf文件夹下的
httpd.conf文件
寻找到
ServerName。这里定义你的域名,如果前面有
#,记得删除它。
寻找到
ServerAdmin。这里输入你的
E-Mail地址。如果你仅仅是单机使用,改不改没什么关系

ServerName下面不远有个
Options和 AllowOverride,将他们后面的参数去掉改为
All,请注
意大小写
配置 Apache以支持
CGI
1.假设
Perl安装在
C:\Perl目录,找到
ScriptAlias /cgi-bin/ "C:/Apache/cgi-bin”(假设您将 apache
装在
c盘下),那么
C:/Apache/cgi-bin就是您存放 cgi的目录
2.在
ScriptAlias 这句下面
,Options和 AllowOverride,将他们后面的参数去掉改为
All
3.寻找到
AddHandler cgi-script .cgi。删除前面的
#,在后面加上
.pl
注意:当您浏览 cgi程序出现 500错误的时候可以看一下您的程序,是不是以:
#!C:\perl\bin\perl开
有。
配置 Apache以支持
Fastcgi

2.将.dll文件复制到
../modules下,并修改 httpd.conf文件,加入这两句
LoadModule fastcgi_module modules/mod_fastcgi-2.4.0-AP1.dll
AddHandler fastcgi-script .fcgi .fpl

3.保存后就可以运行
fcgi程序了
.
注意:如果没有安装
FCGI package,就在命令提示符下输入
ppm
search FCGI
INSTALL FCGI
2. IIS服务器安装方法
3.安装
FCGI.pm模块

Linux系统中:
登陆以下地址 http://www.cpan.org/modules/by-module/FCGI/
下载最新版的
FCGI(在本文编写的时候为)
http://www.cpan.org/modules/by-module/FCGI/FCGI0.67.
tar.gz
解压
tar zxvf FCGI-0.67.tar.gz
编译 perl Makefile.PL
make
make install
完成!

Windows系统中,以及使用
ActivePerl:
进入 MS-DOS模式或
cmd环境
输入 ppm命令

ppm提示符下输入 install FCGI
自动安装
…..
完成

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是一种半成熟(这样说是因为
C语言成熟用了十多年,自今
Java语言与
C++语言都是不断在完
善中)的技术,它经过多年的应用实践已经获得广泛的支持。
FastCGI技术适合各种程序设计上的要求,我们建议使用在以下要求中:

1.想使用
J2EE以外的一种高效率
OpenSource技术。
2.分布式数据库控制系统
3.高访问量页面访问系统
4.性能评测
5.混毕业设计
FastCGI的资源
FastCGI技术官方网站: http://www.fastcgi.com
FastCGI中文讨论组: http://www.ilcatperl.org
中国
Perl组织: http://www.perlchina.org
FastCGI技术案例:
http://www.hotmail.com
http://www.yahoo.com
http://www.donews.com
声明
本文作者:
hoowa.sun
感谢:royce(部分内容是他编写的
)、bloves(找到很多
Bug)
获得方法: http://www.ilcatperl.org
任何网站(非赢利性)转载无需经过作者同意,请保留任何版权声明。
未经作者同意禁止任何杂志转载。