實戰 FastCGI(轉)一

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- 實戰 FastCGI(轉)一 (http://www.webasp.net/article/8/7734.htm)
-- 作者:未知
-- 發佈日期: 2003-09-13
實戰 FastCGI
作 者: 許明彥
Abstract:
當網站日益走紅,聯機人數直線上升而心中暗自竊喜之時,突然客服中心湧來大批反應電話:『網站連不上去』、『按下去等好久畫面才出來』、『一直出現 Server Too Busy...』...。看來又要把硬件升級了,但是再加更多的內存,更多 CPU、換更貴的機器真的能解決問題嗎?有沒有比較省錢的方法呢?本文將介紹如何在阿帕契服務器上安裝 FastCGI 的模塊,如何設定及使用 FastCGI 網站應用程序,讓你的網站程序在現有的架構上以全速執行。
----------------------------------------------------------------------------

1. 克服 CGI 的瓶頸
1.1 令人頭痛的效率問題
1.2 一些解決之道
1.3 更好的方法 - FastCGI
2. 安裝 FastCGI
2.1 在阿帕契服務器上安裝 FastCGI 模塊
2.1.1 標準安裝 (利用 APACI)
2.1.2 將 mod_fastcgi 安裝成一個 DSO
2.2 加入使用 mod_fastcgi 的相關設定
2.3 安裝 FastCGI 開發套件
2.4 測試 FastCGI
2.5 安裝 FCGI 模塊 for Perl
3. 撰寫 FastCGI 應用程序
3.1 程序架構
3.2 引入 fcgi_stdio.h 標頭檔
3.3 FastCGI 處理循環
3.4 煉結 libfcgi.a 函式庫
3.5 撰寫 FastCGI 程序的注意事項
4. FastCGI 有多快?
4.1 評比工具 - ApacheBench
4.2 CGI vs. FastCGI
4.3 找出 Memory Leak
5. 參考
About this document ...

----------------------------------------------------------------------------

1. 克服 CGI 的瓶頸

1.1 令人頭痛的效率問題
拜 CGI 之賜,網站不再只有固定不變的圖形和文字,藉由程序動態產生的網頁可以讓網站好像『活』了起來。小從簡單的網頁計數器,留言版,大至處理眾多資料的搜尋引擎,可做線上實時交易的電子商務、網絡下單等。CGI 簡單、開放、跨平台、與程序語言獨立的特性,使得撰寫網站應用程序變得很容易。

但隨著網站使用量日增,這些 CGI 程序從原本動態網頁的功臣,突然成了網站效率的頭號殺手。由於 CGI 先天的限制1,突然湧入大量的聯機請求 (request) ,常會造成網站主機瞬間資源被佔用,彷彿『當機』一樣,或是處理速度變得很慢。

另一個常遇到的限制是和數據庫聯機的問題,如果 CGI 程序後端需要聯機至數據庫執行指令再取得結果,突然大量的聯機請求可能會超過數據庫系統容許聯機的上限 (例如數據庫系統使用者數目的限制)。

因此對一個主要以使用 CGI 程序製作動態網站的開發者而言,解決 CGI 執行效率瓶頸成了一個頭痛的問題。以一個股市實時行情報價的網站為例,每天的聯機請求將近八成集中在股市開盤的尖峰時段內,更是對網站應用程序極大的考驗。

1.2 一些解決之道
現在已經有許多方案被提出來以解決 CGI 執行效率上的瓶頸,在『用 FastCGI 加速你的網站』一文中也有簡單的說明,這裡僅就筆者在開發股市實時報價的網站應用程序時,所嘗試過的一些方法提出個人的經驗和意見。以筆者的案例而言,原本的 CGI 程序是以 C 語言寫的,並且用了其它的 C 函式庫所以下列的方法主要是以提供 C 語言開發環境的方案為主。

NSAPI
由於原先網站是在 Unix 系統上,網站服務器使用網景 Enterprise Server,所以最早想到是用 NSAPI 來改寫網站應用程序。在網景的網站上有非常詳細的 NSAPI 使用手冊,不幸的是沒有中文手冊。要用 NSAPI 改寫網站應用程序最麻煩的是你要把所有程序編譯成動態函式庫 (share library),以供 Enterprise Server 在 run-time 時期可以動態呼叫這些程序。由於利用 NSAPI 所寫的程序是直接從 Web Server 的執行空間內被呼叫,所以速度最快,但是程序必須遵循 Enterprise Server 的撰寫規則,而且一旦程序發生錯誤, Web Server 也會受影響。

ISAPI
相較於 NSAPI ,在 Microsoft NT IIS (Internet Information Server) 平台就是 ISAPI 了。類似 NSAPI ,利用 ISAPI 撰寫網站應用程序,必須把應用程序編譯成動態函式庫,也就是 DLL 檔。它的執行速度也很快,但要遵循 ISAPI 的撰寫規則和數據結構,程序發生錯誤時也會影響 IIS Server 的正常運作。
綜觀以上兩種以 Web Server API 為主的方案 (其實 Apache 也有相對應的 Server API,只是用的人可能更少) ,它們的執行速度都很快,就產生動態網頁而言比 CGI 快上好幾倍。但是就程序開發者的角度2來看,它們有一些缺點:

1. NSAPI 及 ISAPI 與網站平台相依性太高 (Platform dependency),也就是說使用了 NSAPI 或 ISAPI 後,應用程序就完全受限於所使用的網站服務器平台,不能變換所使用的網站服務器。不像 CGI 完全不受網站平台的限制,可以在任何網站服務器 (Netscape, Microsoft IIS, Apache, NCSA)上執行。另外像 ISAPI 更只能限制在 Windows NT 平台上使用。
2. NSAPI 及 ISAPI 只提供 C 程序語言的界面,亦即開發者一定要使用 C 語言開發。不像 CGI 是與開發者所使用的程序語言完全無關,除了 C 之外,常用的還有 Perl,Tcl等。
3. Netscape Enterprise Server 和 Microsoft IIS 都是以多執行緒 (Multi-Threads) 的方式處理 NSAPI 及 ISAPI 的程序,所有執行緒共享同一塊變量空間,因此在變量數據的處理上要特別小心,以確保每一個執行緒內的變量資料的安全,不會互相影響。
4. NSAPI 和 ISAPI 應用程序都是直接在服務器的執行行程 (process) 內被呼叫,如果程序當掉了,整個網站服務器都會被影響。CGI 當掉服務器會響應 Internal Server Error 的訊息,服務器本身不受影響。
5. NSAPI 和 ISAPI 應用程序必須被服務器呼叫才會被執行,偵錯 (debug) 相當不容易。

1.3 更好的方法 - FastCGI
如果你正飽受 CGI 效率不佳之苦,又不想受限於 NSAPI 及 ISAPI ,也沒有大筆銀子去買昂貴的 Application Server,我建議你試試看 FastCGI。

不同於 NSAPI 及 ISAPI 以及其它的網頁服務器語言 (如 ASP, PHP3, mod_perl),FastCGI 比較類似 CGI,它只是一個網站應用程序設計的規格,因此先天上不受任何網站服務器平台,操作系統平台,以及開發語言的限制,但又能大幅改善 CGI 效率不良的問題。FastCGI 的特色如下:

1. FastCGI 像是一個常駐 (long-live) 型的 CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去 fork 一次 (這是 CGI 最為人詬病的 fork-and-execute 模式)。
2. FastCGI 可在任何平台上使用,Netscape Enterprise 及 IIS 都有 FastCGI 的模塊可供使用,阿帕契 (Apache,以及利用 Apache 衍生出做的服務器) 上也有 mod_fastcgi 可用。
3. FastCGI 支持 C/C++,Perl,Tcl,Java,Python 等程序語言。
4. FastCGI 的應用程序亦兼容於 CGI。即 FastCGI 的應用程序也可以當成 CGI 來執行。
5. 現有的 CGI 程序要改寫成 FastCGI 非常簡單,最少可能只需要多加入三行程序代碼。
6. FastCGI 的偵錯方式與 CGI 大同小異,只要帶入程序所需的環境變量及參數,即可在命令列模式執行或偵錯。
7. FastCGI 應用程序的寫作方式與 CGI 類似,除了幾項原則要特別注意外,FastCGI 的寫作方式跟 CGI 幾乎一樣,與學習 Web Server API 比較起來, FastCGI 簡單多了。
8. FastCGI 支授分佈式運算 (distributed computing),即 FastCGI 程序可以在網站服務器以外的主機上執行並且接受來自其它網站服務器來的請求。

看到 FastCGI 這些特色後,是否躍躍欲試呢。下一章將介紹如何在 Apache 服務器上安裝 FastCGI 的步驟。

webasp.net