1. 介紹性指南 mod_perl 是個龐大而復雜的工具,它內建了許多模塊幫助你方便地構建動態網站。這篇指南的目的是幫助你構建一個良好的 mod_perl 模塊,並從中理解 mod_perl 的實現技術。我並不推薦使用這裡介紹的技術來建立一個大型站點,尤其對於一個剛剛涉足 mod_perl 的人來說。但我推薦大家可以深入看一下它的一些內建的方案,比如 Mason, AxKit, EmbPerl, Apache::ASP 和 PageKit 等等。 1.1. 你需要什麼? 本指南假設你已經有過安裝和測試 mod_perl 的經驗。以及較新版本的 Apache 的安裝經驗。因為有可能你需要在你的機器上實現時適當的修改本文提供的配置。我們需要你安裝一些模塊並且需要進入 Apache 的配置目錄作修改。所以最好你有 root 權限來做這些事情。當然你還需要一個文本編輯器。 1.2. 切入正題 mod_perl 模塊也是 Perl 模塊,但它有較為特別的設計。最方便的創建一個 Perl 模塊的方法就是使用標准的 Perl 分發自帶的工具 h2xs 。你可以在命令行模式鍵入 h2xs 來看看它的參數列表。現在,到一個適當的目錄開始一個新項目,鍵入: h2xs -A -X -n Apache::Tutorial::First h2xs 將會創建目錄 Apache, 以及其他一些子目錄.現在進入最深一級的目錄看看: cd Apache/Tutorial/First 在這個新目錄裡面,你可以看到 5 個文件: Changes, First.pm, MANIFEST, Makefile.PL 和 test.pl。它們的作用如下: Changes 這個文件作為你的項目的修改日志(changelog)文件 First.pm 這是主模塊文件,包含你的 mod_perl 句柄代碼(handler code)。 MANIFEST 本文件用於自動構建 tar.gz 類型的模塊版本分發。這樣你就可以把你的模塊拿到 CPAN 發布或者分發給其他人。它包含了你在這個項目中所有文件的列表。 Makefile.PL 這是標准的 Perl Makefile 構造器。用於創建 Makefile.PL 文件來編譯該模塊。 test.pl 針對該模塊的一些測試腳本。默認情況下它只是檢查模塊的編譯和載入 好了,現在我們開始把 First.pm 變為可工作的 mod_perl 模塊。使用文本編輯器打開該文件,修改後的內容如下: package Apache::Tutorial::First; use strict; use vars qw/$VERSION/; use Apache::Constants; $VERSION = 0.01; sub handler { my $r = shift; $r->send_http_header('text/Html'); print "<html><body>Hello World</body></html>"; return OK; } 1; 不要忘記文件末尾的"1;",對於 Perl 來說,一個模塊最後返回的非零值表示該模塊已經被成功編譯。 1.3. 安裝你的模塊 h2xs 工具使我們的模塊安裝工作極為方便。在和你的 First.pm 文件相同的目錄中。、,鍵入: perl Makefile.PL make make test 如果 make test 成功的話,你需要以 root 身份執行: make install 這樣你就把你的模塊安裝到了 perl 的庫目錄(library Directory)。 1.4. 添加該模塊為 Apache 的一個句柄(handler)現在我們需要進入 Apache 配置目錄來修改配置文件,使我們的模塊作為 Apache 內容處理階段的處理器。打開 httpd.conf 文件,在末尾加入如下配置: <Location /mod_perl_tutorial> SetHandler perl-script PerlHandler Apache::Tutorial::First </Location> 然後保存配置文件,並且重新啟動 apache 服務器: apachectl stop apachectl start 現在使用浏覽器訪問 http://localhost/mod_perl_tutorial ,你將如期的看到顯示 "Hello World" 頁面。
2. 這裡都發生了些什麼? 好,在這裡都發生了什麼事情呢? 當 Apache 啟動的時候,它讀取它的配置指令並把適當的命令傳遞給相應的處理該命令的模塊。這裡有兩個相關的指令 SetHandler 和 PerlHandler. 第一個指令 SetHandler 由 mod_mime 模塊處理,該指令表示使用什麼模塊作為處理請求的主要部分。這裡所設置的 perl-script 表示使用 mod_perl 來處理請求。 第二個指令 PerlHandler 由 mod_perl 模塊來處理,它只是簡單的說明使用我們的模塊來處理請求的主要部分。有一點需要注意,無論何時在你有一個 PerlHandler 時,你需要相應的 SetHandler perl-script 配置指令。這樣才能使你的 mod_perl 代碼起作用。我總是認為這是一個弱點,但這將涉及 Apache 內部的處理機制,所以在將來這也很難改變。 現在請求來了,Apache 查看用什麼模塊來處理相應的 URI 並且在這裡決定使用 mod_perl,而 mod_perl 知道它必須把請求發送給我們的模塊,並調用我們模塊的 handler() 函數作為 Apache::Request 對象的第一個參數。而我們的 handler() 函數的返回值決定了下一步 Apache 將要做什麼。現在我們知道返回值 OK 意味著一切成功。 OK 是個從 Apache::Constants 模塊導出的常量。
3. 調試 如果你沒有看到 "Hello World", 那你可能看到了一個錯誤頁面,或者其他什麼完全不同的。第一步去查看錯誤日志看看到底是什麼發生了錯誤。我習慣於在浏覽器中請求後立即查看錯誤日志。你可以使用 tail 工具: tail -f /path/to/apache/logs/error_log (使用你的真實 error_log 路徑替換上面的路徑。如果你不肯定它在哪裡,查看你的 httpd.conf 文件的 ErrorLog 指令部分) 現在重新載入頁面,然後 error_log 將告訴你什麼地方出現了問題。更多的關於 perl 調試,請參見 perldebug.
4. 加入更多 現在如果你想要針對上面的情況作一些修改,該如何做呢?不幸的,唯一一種安裝模式如下: 修改你的 First.pm 文件 重新以 root 身份運行 make install 重新啟動 Apache 這也許很麻煩,特別是重新啟動 Apache。針對這個問題,我們可以另外安裝一個特別設計的模塊來避免每次這樣麻煩的做。首先你需要從 CPAN 下載並安裝 Apache::Reload 模塊(除非你已經使用 mod_perl 1.26 或者更高版本)。在這裡 http://search.cpan.org/search?dist=Apache-Reload 下載。 解開 tar.gz 文件並進入新目錄,執行: perl Makefile.PL make 然後到 root 身份執行: make install 現在再次打開 httpd.conf 文件,加入: PerlInitHandler Apache::Reload 這將測試所有有所改變的模塊並在必要時自動重新載入新模塊。這對於開發來說很有用,但會有性能損失,所以在開發完成之後,就將該特性關閉。