實戰 FastCGI(轉)二

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- 實戰 FastCGI(轉)二 (http://www.webasp.net/article/8/7733.htm)
-- 作者:未知
-- 發佈日期: 2003-09-13
2. 安裝 FastCGI

要使用 FastCGI 你必需有一個可供 FastCGI 程序執行的環境 (run-time environment),以及 撰寫 FastCGI 程序的開發環境。以下就以阿帕契服務器 (Apache Web Server) 做為 FastCGI 的執行平台,簡述如何在阿帕契服務器使用 FastCGI。

由於阿帕契服務器自由、開放、跨平台的特性,現今許多系統或發行套件 (distribution) 都內含阿帕契服務器,如果你直接用預先編譯好的阿帕契程序,請自行找出符合該系統設定規則的安裝路徑。以下列出一些阿帕契服務器相關的路徑設定規則,後面的範例將以阿帕契內定值為主,其它的系統請自行參考:

系統 執行文件路徑 設定文件路徑
阿帕契內定值 /usr/local/apache/bin /usr/local/apache/etc
FreeBSD /usr/local/sbin /usr/local/etc/apache
Red Hat Linux /usr/sbin /usr/etc

2.1 在阿帕契服務器上安裝 FastCGI 模塊
安裝 mod_fastcgi 這個模塊,可以讓你的阿帕契服務器支持 FastCGI 協議。mod_fastcgi 現在最新版本為 2.2.2 版,此版主要適用於 Apache 1.3 版以上。如果你的 Apache 還是 1.2 版,請配合 mod_fastcgi 2.0.18 版使用。以下設定以 Apache 1.3.6 及 mod_fast 2.2.2 為示範。

2.1.1 標準安裝 (利用 APACI)

1. 首先下載 apache_1.3.6.tar.gz 及 mod_fastcgi_2.2.2.tar.gz ,解開:
$ gunzip -c apache_1.3.6.tar.gz | tar xvf -
$ gunzip -c mod_fastcgi_2.2.2.tar.gz | tar xvf -
2. 把 mod_fastcgi 的原始碼複製到 Apache 的目錄下:
$ cp -rp mod_fastcgi_2.2.2 apache_1.3.6/src/modules/fastcgi
3. 設定 Apache 加入 mod_fastcgi 模塊:
$ cd apache_1.3.6
$ ./configure -activate-module=src/modules/fastcgi/libfastcgi.a -enable-module=info -enable-shared=info [ more APACI options ]
4. 編譯及安裝
$ make
$ make install
5. 看一下編譯出來的執行文件是否含有 mod_fastcgi 模塊:
$ /usr/local/apache/sbin/httpd -l
Compiled-in modules:
http_core.c
...
mod_fastcgi.c
...

2.1.2 將 mod_fastcgi 安裝成一個 DSO
假設你已經在系統上安裝好 Apache 1.3 版以上,並且你的平台支持 DSO (Dynamic Shared Object) 的方式動態加入模塊,那麼你可以透過 apxs (APache eXtenSion tool) 將 mod_fastcgi 安裝成一個 DSO 模塊。

1. 下載 mod_fastcgi_2.2.2.tar.gz 並且解開:
$ gunzip -c mod_fastcgi_2.2.2.tar.gz | tar xvf -
2. 編譯 mod_fastcgi 模塊成 DSO:
$ cd mod_fastcgi_2.2.2
$ /usr/local/apache/sbin/apxs -o mod_fastcgi.so -c *.c
3. 安裝
$ /usr/local/apache/sbin/apxs -i -a -n fastcgi mod_fastcgi.so

2.2 加入使用 mod_fastcgi 的相關設定
為了讓 Apache 區分出那一些聯機請求屬於 FastCGI 來處理的,我們必需在阿帕契的設定檔內加入讓 Apache 可以辨別 FastCGI 的設定。

1. mod_fastcgi 模塊會向 Apache 登記一個 fastcgi-script 的處理類型 (handler type),我們可以設定所有以 fcg 以及 fpl (for perl) 為擴展名的程序都是符合 FastCGI 協議的應用程序:
AddHandler fastcgi-script .fcg .fpl
2. 接下來我們定義 /usr/local/www/fcgi-bin 這個目錄用來存放已經寫好的 FastCGI 程序:
ScriptAlias /fcgi-bin/ /usr/local/www/fcgi-bin/
3. 檢查設定檔文法是否正確:
$ /usr/local/apache/sbin/apachectl configtest
Syntax OK
4. 重新激活阿帕契服務器,讓新設定生效:
$ /usr/local/apache/sbin/apachectl graceful
/usr/local/apache/bin/apachectl graceful: httpd gracefully restarted

Apache 1.3.4 版之後將原本的 httpd.conf 、srm.conf、access.conf 合併成一個檔案。所以你所使用的 Apache 如果是 1.3.4 版之後,請直接修改 httpd.conf3 這個檔,如果是 1.3.3 版之前,我建議把 mod_fastcgi 模塊相關設定加在 srm.conf 這個檔裡頭。實際的設定文件路徑和設定文件文件名可能依每個人的環境不同而有差異,請根據您自己的環境做適當的調整。

2.3 安裝 FastCGI 開發套件

1. 下載 fcgi-devkit-2.1.tar.gz 並且解開:
$ gunzip -c fcgi-devkit-2.1.tar.gz | tar xvf -
2. 編譯
$ cd fcgi-devkit-2.1
$ ./configure
$ make
3. 將 C 的標頭檔 (header file) 及函式庫 (library) 安裝至系統:
$ cp -rp include /usr/local/include/fastcgi
$ cp libfcgi/libfcgi.a /usr/local/lib

2.4 測試 FastCGI
在 fcgi-devkit 套件中內含一個簡單的 FastCGI 範例程序 - echo.c,我們用它來做測試系統是否安裝正確。直接把已經編譯好的 echo.fcg 複製到預設放置 FastCGI 程序的目錄下:

$ cd fcgi-devkit-2.1/example
$ cp echo.fcg /usr/local/www/fcgi-bin

現在趕快用瀏覽器連到 http://localhost/fcgi-bin/echo.fcg 看看,如果看到以下結果表示您大功告成啦:

FastCGIecho
Requestnumber1,ProcessID:1013

Nodatafromstandardinput.

Requestenvironment:
FCGI_ROLE=RESPONDER
DOCUMENT_ROOT=/usr/local/apache/htdocs
HTTP_ACCEPT=text/html,text/plain,application/applefile,application/x-metamai
l-patch,sun-deskset-message,mail-file,default,postscript-file,audio-file,
x-sun-attachment,text/enriched,text/richtext,application/andrew-inset,x-be2
,application/postscript,message/external-body,message/partial,application/p
gp,application/pgp,video/mpeg,video/*,image/*,audio/*,audio/mod,text/sgm
l,video/mpeg,image/jpeg,image/tiff,image/x-rgb,image/png,image/x-xbitmap,
image/x-xbm,image/gif,application/postscript,*/*;q=0.01
HTTP_ACCEPT_ENCODING=gzip,compress
HTTP_ACCEPT_LANGUAGE=en
HTTP_HOST=localhost
HTTP_NEGOTIATE=trans
HTTP_USER_AGENT=Lynx/2.8.1pre.9libwww-FM/2.14
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/home/m
yhsu/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/usr/X11R6/bin:/usr/sbin:/opt/kd
e/bin
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=1024
SCRIPT_FILENAME=/usr/local/www/fcgi-bin/echo.fcg
SERVER_ADMIN=myhsu@localhost.localdomain
SERVER_NAME=localhost.localdomain
SERVER_PORT=80
SERVER_SIGNATURE=

Apache/1.3.6Serveratlocalhost.localdomainPort80

SERVER_SOFTWARE=Apache/1.3.6(Unix)mod_fastcgi/2.2.2
UNIQUE_ID=N1ptln8AAAEAAAPdDRkGATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.0REQUEST_METHOD=GETQUERY_STRING=
REQUEST_URI=/fcgi-bin/echo.fcgSCRIPT_NAME=/fcgi-bin/echo.fcg

Initialenvironment:

請注意在以上程序所顯示的 Request number 和 Process ID 這兩個變量,當我們繼續重新加載這支程序時,Request number 會一直累加而 Process ID 的值都不會改變。這表示這支程序在第一次激活之後就一直執行著沒有結束,而且在每次聯機請求中所參照到的變量空間是相同的 (所以 Request number 會不斷加一)。
到此為止,我們已經成功建立起一個可供發展 FastCGI 應用程序的環境及執行 FastCGI 應用程序的網站執行平台。

2.5 安裝 FCGI 模塊 for Perl
如果要使用 Perl 來撰寫 FastCGI 的程序,必須安裝 FCGI.pm 這個模塊,安裝的方法如下:

1. 下載 FCGI-0.45.tar.gz 並且解開
$ gunzip -c FCGI-0.45.tar.gz | tar xvf -
2. 編譯及安裝
$ perl Makefile.PL
$ make
$ make install
3. 測試
$ cp echo.fpl /usr/local/www/fcgi-bin
$ lynx http://localhost/fcgi-bin/echo.fpl
如果順利的話,應該會看到如下的結果:
FastCGI echo (Perl)
Request number 1
No data from standard input.
Request environment:

DOCUMENT_ROOT=/usr/local/apache/htdocs
FCGI_ROLE=RESPONDER
GATEWAY_INTERFACE=CGI/1.1
HTTP_ACCEPT=text/html, text/plain, application/applefile, application/x-metamai
l-patch, sun-deskset-message, mail-file, default, postscript-file, audio-file,
x-sun-attachment, text/enriched, text/richtext, application/andrew-inset, x-be2
, application/postscript, message/external-body, message/partial, application/p
gp, application/pgp, video/mpeg, video/*, image/*, audio/*, audio/mod, text/sgm
l, video/mpeg, image/jpeg, image/tiff, image/x-rgb, image/png, image/x-xbitmap,
image/x-xbm, image/gif, application/postscript, */*;q=0.01
HTTP_ACCEPT_ENCODING=gzip, compress
HTTP_ACCEPT_LANGUAGE=en
HTTP_HOST=localhost
HTTP_NEGOTIATE=trans
HTTP_USER_AGENT=Lynx/2.8.1pre.9 libwww-FM/2.14
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/home/m
yhsu/bin:/usr/X11R6/bin:/usr/sbin:/opt/kde/bin:/usr/X11R6/bin:/usr/sbin:/opt/kd
e/bin
QUERY_STRING=
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=1427
REQUEST_METHOD=GET
REQUEST_URI=/fcgi-bin/echo.fpl
SCRIPT_FILENAME=/usr/local/www/fcgi-bin/echo.fpl
SCRIPT_NAME=/fcgi-bin/echo.fpl
SERVER_ADMIN=myhsu@localhost.localdomain
SERVER_NAME=localhost.localdomain
SERVER_PORT=80
SERVER_PROTOCOL=HTTP/1.0
SERVER_SIGNATURE=

Apache/1.3.6 Server at localhost.localdomain Port 80
SERVER_SOFTWARE=Apache/1.3.6 (Unix) mod_fastcgi/2.2.2
UNIQUE_ID=N1VIbX8AAAEAAAQnKKo
More on its way ... wait a few seconds
Initial environment:

同樣的,如果持續連結 http://localhost/fcgi-bin/echo.fpl 可以看到 Request Number 不斷增加,表示 echo.fpl 已經被激活而且持續執行著。

至此,一個可供執行 FastCGI 程序的網站服務器以及撰寫 FastCGI 程序的開發環境已經建置完成,接下來就只等著新的程序放上去囉。

webasp.net