📄 1272.html
字号:
Apache 1.3.4 版之后将原本的 httpd.conf 、srm.conf、access.conf 合并成一个档案。所以你所使用的 Apache 如果是 1.3.4 版之后,请直接修改 httpd.conf3 这个档,如果是 1.3.3 版之前,我建议把 mod_fastcgi 模块相关设定加在 srm.conf 这个档里头。实际的设定文件路径和设定文件文件名可能依每个人的环境不同而有差异,请根据您自己的环境做适当的调整。<br>
<br>
2.3 安装 FastCGI 开发套件<br>
<br>
1. 下载 fcgi-devkit-2.1.tar.gz 并且解开:<br>
$ gunzip -c fcgi-devkit-2.1.tar.gz | tar xvf -<br>
2. 编译<br>
$ cd fcgi-devkit-2.1<br>
$ ./configure<br>
$ make<br>
3. 将 C 的标头档 (header file) 及函式库 (library) 安装至系统:<br>
$ cp -rp include /usr/local/include/fastcgi<br>
$ cp libfcgi/libfcgi.a /usr/local/lib<br>
<br>
2.4 测试 FastCGI<br>
在 fcgi-devkit 套件中内含一个简单的 FastCGI 范例程序 - echo.c,我们用它来做测试系统是否安装正确。直接把已经编译好的 echo.fcg 复制到预设放置 FastCGI 程序的目录下:<br>
<br>
$ cd fcgi-devkit-2.1/example<br>
$ cp echo.fcg /usr/local/www/fcgi-bin<br>
<br>
现在赶快用浏览器连到 http://localhost/fcgi-bin/echo.fcg 看看,如果看到以下结果表示您大功告成啦:<br>
<br>
FastCGIecho<br>
Requestnumber1,ProcessID:1013<br>
<br>
Nodatafromstandardinput.<br>
<br>
Requestenvironment:<br>
FCGI_ROLE=RESPONDER<br>
DOCUMENT_ROOT=/usr/local/apache/htdocs<br>
HTTP_ACCEPT=text/html,text/plain,application/applefile,application/x-metamai<br>
l-patch,sun-deskset-message,mail-file,default,postscript-file,audio-file,<br>
x-sun-attachment,text/enriched,text/richtext,application/andrew-inset,x-be2<br>
,application/postscript,message/external-body,message/partial,application/p<br>
gp,application/pgp,video/mpeg,video/*,image/*,audio/*,audio/mod,text/sgm<br>
l,video/mpeg,image/jpeg,image/tiff,image/x-rgb,image/png,image/x-xbitmap,<br>
image/x-xbm,image/gif,application/postscript,*/*;q=0.01<br>
HTTP_ACCEPT_ENCODING=gzip,compress<br>
HTTP_ACCEPT_LANGUAGE=en<br>
HTTP_HOST=localhost<br>
HTTP_NEGOTIATE=trans<br>
HTTP_USER_AGENT=Lynx/2.8.1pre.9libwww-FM/2.14<br>
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/home/m<br>
yhsu/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/usr/X11R6/bin:/usr/sbin:/opt/kd<br>
e/bin<br>
REMOTE_ADDR=127.0.0.1<br>
REMOTE_PORT=1024<br>
SCRIPT_FILENAME=/usr/local/www/fcgi-bin/echo.fcg<br>
SERVER_ADMIN=myhsu@localhost.localdomain<br>
SERVER_NAME=localhost.localdomain<br>
SERVER_PORT=80<br>
SERVER_SIGNATURE=<br>
<br>
Apache/1.3.6Serveratlocalhost.localdomainPort80<br>
<br>
SERVER_SOFTWARE=Apache/1.3.6(Unix)mod_fastcgi/2.2.2<br>
UNIQUE_ID=N1ptln8AAAEAAAPdDRkGATEWAY_INTERFACE=CGI/1.1<br>
SERVER_PROTOCOL=HTTP/1.0REQUEST_METHOD=GETQUERY_STRING=<br>
REQUEST_URI=/fcgi-bin/echo.fcgSCRIPT_NAME=/fcgi-bin/echo.fcg<br>
<br>
Initialenvironment:<br>
<br>
请注意在以上程序所显示的 Request number 和 Process ID 这两个变量,当我们继续重新加载这支程序时,Request number 会一直累加而 Process ID 的值都不会改变。这表示这支程序在第一次激活之后就一直执行着没有结束,而且在每次联机请求中所参照到的变量空间是相同的 (所以 Request number 会不断加一)。<br>
到此为止,我们已经成功建立起一个可供发展 FastCGI 应用程序的环境及执行 FastCGI 应用程序的网站执行平台。<br>
<br>
2.5 安装 FCGI 模块 for Perl<br>
如果要使用 Perl 来撰写 FastCGI 的程序,必须安装 FCGI.pm 这个模块,安装的方法如下:<br>
<br>
1. 下载 FCGI-0.45.tar.gz 并且解开<br>
$ gunzip -c FCGI-0.45.tar.gz | tar xvf -<br>
2. 编译及安装<br>
$ perl Makefile.PL<br>
$ make<br>
$ make install<br>
3. 测试<br>
$ cp echo.fpl /usr/local/www/fcgi-bin<br>
$ lynx http://localhost/fcgi-bin/echo.fpl<br>
如果顺利的话,应该会看到如下的结果:<br>
FastCGI echo (Perl)<br>
Request number 1<br>
No data from standard input.<br>
Request environment:<br>
<br>
DOCUMENT_ROOT=/usr/local/apache/htdocs<br>
FCGI_ROLE=RESPONDER<br>
GATEWAY_INTERFACE=CGI/1.1<br>
HTTP_ACCEPT=text/html, text/plain, application/applefile, application/x-metamai<br>
l-patch, sun-deskset-message, mail-file, default, postscript-file, audio-file,<br>
x-sun-attachment, text/enriched, text/richtext, application/andrew-inset, x-be2<br>
, application/postscript, message/external-body, message/partial, application/p<br>
gp, application/pgp, video/mpeg, video/*, image/*, audio/*, audio/mod, text/sgm<br>
l, video/mpeg, image/jpeg, image/tiff, image/x-rgb, image/png, image/x-xbitmap,<br>
image/x-xbm, image/gif, application/postscript, */*;q=0.01<br>
HTTP_ACCEPT_ENCODING=gzip, compress<br>
HTTP_ACCEPT_LANGUAGE=en<br>
HTTP_HOST=localhost<br>
HTTP_NEGOTIATE=trans<br>
HTTP_USER_AGENT=Lynx/2.8.1pre.9 libwww-FM/2.14<br>
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/home/m<br>
yhsu/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/usr/X11R6/bin:/usr/sbin:/opt/kd<br>
e/bin<br>
QUERY_STRING=<br>
REMOTE_ADDR=127.0.0.1<br>
REMOTE_PORT=1427<br>
REQUEST_METHOD=GET<br>
REQUEST_URI=/fcgi-bin/echo.fpl<br>
SCRIPT_FILENAME=/usr/local/www/fcgi-bin/echo.fpl<br>
SCRIPT_NAME=/fcgi-bin/echo.fpl<br>
SERVER_ADMIN=myhsu@localhost.localdomain<br>
SERVER_NAME=localhost.localdomain<br>
SERVER_PORT=80<br>
SERVER_PROTOCOL=HTTP/1.0<br>
SERVER_SIGNATURE=<br>
<br>
Apache/1.3.6 Server at localhost.localdomain Port 80<br>
SERVER_SOFTWARE=Apache/1.3.6 (Unix) mod_fastcgi/2.2.2<br>
UNIQUE_ID=N1VIbX8AAAEAAAQnKKo<br>
More on its way ... wait a few seconds<br>
Initial environment:<br>
<br>
同样的,如果持续连结 http://localhost/fcgi-bin/echo.fpl 可以看到 Request Number 不断增加,表示 echo.fpl 已经被激活而且持续执行着。<br>
<br>
至此,一个可供执行 FastCGI 程序的网站服务器以及撰写 FastCGI 程序的开发环境已经建置完成,接下来就只等着新的程序放上去啰。<br>
<br>
----------------------------------------------------------------------------<br>
<br>
3. 撰写 FastCGI 应用程序<br>
<br>
撰写全新的 FastCGI 应用程序,或是将旧有的 CGI 程序改写成 FastCGI 应用程序都非常的简单,只要使用 fcgi-devkit 所附的 fcgi_stdio 函式库即可。<br>
<br>
基本上,fcgi_stdio 函式库已被设计成让开发人员撰写 FastCGI 应用程序就像写一般 CGI 程序一样,同时做到程序保有和 CGI 最大的兼容度,又能享受到 FastCGI 所带来的优点。使用 fcgi_stdio 函式库的另一项好处是,编译出来的执行档可同时以 CGI 以及 FastCGI 的方式执行。<br>
<br>
3.1 程序架构<br>
对 CGI 程序而言,其生命期就是从一个联机请求 (request) 开始到联机结束。而 FastCGI 程序就像是比较『长命』的 CGI 程序,其生命期横跨不同的联机请求,可从 Web 服务器激活开始到 Web 服务器停止。<br>
<br>
由于 FastCGI 程序长命的特性,它和一般 CGI 程序主要的差异就在于把初始化 (initialization) 的部份和处理联机请求的部份区分开来,程序的架构如下所示:<br>
<br>
Initialization Code<br>
Start of response loop<br>
<br>
body of response loop<br>
End of response loop<br>
<br>
Initialization Code 的部份只会在 FastCGI 程序激活时执行一次,程序初始化的部份像是内存的配置,建立和数据库的联机等都可以写在这里。<br>
<br>
而 Start of response loop 到 End of response loop 之间的程序在每次发生联机请求时就会执行,这部份的程序才是真正处理每次联机请求要做的事情。例如接受使用者输入的参数,从数据库取出资料,执行运算动作,回复结果给使用者等等。<br>
<br>
一个简单的 FastCGI 程序如下 (tiny-fcgi.c)<br>
<br>
#include "fcgi_stdio.h"<br>
#include <stdlib.h><br>
void main(void)<br>
{<br>
/* Initialization Code */<br>
int count = 0;<br>
/* Start of response loop */<br>
while(FCGI_Accept() >= 0) {<br>
/* body of response loop */<br>
printf("Content-type: text/html
"<br>
"
"<br>
"<title>FastCGI Hello! (C, fcgi_stdio library)</title>"<br>
"<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"<br>
"Request number %d running on host <i>%s</i> "<br>
"Process ID: %d",<br>
++count, getenv("SERVER_NAME"), getpid());<br>
}<br>
/* End of response loop */<br>
}<br>
<br>
3.2 引入 fcgi_stdio.h 标头档<br>
开始撰写一个新的 FastCGI 应用程序时,必须引入 fcgi_stdio.h 这个标头档:<br>
<br>
#include ``fcgi_stdio.h''<br>
如果要改写旧有的 CGI 程序成 FastCGI 程序,请把原本引入 stdio.h 的部份换掉:<br>
<br>
#ifndef FASTCGI<br>
#include <stdio.h><br>
#else<br>
#include ``fcgi_stdio.h''<br>
#endif<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -