java fastcgi_FastCGI中文参考手册

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找相关版本。

好!安装包准备完毕,我们可以开始安装过程了。

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.

如过程没出现错误说明安装成功。请测试 /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:

准备安装包

配置 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~

FastCGI

$count

~;

}

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~

FastCGI

$count

~;

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的资源

声明

本文作者:

hoowa.sun

感谢:royce(部分内容是他编写的

)、bloves(找到很多

Bug)

获得方法:http://www.ilcatperl.org

任何网站(非赢利性)转载无需经过作者同意,请保留任何版权声明。

未经作者同意禁止任何杂志转载。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值