`
purpen
  • 浏览: 795514 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Fastcgi知识整理

阅读更多

FastCGI中文参考手册

主题 FastCGI中文参考手册 (Perl语言相关部分)
作者 hoowa .sun
出自 www.perlchina.org

想必所有人都了解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.如过程没出现错误说明安装成功。请测试/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
2.下载ActivePerl
http:// hoowa .tab.net.cn/soft/ActivePerl-5.8.0.802-MSWin32-x86.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

1.下载mod_fastcgi-AP1.dll
http://www.fastcgi.com/dist/mod_fastcgi-AP1.dll
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/FCGI-0.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~




请求已发生次数:$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~




请求已发生次数:$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的资源
==============
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
任何网站(非赢利性)转载无需经过作者同意,请保留任何版权声明。
未经作者同意禁止任何杂志转载。
=========================

文章类型:转载 
分享到:
评论

相关推荐

    nginx+fastcgi编译与移植手册

    根据提供的文件内容,我们可以整理出关于Nginx+FastCGI编译与移植的知识点,这些知识点详细地描述了在不同操作系统环境下准备、编译和移植Nginx以及其模块的过程。 1. 准备工作 在开始编译和移植之前,需要下载...

    Win2K3 IIS6 PHP with FastCGI

    以下是根据文章内容整理出来的详细知识点。 首先,PHP从版本5开始支持FastCGI模式。FastCGI是一种常用于增强CGI(Common Gateway Interface)性能的应用程序接口,它可以在Web服务器和应用程序之间持续地处理多个...

    韩顺平老师整理的PHP面试题大全(含答案)

    【PHP面试题大全】是韩顺平老师精心整理的一份涵盖广泛PHP知识的面试资源,旨在帮助PHP开发者准备面试,提升技术能力。这份资料包含了PHP基础、进阶、框架、数据库、Web安全等多个领域的常见问题及答案,是深入理解...

    python入门教程大全.pdf 精心整理

    8. **IIS下配置Python**:在Internet Information Services(IIS)服务器上部署和配置Python应用程序的步骤,涉及WSGI服务器和FastCGI等技术。 9. **Random实例教程**:`random`模块的使用,包括生成随机数、随机选择...

    阅读:整理阅读过的干货文章,帖子

    在IT行业中,不断学习和积累知识是至关重要的。标题和描述提到的是整理阅读过的干货文章和帖子,这...文件"Reading-master"很可能包含了这些领域的文章和帖子,通过阅读和整理,可以进一步巩固和拓宽你的IT知识体系。

    blog:fupengfei058的博客

    目录语言PHP的socket相关函数整理C语言malloc函数原理php中mt_rand()随机数安全的深入理解mmap和madvise的使用php函数的实现原理及性能分析使用生成器优化foreachPHP发送HTTP请求的几种方式swoole4协程原理PHP中$_...

    PHP学习笔记 IIS7下安装配置php环境

    以下是根据给定文件内容整理出的知识点: 1. PHP版本的选择与下载: 在Windows环境下,PHP有两个版本可供选择:VC9x86NonThreadSafe(非线程安全型)和VC9x86ThreadSafe(线程安全型)。前者适用于FastCGI模式,后...

    win2008 iis7/iis7.5下最简单最强安装多版本PHP支持环境

    知识点梳理: 1. Windows Server 2008 R2和IIS7.5下安装多版本PHP环境的需求与准备 在进行PHP环境安装之前,根据文章所述,首先需要确定是否需要配置MySQL数据库。由于IIS对PHP的支持,部分PHP版本运行可能需要安装...

    django 中文资料

    ### Django中文资料知识点详解 #### 一、介绍与新手入门 **Django** 是一个开源的Web框架,基于...以上是根据提供的Django中文资料大纲整理出的主要知识点,涵盖了Django的各个方面,希望对学习Django有所帮助。

Global site tag (gtag.js) - Google Analytics