46.5. Apache 模組

Apache 軟體屬於模組設計:除了部分核心工作,其餘所有功能皆由模組處理。這種進步幅度很大,甚至連 HTTP 都是由模組 (http_core) 處理。

Apache 模組可以在 Buildtime 編譯成 Apache 二進位檔案,或是在 Runtime 動態載入。如需有關 Runtime 載入的詳細資訊,請參閱 節 46.3.2.2.1, "LoadModule module_identifier /path/to/module " 了解手動載入模組,以及參閱 模組 了解使用 YaST 載入模組。

SUSE Linux 中的 Apache 已在 apache2 RPM (這裡省略字首「mod_」) 中,隨附提供下列可用模組:access、actions、alias、asis、auth、auth_anon、auth_dbm、auth_digest、auth_ldap、autoindex、cache、case_filter、case_filter_in、cern_meta、cgi、charset_lite、dav、dav_fs、deflate、dir、disk_cache、dumpio、echo、env、expires、ext_filter、file_cache、headers、imap、include、info、ldap、log_config、log_forensic、logio、mem_cache、mime、mime_magic、negotiation、proxy、proxy_connect、proxy_ftp、proxy_http、rewrite、setenvif、speling、ssl、status、suexec、unique_id、userdir、usertrack 與 vhost_alias。此外,SUSE Linux 還提供下列 Apache 模組,作為需要個別安裝的 RPM 套件:apache2-mod_auth_mysqlapache2-mod_fastcgiapache2-mod_macroapache2-mod_murkaapache2-mod_perlapache2-mod_php4apache2-mod_php5apache2-mod_pythonapache2-mod_ruby

本節將針對這些模組中的部分模組進一步討論說明。如需基本版本中的其他模組說明,請造訪 Apache 模組網站,位址是 http://httpd.apache.org/docs-2.0/mod/。如需取得協力廠商模組,請造訪 http://modules.apache.org/

Apache 模組可以細分為三種不同類別:基本模組、延伸模組和外部模組。

46.5.1. 基本模組

基本模組會依預設編譯到 Apache。這些模組可以提供使用,除非已在 Buildtime 明確省略。SUSE Linux Apache 只有編譯最少的基本模組,但是所有這些模組都可以用共用物件方式取得:這些模組並非包含在 /usr/sbin/httpd2 二進位檔案本身,而是透過設定 APACHE_MODULES,在 Runtime 包含到 /etc/sysconfig/apache2

46.5.1.1. 伺服器端包含 mod_include

mod_include 提供了在將資料傳送給用戶端之前的檔案處理方法。一般說來,mod_include 是用來為文件包含在送達用戶端之前會依序分析成 HTML 的檔案。這就是其稱為 Server-Side Includes (SSI) 的原因。

使用 SSI 時,伺服器端就會在受到格式化 SGML 註解觸發時,執行特殊指令。這些 SGML 指令會提供下列語法:

<!--#element attribute=value -->
        

如需元件屬性值的清單,請參閱 http://httpd.apache.org/docs-2.0/mod/mod_include.html 所提供的 mod_include 說明文件。

如果要在 SUSE Linux 使用 mod_include,請在 /etc/sysconfig/apache2APACHE_MODULES 加入 include,或是使用 模組 所介紹的 YaST。

[Tip]提示

使用 XBitHack 指示詞 (http://httpd.apache.org/docs-2.0/mod/mod_include.html#xbithack),指示 Apache 透過 SSI 指示詞的 execute 位元集來分析檔案。

這樣表示,您不需要變更檔案副檔名來標示其中包含 SSI 元件 (如上面範例中的 .shtml),而是使用一般的 .html 檔案並執行 chmod +x myfile.html 就可進行分析。

46.5.1.2. 通用閘道介面:mod_cgi

mod_cgi 可讓 Apache 傳送由外部 CGI (Common Gateway Interface) 程式或程序檔所建立的內容。它會扮演介於實體電腦之可用程式設計語言和 Apache 網頁伺服器之間的例項。理論上,CGI 程序檔可以用任何程式設計語言來編寫。通常會使用類似 PerlC 等程式設計語言。 mod_cgi 是在網站中包含動態內容的常用方法。

CGI 程式設計不同於「一般」程式設計;因為 CGI 程式和程序檔必須能夠產生 Content-type: text/html MIME 類型來建立 HTML 輸出。

範例 46.11. 下面是使用 Perl 的簡單 CGI 程序檔

#!/path/to/perl
print "Content-type: text/html\n\n";
print "Hello, World.";
            

繫結至程式設計語言 (例如 mod_php5) 和 mod_cgi 等模組之間的差異,在於是否可以結合 mod_cgimod_suexec (請參閱 節 46.5.2.1, "使用 mod_suexec,依據不同使用者身份來執行 CGI ")。這個結合結果,可讓 CGI 程序檔透過指定使用者 ID 來執行。通常,單獨使用 mod_cgimod_php5 的程序檔,會以 Apache 使用者的使用者 ID (SUSE Linux 的預設設定:wwwrun) 來執行。針對程式設計語言所設計的模組 (例如 mod_php5mod_ruby),會在 Apache 中內嵌常駐解譯器,以便在該 Apache 使用者 ID 之下執行程序檔。

這樣一來,透過 mod_suexec 的 CGI 就可提高系統管理明確性,因為 CGI 處理程序會指派給個別使用者,而不是指派給網頁伺服器本身。同時,檔案系統也會因為採用下列組合而提高安全性:程序檔只會繼承使用者的檔案系統權限。如果是使用模組,程序檔會獲得網頁伺服器的使用者檔案許可權,這可能會造成檔案系統資料不慎外洩。

當用戶端向網頁伺服器發出的要求停止時,CGI 就會終止。這樣表示 CGI 不是常駐程式,而且會在終止之後釋放所有佔用的資源。這項優點在程式設計不正確時更能顯出其妙用。而使用模組時,因為解譯器屬常駐型,所以程式設計的錯誤效應會一直累積。這樣可能會導致無法釋出資源,例如資料庫連線,最後必須重新啟動 Apache。

如果要在 SUSE Linux 使用 mod_cgi,請在 /etc/sysconfig/apache2APACHE_MODULES 加入 cgi,或是使用 模組 所介紹的 YaST。在 SUSE Linux 中的預設 CGI 目錄是 /srv/www/cgi-bin/

如果要手動編輯 Apache 組態檔案,請依照下面範例作為設定 mod_cgi 的指示方針。

範例 46.12. 手動啟動 mod_cgi

# Global Environment
LoadModule cgi_module /path/to/mod_cgi.so

# Main Server and/or Virtual Host and/or
# Directory and/or .htaccess context
AddHandler cgi-script .cgi .pl

# Main Server and/or Virtual Host context
ScriptAlias /cgi-bin/ /srv/www/cgi-bin/

# Alternatively, explicitly allow CGI scripts in a directory
# Main Server and/or Virtual Host context
<Directory /srv/www/some/dir> 
	Options +ExecCGI
<Directory> 

46.5.2. 延伸模組

一般說來,Apache 軟體套件會包含標示為延伸的模組,但是通常不會使用靜態方式將這些模組編譯到伺服器中。在 SUSE Linux 中,這類模組可以依照共用物件方式,在 Runtime 時載入到 Apache 提供使用。

46.5.2.1. 使用 mod_suexec,依據不同使用者身份來執行 CGI

結合 mod_cgi (節 46.5.1.2, "通用閘道介面:mod_cgi ") 和 mod_suexec,便可依照特定使用者和群組來執行 CGI 程序檔。您必須使用 /usr/sbin/suexec2 中的 suEXEC 程式,來達到這個目的。Apache 會在每次執行 CGI 程序檔或程式時,呼叫這個包裝函式。接著,包裝函式和程式都會取得所指派的設定使用者和群組 ID。這樣就可依據設定的使用者或群組來執行。

雖然這項方法可以大幅降低使用者產生 CGI 程序檔時的相關安全性風險,但是在使用時仍要考量下列重要事項:

使用 suEXEC 的考量

  • suEXEC docroot -- 所有程序檔都會限制在這個基本目錄中執行。這樣表示搭配 suexec 的程序檔一定要在 docroot 內執行,否則將會產生錯誤。docroot 會在 suEXEC 編譯期間進行設定,而且不能在 Runtime 進行變更。SUSE Linux 的預設設定是 /srv/www

  • uidmin -- 這是指使用者在透過 suEXEC 執行程序檔時,必須具備的最小 ID。這樣可以避免程序檔由系統使用者 (例如,root) 執行。請不要建立包含 ID 小於 uidmin 的使用者 (當操作 mod_suexec 時一定會使用該使用者時)。在 SUSE Linux 的預設 uidmin 是 96。

  • gidmin -- 這個設定概念和 uidmin 相同,但是是針對群組 ID。 在 SUSE Linux 的預設 gidmin 是 96。

  • 目錄和檔案許可權 -- 所執行的程序檔應該屬於相同於已指定的 suEXEC 使用者和群組。此外,非此擁有者的其他使用者絕對不能寫入這個檔案。同時,只有該擁有者具有程序檔所在目錄的寫入權限。

  • suEXEC safepath -- 所有在程序檔 (例如 Perl) 中所使用的程式必須出現在已標示為可安全執行 suexec 的路徑。safepath 會在 suEXEC 編譯階段完成設定,而且不可以在 Runtime 時進行變更。SUSE Linux 中的預設 safepath/usr/local/bin:/usr/bin:/bin

如果發生 mod_suexec 所導致的錯誤,請查閱 /var/log/apache2/suexec.log 中的 suexec 日誌檔案。

如果要在 SUSE Linux 使用 mod_suexec,請在 /etc/sysconfig/apache2APACHE_MODULES 加入 suexec,或是使用 模組 所介紹的 YaST。請務必記住,執行 suexec 時需要用到 mod_cgi

mod_suexec 最能在虛擬主機環境中表現其功能,請參閱 節 46.4, "虛擬主機"。如果要指定執行 CGI 程序檔時所依據的特定使用者和群組,請在提供虛擬主機宣告的檔案中使用下列語法 (SUSE Linux 的預設檔案是 /etc/apache2/vhosts.d/*):

範例 46.13. mod_suexec 組態

<VirtualHost 192.168.0>
# ...
ScriptAlias /cgi-bin/ /srv/www/vhosts/www.example.com/cgi-bin/
SuexecUserGroup tux users
# ..
</VirtualHost> 

在這個範例中,SuexecUserGroup 使用者名稱 群組語法會為所有位於 /srv/www/vhosts/www.example.com/cgi-bin/ 的程序檔,指派 tux 的使用者 ID,以及使用者的群組 ID。

46.5.2.2. Secure Sockets Layer 和 Apache:mod_ssl

mod_ssl 會為用戶端和網頁伺服器之間的 HTTP 通訊,提供使用安全通訊端層 (Secure Sockets Layer, SSL)、以及傳輸層安全性 (Transport Layer Security, TLS) 通訊協定的強式加密。為了完成這個目的,伺服器會在回覆任何 URL 要求之前,先傳送提供伺服器有效身分相關資訊的 SSL 憑證。這樣一來,就可以保證該伺服器是此通訊的唯一專屬正確端點。此外,該憑證會在用戶端和伺服器端建立加密連線,以便在沒有洩漏敏感、純文字內容的風險情況下傳輸資訊。使用 mod_ssl 搭配 Apache 的最明顯特徵,就是 URL 的字首都會加上 https://,而不是 http://

在網頁伺服器端上,SSL 和 TLS 要求的預設連接埠是 443。這樣和"一般" Apache 傾聽連接埠 80、SSL/TLS 啟用 Apache 傾聽連接埠 443 之間,就不會產生衝突。事實上,HTTP 和 HTTPS 可以執行相同的 Apache 例項。通常這時會使用一部虛擬主機 (請參閱 節 46.4, "虛擬主機"),將連接埠 80 和連接埠 443 的要求分派到不同的虛擬伺服器。

[Important]以名稱為基礎的虛擬主機和 SSL

我們不可能在只有一個 IP 位址的伺服器上,執行多部啟用 SSL 的虛擬主機。連線到這類設定的使用者,將會在每次造訪該 URL 時收到警告訊息,表示憑證與伺服器名稱不符。每個啟用 SSL 的領域都需要使用不同的 IP 位址或連接埠,才能根據有效的 SSL 憑證來完成通訊。

不管是否有收到該警告訊息,您還是會獲得相同於任何有效 SSL 網站提供的加密層級。這樣表示只要是可接受的警告訊息,網頁伺服器和用戶端之間仍屬安全的通訊。這時唯一包含伺服器身分的內容 (經過有效 SSL 憑證保證) 將會遭到捨棄。

如果要在 SUSE Linux 使用 mod_ssl,請在 /etc/sysconfig/apache2APACHE_MODULES 加入 ssl,或是使用 模組 所介紹的 YaST。此外,網頁伺服器必須設定成傾聽標準的 HTTPS 連接埠 443。 這項設定可以在 /etc/apache2/listen.conf 手動完成,或是使用 YaST 的「傾聽」功能表項目 (請參閱 網路設備選擇) 來完成設定。

root 身分輸入 cd /usr/share/doc/packages/apache2; ./certificate.sh,就可以建立測試用 SSL 憑證。請遵循畫面指示來建立此 SSL 憑證。最後產生的憑證檔案會出現在目錄 /etc/apache2/ssl* 中。

包括全球認證的"實際"憑證,是由類似 Thawte (http://www.thawte.com/ 或 Verisign (www.verisign.com) 等供應商發出。

如果要手動編輯 Apache 組態檔案,請依照下面範例作為設定 mod_ssl 的指示方針。

範例 46.14. 手動設定 mod_ssl

# Global Environment
# listen on the standard SSL port
Listen 443
# load module only if rcapache2 start-ssl was issued
<IfDefine SSL>
LoadModule ssl_module /path/to/mod_ssl.so
</IfDefine>

# Main Server context
# include global (server-wide) SSL configuration 
# that is not specific to any virtual host
# only if ssl_module was loaded
<IfModule mod_ssl.c>
Include /etc/apache2/ssl-global.conf
</IfModule>
            
[Tip]提示

請不要忘記為連接埠 443 上已啟用 SSL 的 Apache 開啟防火牆。移至「安全性和使用者」+「防火牆」+「允許服務」,就可以透過 YaST 來進行開啟。接著,將「HTTPS 伺服器」加入到「允許服務」清單中。

46.5.3. 外部模組

正式說來,標示為外部的模組不會包含於 Apache 發行版本。然而,SUSE Linux 會提供幾種已經可以使用的外部模組。本章將大概介紹一些外部模組及其功能。

46.5.3.1. 使用 Perl 來管理 Apache:mod_perl

mod_perl 會在 Apache 中內嵌常駐 Perl 解譯器。這樣就可以避免 mod_cgi 每次收到 CGI 要求時就呼叫外部執行檔,而降低可能的負荷。 mod_perl 則可另外允許配合 Perl 程式設計語言,來控制多種 Apache 功能。

如果要在 SUSE Linux 使用 mod_perl,請安裝 apache2-mod_perl RPM,並透過 YaST (模組) 或是手動方式,在 /etc/sysconfig/apache2 啟用模組。完成安裝和啟動之後,/etc/apache2/conf.d/ 之下就會出現另一個組態檔案 mod_perl.conf。此外,mod_perl 啟動程序檔也會依照 mod_perl-startup.pl 進行安裝。如需有關如何使用這個模組的詳細資訊,請參閱 mod_perl 網站 (http://perl.apache.org/) 所提供的說明文件。

46.5.3.2. 服務 PHP:mod_php4mod_php5

PHP 是一種受歡迎的程式設計語言,其原本是針對在網路上的用途而設計。目前有兩種版本,PHP4 和 PHP5。其中 PHP4 是使用傳統的 PHP 概念和方法,而 PHP5 則引進新的物件導向程式設計可能性,以及其他多種進階功能。SUSE Linux 會同時提供 mod_php4mod_php5。這兩個程式可以將 PHP 解譯器內嵌到 Apache,成為其中的常駐模組。

如果要在 SUSE Linux 使用 mod_php4mod_php5,請分別安裝 RPM (apache2-mod_php4apache2-mod_php5),並透過 YaST (模組) 或是手動方式,在 /etc/sysconfig/apache2 啟用模組。

完成安裝和啟動之後,/etc/apache2/conf.d/ 下面就會出現針對個別模組所產生的不同組態檔案 (php4.confphp5.conf)。PHP 網站 (http://www.php.net) 已針對結合 Apache 使用 PHP,提供了相當豐富的說明資源。

46.5.3.3. Python 和 Apache:mod_python

mod_python 會在 Apache 中內嵌 Python 解譯器。Python 是一種物件導向的程式設計語言,語法相當簡潔易懂。其中較少見但卻十分方便的特色,就是程式結構是由原始程式碼縮排來決定,而不是由類似 beginend 等常見分界元件來決定。

如果要在 SUSE Linux 使用 mod_python,請安裝 apache2-mod_python RPM,並透過 YaST (模組) 或是手動方式,在 /etc/sysconfig/apache2 啟用模組。如需有關如何使用這個模組的詳細資訊,請參閱 mod_python 網站 (http://www.modpython.org/) 所提供的說明文件。

46.5.3.4. Apache 的 Ruby 解譯器:mod_ruby

mod_ruby 會在 Apache 網頁伺服器中內嵌 Ruby 解譯器,允許執行 Ruby CGI 程序檔。Ruby 是一種相當新的物件導向、高層次的程式設計語言,在某些功能方面很類似 Perl 和 Python。和 Python 一樣,它有一個清楚、有效的語法。另一方面,Ruby 採用縮寫 (例如以 $.r 來表示輸入檔中的最後一行數字),有些程式設計師很喜歡這種特點,但也有些人不喜歡這個特點。Ruby 的基本概念很像 Smalltalk。

如果要在 SUSE Linux 使用 mod_ruby,請安裝 apache2-mod_ruby RPM,並透過 YaST (模組) 或是手動方式,在 /etc/sysconfig/apache2 啟用模組。如需有關如何使用這個模組的詳細資訊,請參閱 mod_ruby 網站 (http://www.modruby.net/en/index.rbx) 所提供的說明文件。

46.5.3.5. 原始檔案系統存取:mod_dav

mod_dav 可提供 Apache 的 WebDAV (以 Web 為基礎的分散式製作與版本設定) 功能。WebDAV 是 HTTP 通訊協定的延伸功能,可以讓使用者共同編輯並管理遠端伺服器的檔案。WebDAV 具有類似 FTP 的功能,主要差異是它會採用 HTTP 通訊協定來存取伺服器。實際上,mod_dav 可以讓 Apache 網頁伺服器提升成為進階的遠端檔案系統。

如果不需要,最好限制透過 WebDAV 存取目錄的權限。至少要實行的預防措施,就是在 Location 指示詞中設定 WebDAV 資源的 HTTP 基本驗證,以及「限制」條件。

如果要存取 WebDAV 資源,用戶端必須安裝可提供 WebDAV 功能的軟體。SUSE Linux 已經隨附下列 WebDAV 功能:字首為 webdav://webdavs:// (適用於透過 SSL 連線執行 WebDAV 情況) 的 Konqueror,可用來連接至 Apache WebDAV 檔案系統。

mod_dav 需要使用模組 mod_dav_fs,以便提供 WebDAV 的實際檔案系統存取權限。如果要在 SUSE Linux 使用 mod_dav,請透過 YaST (模組) 或是手動方式,在 /etc/sysconfig/apache2 中啟用模組。為 mod_dav_fs 執行相同步驟。如需有關如何使用這個模組的詳細資訊,請參閱 mod_dav 網站 (http://httpd.apache.org/docs-2.0/mod/mod_dav.html) 所提供的說明文件。

46.5.3.6. 提供使用者首頁:mod_userdir

SUSE Linux 中的 mod_userdir,已經預設將每位使用者在 ~/public_html 資料夾的內容提供作為公開網頁。這些網頁的存取 URL 將為 http://www.example.com/~使用者名稱/

[Tip]提示

基於安全性考量,SUSE Linux 中的 mod_userdir 會禁止使用者存取在 root 使用者主目錄中的任何目錄。此外,您可以使用下列指令行,特別指定只有特定使用者可以擁有公開首頁:

# Main server context
UserDir disabled
UserDir enabled tux wilber
            

如果要在 SUSE Linux 使用 mod_userdir,請透過 YaST (模組) 或是手動方式,在 /etc/sysconfig/apache2 中啟用模組。如需有關如何使用這個模組的詳細資訊,請參閱 mod_userdir 網站 (http://httpd.apache.org/docs-2.0/mod/mod_userdir.html) 所提供的說明文件。

46.5.3.7. 變更 URL 結構:mod_rewrite

mod_rewrite 通常被認為是"操縱 URL 的瑞士刀。"這個模組可根據指定規則集,來重寫即時收到的要求 URL。從 http://www.example.com/display.php?cat=2&article=1&lang=dehttp://www.example.com/2/1/de,就可看出典型的執行結果。

URL 重寫指南」會介紹這種功能強大、但是屬於複雜模組的優點和缺點:

"您可能在初次用過 mod_rewrite 之後就像抱到燙手山芋,從此不願意再使用;或是發現它的強大功用,從此愛不釋手。"

下列組態內容中都可以設定 RewriteRule 集:主機伺服器、虛擬主機、目錄和 .htaccess 檔案。http://httpd.apache.org/docs-2.0/misc/rewriteguide.html 所提供的「URL 重寫指南」,可以作為了解使用 mod_rewrite 進行 URL 重寫的絕佳起點。

如果要在 SUSE Linux 使用 mod_rewrite,請透過 YaST (模組) 或是手動方式,在 /etc/sysconfig/apache2 中啟用模組。