章 31. Apache HTTP 伺服器

目錄

31.1. 快速入門
31.2. 設定 Apache
31.3. 啟動和停止 Apache
31.4. 安裝、啟用和設定模組
31.5. 啟用 CGI 程序檔
31.6. 設定提供 SSL 的安全網頁伺服器
31.7. 使用 NSS 設定安全 Web 伺服器
31.8. 避免安全性問題
31.9. 疑難排解
31.10. 更多資訊

摘要

根據 http://www.netcraft.com/ 的調查結果顯示,Apache HTTP 伺服器 (Apache) 在市面上佔有率已超過 50%,是目前全世界最多人使用的網頁伺服器。由 Apache 軟體基金會 (http://www.apache.org/) 研發的 Apache 可在大部分作業系統上使用。SUSE® Linux Enterprise Server 隨附 Apache 2.2 版本。本章將介紹如何安裝、組態設定與設定 Web 伺服器,如何使用 SSL、CGI 與其他模組,以及如何排解 Apache 疑難。

31.1. 快速入門

本節的說明可協助您快速設定和啟動 Apache。您必須登入為 root 身分,才能安裝和設定 Apache。

31.1.1. 要求

在設定 Apache Web 伺服器之前,請先確定您已符合下列要求︰

  1. 此機器的網路已正確設定。如需有關這個主題的詳細資訊,請參閱 第 22 章「基本網路

  2. 此機器的實際系統時間已透過時間伺服器進行同步維護。這是必要動作,因為 HTTP 通訊協定的部分內容會依據正確時間來運作。如需有關這個主題的詳細資訊,請參閱第 24 章「使用 NTP 進行時間同步化

  3. 已安裝最新的安全性更新。如果不清楚是否已安裝,請執行「YaST 線上更新」。

  4. 防火牆中已開啟預設的 Web 伺服器連接埠 (80)。針對這點,請將 SUSEFirewall2 設定成允許在外部區域執行 HTTP 伺服器服務。您可以使用 YaST 完成此設定。如需詳細資料,請參閱 Section “Configuring the Firewall with YaST” (Chapter 15, Masquerading and Firewalls, ↑Security Guide)。

31.1.2. 安裝

SUSE Linux Enterprise Server 中的 Apache 預設不會安裝到系統。若要以可直接執行的預先定義標準組態進行安裝,請按照以下步驟操作︰

過程 31.1. 以預設組態安裝 Apache

  1. 啟動 YaST,然後選取軟體+軟體管理

  2. 選擇過濾器+模式,然後在伺服器功能中選取Web 與 LAMP 伺服器

  3. 請確蓋安裝個別套件,完成此安裝程序。

此項安裝會安裝多重處理模組 apache2-prefork 與 PHP5 模組。如需關於各種模組的詳細資訊,請參閱第 31.4 節「安裝、啟用和設定模組」

31.1.3. 開始

您可讓 Apache 在開機時自動啟動或者手動將其啟動。

過程 31.2. 自動啟動 Apache

  1. 為確定 Apache 會在開機階段的執行層級 35 自動啟動,請執行以下指令︰

    chkconfig -a apache2
  2. 或者,請啟動 YaST,然後選取系統+系統服務 (執行層級)

  3. 搜尋 apache2啟用該服務。

    網頁伺服器將立即啟動。

  4. 按一下完成儲存您的變更。

    系統即設定為在開機階段的執行層級 35 自動啟動 Apache。

如需 SUSE Linux Enterprise Server 中執行層級的詳細資訊與 YaST 執行層級編輯器的說明,請參閱第 10.2.3 節「使用 YaST 設定系統服務 (Runlevel)」

若要使用外圍程序手動啟動 Apache,請執行 rcapache2 start

過程 31.3. 檢查 Apache 是否正在執行

如果您在啟動 Apache 時未接收到錯誤訊息,這通常表示 Web 伺服器正在執行。若要對此進行測試︰

  1. 啟動瀏覽器,並開啟 http://localhost/

    如果 Apache 已啟動且正在執行,系統會顯示正常運作!的測試頁面。

  2. 如果此頁面沒有出現,請參閱第 31.9 節「疑難排解」

現在網頁伺服器已經開始執行,您可以加入自己的文件、根據個人需求調整組態,或是安裝模組來新增功能。

31.2. 設定 Apache

SUSE Linux Enterprise Server 提供了兩個組態選項:

手動設定組態可以提供較詳細的設定,但是缺乏 YaST GUI 提供的方便性。

[Important]在組態變更後重新載入或重新啟動 Apache

大多數組態變更需要重新載入 (有些還需要重新啟動) Apache 才能生效。請使用 rcapache2 reload 以手動方式重新載入 Apache,或使用第 31.3 節「啟動和停止 Apache」 中所述的其中一個重新啟動選項。

如果使用 YaST 來設定 Apache,依照第 31.2.3.2 節「HTTP 伺服器組態」中所述將HTTP 服務設定為已啟用,即可讓上述操作自動完成。

31.2.1. Apache 組態檔案

本節提供 Apache 組態檔案的綜覽。如果使用 YaST 設定組態,則無需變更這些檔案。不過,如果您要在以後改為以手動方式設定組態,該資訊可能會對您有用。

您可以在下列兩個不同位置找到 Apache 組態檔案:

31.2.1.1. /etc/sysconfig/apache2

/etc/sysconfig/apache2 可控制部分的 Apache 全域設定,例如要載入的模組、要包含的其他組態檔案、伺服器應該啟動的旗標,以及應該新增至指令行的旗標。此檔案對每個組態選項都進行了詳細說明,因此本文不予以介紹。針對一般用途的網頁伺服器,在 /etc/sysconfig/apache2 中的設定應該可以符合任何組態需求。

31.2.1.2. /etc/apache2/

/etc/apache2/ 代管了 Apache 的所有組態檔案。以下各節將說明每個檔案的用途。每個檔案都包含了數個組態選項 (又稱為指示詞)。在這些檔案中的每個組態選項都會詳加說明,因此本文將不予以介紹。

Apache 組態檔案的組織方式如下:

/etc/apache2/
     |
     |- charset.conv 
     |- conf.d/
     |   |
     |   |- *.conf
     |
     |- default-server.conf
     |- errors.conf
     |- httpd.conf
     |- listen.conf
     |- magic
     |- mime.types
     |- mod_*.conf
     |- server-tuning.conf
     |- ssl.*
     |- ssl-global.conf
     |- sysconfig.d
     |   |
     |   |- global.conf
     |   |- include.conf
     |   |- loadmodule.conf . .
     |
     |- uid.conf
     |- vhosts.d
     |   |- *.conf

在 /etc/apache2/ 中的 Apache 組態檔案

charset.conv

指定不同語言所要使用的字元集。請不要編輯此檔案。

conf.d/*.conf

組態檔案由其他模組新增。這些組態檔案可以依實際需要包含至虛擬主機組態。如需範例,請參閱 vhosts.d/vhost.template。若要執行這個動作,您可以為不同的虛擬主機提供不同的模組組合。

default-server.conf

使用合理預設值設定所有虛擬主機的全域組態。這時不是變更組態值,而是採用虛擬主機組態覆寫組態值。

errors.conf

定義 Apache 處理錯誤的方式。若要自定這些傳送給所有虛擬主機的訊息,請編輯此檔案。另外一種方法是覆寫虛擬主機組態中的這些指示詞。

httpd.conf

主要的 Apache 伺服器組態檔案。請勿變更此檔案。此檔案主要包含 Include 陳述式和全域設定。為此處列出的相關組態檔案覆寫全域設定。變更虛擬主機組態的主機特定設定 (例如文件根目錄)。

listen.conf

繫結 Apache 至特定的 IP 位址與連接埠在此檔案中也可以設定以名稱為基礎的虛擬主機。如需詳細資料,請參閱第 31.2.2.1.1 節「以名稱為基礎的虛擬主機」

magic

mime_magic 模組的資料,此模組可協助 Apache 自動判斷不明檔案的 MIME 類型。請不要變更此檔案。

mime.types

系統已知的 MIME 類型 (實際上是 /etc/mime.types 的連結)。請不要編輯此檔案。如果您需要新增這裡未列出的 MIME 類型,請將它們新增到 mod_mime-defaults.conf

mod_*.conf

預設已安裝之模組的組態檔案。如需詳細資訊,請參閱第 31.4 節「安裝、啟用和設定模組」。請注意,選用模組的組態檔案會存放在 conf.d 目錄。

server-tuning.conf

包含不同 MPM 的組態指示詞 (請參閱第 31.4.4 節「多重處理模組」) 和可控制 Apache 效能的一般組態選項。請在變更此檔案之後為網頁伺服器進行適當測試。

ssl-global.confssl.*

全域 SSL 組態和 SSL 憑證資料。如需詳細資訊,請參閱第 31.6 節「設定提供 SSL 的安全網頁伺服器」

sysconfig.d/*.conf

自動從 /etc/sysconfig/apache2 產生的組態檔案。請勿改變其中任何檔案 -- 而是編輯 /etc/sysconfig/apache2。請不要將其他組態檔案置於此目錄中。

uid.conf

指定要在哪個使用者和群組 ID 之下執行 Apache。請不要變更此檔案。

vhosts.d/*.conf

您的虛擬主機組態應存放於此處。該目錄包含採用或不採用 SSL 之虛擬主機的樣板檔案。此目錄中以 .conf 結尾的每個檔案都會自動包含在 Apache 組態中。如需詳細資訊,請參閱第 31.2.2.1 節「虛擬主機組態」

31.2.2. 手動設定 Apache

以手動方式設定 Apache 是指以 root 使用者身分來編輯純文字組態檔案。

31.2.2.1. 虛擬主機組態

「虛擬主機」一詞,是形容 Apache 從同一部實體機器提供多個通用資源識別字串 (URI,Universal Resource Identifier) 的能力。這是指同時由一部實體電腦的單一網頁伺服器來執行多個領域 (例如,www.example.com 和 www.example.net)。

使用虛擬主機的目的,經常是為了節省管理工作 (只需要維護一部網頁伺服器) 和硬體開銷 (不需要將各個網域安裝在專屬伺服器上)。虛擬主機可以使用名稱、IP 或是連接埠作為基礎。

若要列出所有現有的虛擬主機,請使用指令 httpd2 -S。該指令將輸出一份清單,顯示預設伺服器和所有虛擬主機,以及它們的 IP 位址和監聽埠。此外,該清單還顯示每個虛擬主機在組態檔案中的位置。

虛擬主機可依照第 31.2.3.1.4 節「虛擬主機」中所述透過 YaST 設定,或是手動編輯組態檔案來設定。依預設,系統會根據 /etc/apache2/vhosts.d/ 中每部虛擬主機一個組態檔案的設定,為在 SUSE Linux Enterprise Server 中執行的 Apache 做好準備。此目錄中副檔名為 .conf 的所有檔案,都會自動包含至組態中。這個目錄會提供虛擬主機的基本樣板 (vhost.template,或是適用於提供 SSL 支援之虛擬主機的 vhost-ssl.template)。

[Tip]永遠要建立虛擬主機組態

建議您務必要建立虛擬主機組態檔案,即使網頁伺服器只代管一個網域。如此,您不但可以將網域專屬組態存放在一個檔案中,還可以隨時回復至運作正常的基本組態,只需移動、刪除或重新命名虛擬主機的組態檔案即可。同樣地,您應該也要分別為每個虛擬主機建立組態。

使用名稱型虛擬主機時,建議設定預設組態,以便在網域名稱與虛擬主機組態不相符時使用。系統會首先載入預設虛擬主機的組態。由於組態檔案的順序由檔案名稱決定,因此請在預設虛擬主機組態檔案名稱的開頭使用底線字元 (_),以確定該檔案最先載入 (例如︰_default_vhost.conf)。

<VirtualHost></VirtualHost> 區塊包含要套用到特定網域的資訊。當 Apache 接收到來自定義的虛擬主機的用戶端要求時,就會使用本節所包含的指示詞。幾乎所有指示詞都可以用於虛擬主機網路位置。如需更多有關 Apache 組態指示詞的詳細資訊,請參閱http://httpd.apache.org/docs/2.2/mod/quickreference.html

31.2.2.1.1. 以名稱為基礎的虛擬主機

使用以名稱為基礎的虛擬主機時,每個 IP 位址可以為數個網站提供服務。Apache 會使用用戶端所傳送之 HTTP 標頭中的主機欄位,將要求連接到與其中一個虛擬主機宣告相符的 ServerName 項目。如果沒有找到相符的 ServerName,就會預設使用第一個指定的虛擬主機。

NameVirtualHost 指示詞通知 Apache 要在哪個 IP 位址及哪個連接埠 (選擇性) 上監聽 HTTP 標頭中包含網域名稱的用戶端要求。這個選項會設定在組態檔案 /etc/apache2/listen.conf

第一個引數可以是完全合格的網域名稱 (Fully Qualified Domain Name),但是建議最好使用 IP 位址。第二個引數是連接埠,此引數是可選的。預設會使用連接埠 80,並且您可以透過 Listen 指示詞對其進行設定。

IP 位址和連接埠號碼都可以使用萬用字元 *,來接收所有介面上的要求。IPv6 位址必須包在方括號中。

範例 31.1. 以名稱為基礎的 VirtualHost 項目變化

# NameVirtualHost IP-address[:Port]
NameVirtualHost 192.168.3.100:80
NameVirtualHost 192.168.3.100
NameVirtualHost *:80
NameVirtualHost *
NameVirtualHost [2002:c0a8:364::]:80

開啟的 VirtualHost 標籤會將前面經由 NameVirtualHost 宣告的 IP 位址 (或完全合格的網域名稱) 當作以名稱為基礎之虛擬主機的組態引數。先前使用 NameVirtualHost 指示詞宣告的連接埠號碼屬於選擇性。

允許使用萬用字元 * 做為 IP 位址的替代符號。此語法只適用於在 NameVirtualHost * 中結合使用萬用字元的情形。如果是使用 IPv6 位址,該位址就必須用方括號包住。

範例 31.2. 以名稱為基礎的 VirtualHost 指示詞

<VirtualHost 192.168.3.100:80>
  ...
</VirtualHost>

<VirtualHost 192.168.3.100>
  ...
</VirtualHost>

<VirtualHost *:80>
  ...
</VirtualHost>

<VirtualHost *>
  ...
</VirtualHost>

<VirtualHost [2002:c0a8:364::]>
  ...
</VirtualHost>

31.2.2.1.2. 以 IP 為基礎的虛擬主機

此虛擬主機組態替代方法需要為一台機器設定多個 IP。一個 Apache 例項可裝載多個網域,每個網域都會指定不同的 IP。

實體伺服器必須為每部以 IP 為基礎的虛擬主機設定一個 IP 位址。當該電腦沒有安裝多張網路卡時,也可以使用虛擬網路介面 (IP 別名)。

下列範例將示範,Apache 正執行於 IP 192.168.3.100 的電腦上,並負責代管 IP 192.168.3.101192.168.3.102 兩個領域。每部虛擬伺服器都必須具備個別的 VirtualHost 區塊。

範例 31.3. 以 IP 為基礎的 VirtualHost 指示詞

<VirtualHost 192.168.3.101>
  ...
</VirtualHost>

<VirtualHost 192.168.3.102>
  ...
</VirtualHost>

這裡出淚的 VirtualHost 指示詞,只能指定給 192.168.3.100 以外的其他介面。如果 192.168.3.100 也有設定 Listen 指示詞,這時就必須建立另一個以 IP 為基礎的虛擬主機,來回應 HTTP 要求給該介面 -- 另一種做法是套用預設伺服器組態 (/etc/apache2/default-server.conf) 所顯示的指示詞。

31.2.2.1.3. 基本虛擬主機組態

每個虛擬主機組態中至少要出現下列指示詞,才能設定虛擬主機。如需瞭解更多選項的詳細資訊,請參閱 /etc/apache2/vhosts.d/vhost.template

ServerName

完全合格網域名稱,其下是應該要建立位址的主機。

DocumentRoot

目錄路徑,Apache 會從此路徑為此主機提供檔案。基於安全性考量,存取整個檔案系統是預設禁止的動作,所以您必須明確解除鎖定這個位在 Directory 容器中的目錄。

ServerAdmin

伺服器管理員的電子郵件地址. 這個地址可顯示在 Apache 建立的錯誤頁面 (舉例說明)。

ErrorLog

此虛擬主機的錯誤記錄檔案。雖然沒必要為每個虛擬主機分別建立錯誤記錄檔案,但是多數人會這樣做,以便除錯更加容易。/var/log/apache2/ 是 Apache 記錄檔案的預設目錄。

CustomLog

此虛擬主機的存取記錄檔案。雖然沒必要為每個虛擬主機分別建立存取記錄檔案,但是多數人會這樣做,以便分別為每部主機分析存取統計資料。/var/log/apache2/ 是 Apache 記錄檔案的預設目錄。

正如前面所述,存取整個檔案系統已因安全性考量而預設為禁止動作。因此,請將 Apache 要處理之檔案所在的目錄明確解除鎖定 — 例如 DocumentRoot

<Directory "/srv/www/www.example.com/htdocs">
  Order allow,deny
  Allow from all
</Directory>

此完整組態看起來如下:

範例 31.4. 基本 VirtualHost 組態

<VirtualHost 192.168.3.100>
  ServerName www.example.com
  DocumentRoot /srv/www/www.example.com/htdocs
  ServerAdmin webmaster@example.com
  ErrorLog /var/log/apache2/www.example.com_log
  CustomLog /var/log/apache2/www.example.com-access_log common
  <Directory "/srv/www/www.example.com/htdocs">
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

31.2.3. 使用 YaST 設定 Apache

若要使用 YaST 來設定您的 Web 伺服器,請啟動 YaST 並選取網路服務+HTTP 伺服器。第一次啟動模組時,HTTP 伺服器精靈會啟動,提示您對伺服器管理進行一些基本設定。完成精靈之後,每當您呼叫HTTP 伺服器模組時,HTTP 伺服器組態對話方塊就會啟動。如需詳細資訊,請參閱第 31.2.3.2 節「HTTP 伺服器組態」

31.2.3.1. HTTP 伺服器精靈

HTTP 伺服器精靈包含有五個步驟。在最後一個步驟的對話方塊中,您可以進入進階組態模式以進行更多特定的設定。

31.2.3.1.1. 網路裝置選擇

在此,您可以指定 Apache 用來傾聽內送要求的網路介面和連接埠。您可以選取任何現有網路介面及其 IP 位址的組合。若連接埠 (連接埠隸屬以下三種:已知埠、註冊埠和動態或私人埠) 不供其他服務使用,則皆可供您使用。預設設定為在連接埠 80 上監聽所有網路介面 (IP 位址)。

核取在防火牆中開啟埠選項,可在防火牆中開啟 Web 伺服器監聽的連接埠。若要使網頁伺服器在網路 (包括 LAN、WAN 或公用網際網路) 上為可用狀態,請核取此選項。只有在測試時,並且此時不須由外部網路存取 Web 伺服器,才可以關閉該連接埠。如果您有多個網路介面,請按一下防火牆細節...以指定應對何介面開啟連接埠。

下一步繼續設定組態。

31.2.3.1.2. 模組

使用模組組態選項,可以啟用或停用 Web 伺服器應支援的程序檔語言。如需有關啟用或停用其他模組的詳細資訊,請參閱第 31.2.3.2.2 節「伺服器模組」。按一下下一步,繼續進行下一個對話方塊。

31.2.3.1.3. 預設主機

此選項與預設網頁伺服器相關。正如第 31.2.2.1 節「虛擬主機組態」內容所述,Apache 可以在一部實體機器上提供多個虛擬主機。組態檔案中第一個宣告的虛擬主機通常會被視為預設主機。每部虛擬主機都會繼承預設主機的組態。

若要編輯主機設定 (又稱為指示詞),請在表格中選擇適當項目,然後按一下編輯。若要新增指示詞,請按一下新增。若要刪除指示詞,請選取該指示詞,然後按一下刪除

圖形 31.1. HTTP 伺服器精靈:預設主機

HTTP 伺服器精靈:預設主機

這是伺服器預設值的清單:

Document Root

目錄路徑,Apache 會從此路徑為此主機提供檔案。/srv/www/htdocs 是預設位置。

Alias

在配合 Alias 指示詞時,URL 可以映射到實體檔案系統位置。這表示某個路徑即使不在檔案系統的 Document Root 中,仍可藉由該路徑別名的 URL 進行存取。

預設的 SUSE Linux Enterprise Server Alias /icons 指向 /usr/share/apache2/icons,做為目錄索引檢視中顯示的 Apache 圖示。

ScriptAlias

功能相似於 Alias 指示詞,ScriptAlias 指示詞可以將 URL 映射到檔案系統位置。兩者差別在於 ScriptAlias 可以將目標目錄指定作為 CGI 位置,表示該 CGI 程序檔必須在該位置執行。

Directory

使用 Directory 設定時,您可以指定一組組態選項,只將其中的選項套用到特定目錄。

在此可以設定 /srv/www/htdocs/usr/share/apache2/icons/srv/www/cgi-bin 目錄的存取和顯示選項。其中預設值應該不需要進行改變。

Include

使用 Include 可以指定其他的組態檔案。預先設定的 Include 指令有兩個︰/etc/apache2/conf.d/ 為外部模組隨附之組態檔案所在的目錄。使用此指示詞時,此目錄中所有以 .conf 結尾的檔案都會包含在內。使用第二個指示詞時,/etc/apache2/conf.d/apache2-manual.conf,即 apache2-manual 組態檔將包含在內。

Server Name

這個項目可以指定用戶端用來聯絡網頁伺服器的預設 URL。請使用完全合格的網域名稱 (FQDN) 來連接 http://FQDN/ 的網頁伺服器或其 IP 位址。您不能在此選擇任意名稱 -- 該伺服器必須是已知採用這個名稱。

Server Administrator E-Mail

伺服器管理員的電子郵件地址. 這個地址可顯示在 Apache 建立的錯誤頁面 (舉例說明)。

完成設定預設主機步驟後,請按一下下一步,繼續下一個組態步驟。

31.2.3.1.4. 虛擬主機

在此步驟中,精靈會顯示已完成設定之虛擬主機的清單 (請參閱第 31.2.2.1 節「虛擬主機組態」)。如果在啟動 YaST HTTP 精靈之前尚未進行手動變更,則不會顯示虛擬主機。

若要新增主機,請按一下新增開啟對應的對話方塊,並在其中輸入主機的基本資訊,例如伺服器名稱伺服器內容根目錄(DocumentRoot) 和管理員電子郵件伺服器解析可用來決定主機的識別方式 (以名稱為基礎或是以 IP 為基礎)。透過變更虛擬主機 ID指定名稱或 IP 位址

按一下下一步,繼續進入虛擬主機組態對話方塊的第二部分。

在虛擬主機組態對話方塊的第二部分中,您可以指定是否要啟用 CGI 程序檔、以及這些程序檔要使用哪個目錄。您也可以在此啟用 SSL。如果執行了這個動作,您就必須同時指定憑證的路徑。如需有關 SSL 和憑證的詳細資訊,請參閱第 31.6.2 節「設定提供 SSL 的 Apache」。使用目錄索引選項,可以指定當用戶端要求目錄時要顯示哪個檔案 (預設為 index.html)。如果您要變更這個設定,請新增一個或多個檔名 (以空格分隔)。使用啟用公用 HTML時,使用者公用目錄 (~user/public_html/) 的內容將在伺服器的 http://www.example.com/~user 下公開。

[Important]建立虛擬主機

您不能在此隨意新增虛擬主機。如果使用以名稱為基礎的虛擬主機,就必須在網路上解析每部主機名稱。如果是使用以 IP 為基礎的虛擬主機,每個可用 IP 位址就只能指派一部主機。

31.2.3.1.5. 摘要

這是精靈的最後一個步驟。您可以在此處決定 Apache 伺服器啟動的方式和時間:開機時啟動或手動啟動。同時可檢視目前已完成之組態的簡短摘要。如果您接受目前設定,請按一下完成以完成組態設定。如果要變更某些設定,請按上一步,直到出現您需要的對話方塊。按一下 HTTP 伺服器進階組態便可開啟第 31.2.3.2 節「HTTP 伺服器組態」 所介紹的對話方塊。

圖形 31.2. HTTP 伺服器精靈:摘要

HTTP 伺服器精靈:摘要

31.2.3.2. HTTP 伺服器組態

HTTP 伺服器組態對話方塊可提供比精靈更多的組態調整 (精靈 只會在第一次設定網頁伺服器時執行)。其中包含下列要介紹的四個索引標籤。在此變更的任何選項都無法立即生效 -- 您必須先按一下完成進行確認之後,它們才會生效。按一下中止,系統將不變更組態模組,並會捨棄您的變更。

31.2.3.2.1. 傾聽連接埠和位址

HTTP 服務中,選取執行 (啟用) 或停止 (停用) Apache。在傾聽埠中,新增編輯刪除可透過其使用伺服器的位址和連接埠。預設會在連接埠 80 上監聽所有介面。任何情況下都必須核取在防火牆中開啟埠,否則將無法從外部連接 Web 伺服器。只有在測試時,並且此時不須由外部網路存取 Web 伺服器,才可以關閉該連接埠。如果您有多個網路介面,請按一下防火牆細節...以指定應對何介面開啟連接埠。

使用記錄檔案時,可檢視存取記錄或錯誤記錄。測試組態時此選項非常有用。記錄檔案會在另一個視窗中開啟,您也可以在此處重新啟動或重新載入 Web 伺服器。如需詳細資料,請參閱第 31.3 節「啟動和停止 Apache」。這些指令會立即生效,其記錄訊息也會即刻顯示。

圖形 31.3. HTTP 伺服器組態:傾聽連接埠和位址

HTTP 伺服器組態:傾聽連接埠和位址

31.2.3.2.2. 伺服器模組

您可以按一下切換狀態,變更 Apache2 模組的狀態 (啟用或停用)。按一下新增模組,可新增已經安裝但是未列出的新模組。若要更進一步認識模組,請參閱第 31.4 節「安裝、啟用和設定模組」

圖形 31.4. HTTP 伺服器組態:伺服器模組

HTTP 伺服器組態:伺服器模組

31.2.3.2.3. 主要主機

這些對話方塊相同於前面已介紹過的對話方塊。請參閱第 31.2.3.1.3 節「預設主機」第 31.2.3.1.4 節「虛擬主機」

31.3. 啟動和停止 Apache

如果 Apache 是依照第 31.2.3 節「使用 YaST 設定 Apache」 中所述使用 YaST 來設定,它會於開機階段的執行層級 3 和 5 啟動,在執行層級 0、1、2 和 6 停止。您可以使用 YaST 的執行層級編輯器或指令行工具 chkconfig 來變更此行為。

若要在執行中的系統上啟動、停止或操作 Apache,請使用 init 程序檔 /usr/sbin/rcapache2。如需 init 程序檔的一般資訊,請參閱第 10.2.2 節「Init 程序檔」rcapache2 指令會接受下列參數:

狀態

檢查 Apache 是否已啟動。

start

啟動尚未執行的 Apache。

startssl

若採用 SSL 支援的 Apache 不在執行中,則將其啟動。如需更多有關 SSL 支援的詳細資訊,請參閱第 31.6 節「設定提供 SSL 的安全網頁伺服器」

停止

透過終止父處理程序來停止 Apache。

restart

停止 Apache,然後重新啟動。啟動之前並未在執行中的網頁伺服器。

try-restart

若 Apache 已在執行中,則將其停止並重新啟動。

reloadgraceful

通知所有 Apache 衍生處理程序在關機之前先完成各自的要求,以停止網頁伺服器。每個程序結束後都會被一個新啟動的程序所取代,最終會將 Apache 完全重新啟動

[Tip]在線上環境中重新啟動 Apache

若要啟用 Apache 組態中的變更而不引起連接中斷,請使用 rcapache2 reload 指令。

restart-graceful

啟動另一部可立即處理所有收到的要求的 Web 伺服器。Web 伺服器的上一個例項繼續處理所有現有的要求,持續時間為 GracefulShutdownTimeout 所設定的指定期間。

若要升級到新版本或變更需要重新啟動的組態選項,rcapache2 restart-graceful 十分有用。使用此選項可讓伺服器的停機時間降至最低。

必須設定 GracefulShutdownTimeout,否則 restart-graceful 將導致系統定期重新啟動。若設定為零,伺服器將無限期等待,直到所有剩餘的要求全部處理完為止。

若原始 Apache 例項無法清除所有必需的資源,則正常的重新啟動可能會失敗。在這種情況下,該指令將導致漸進式停止。

stop-graceful

GracefulShutdownTimeout 所設定的指定期間後停止 Web 伺服器,以確保系統可以完成現有的要求。

必須設定 GracefulShutdownTimeout,否則 stop-graceful 將導致系統定期重新啟動。若設定為零,伺服器將無限期等待,直到所有剩餘的要求全部處理完為止。

configtestextreme-configtest

在不影響執行中之網頁伺服器的情況下,檢查組態檔案的語法。因為這項檢查會在每次伺服器啟動、重新載入或重新啟動時強制進行,所以通常並不需要明確執行該測試 (若發現有組態錯誤,Web 伺服器就不會完成啟動、重新載入或是重新啟動作業)。extreme-configtest 選項會以使用者 nobody 的身分啟動 Web 伺服器並實際載入組態,因此系統可能會偵測到較多錯誤。請注意,雖然載入了組態,但是無法測試 SSL 設定,因為 nobody 無法讀取 SSL 證書。

probe

查探重新載入的重要性 (檢查組態是否有變更) 並建議 rcapache2 指令的必要引數。

server-status 和 full-server-status

分別傾印簡要或完整的狀態畫面。要求必須安裝 lynx 或 w3m 並啟用 mod_status 模組。除此之外,status 必須加入 /etc/sysconfig/apache2 檔案的 APACHE_SERVER_FLAGS

[Tip]其他旗標

如果您為 rcapache2 指定其他旗標,這些旗標就會傳遞通過網頁伺服器。

31.4. 安裝、啟用和設定模組

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

Apache 模組可以在建立階段編譯成 Apache 二進位檔案,或是在執行階段動態載入。如需瞭解如何動態載入模組的詳細資訊,請參閱第 31.4.2 節「啟用和停用」

Apache 模組可以分成四種不同類別:

基本模組

基本模組會依預設編譯到 Apache。SUSE Linux Enterprise Server 的 Apache 中僅編譯了 mod_so (載入其他模組要用到) 與 http_core。所有其他模組均以共享物件的方式提供,即在執行期間加入,而不包含在伺服器二進位檔案中。

延伸模組

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

外部模組

標示為外部的模組不會包含於 Apache 正式發行版本中。不過,SUSE Linux Enterprise Server 提供了其中的幾個模組。

多重處理模組 (MPM)

MPM 會負責接收和處理網頁伺服器所收到的要求,因此屬於網頁伺服器軟體的核心部分。

31.4.1. 模組安裝

如果您已依照第 31.1.2 節「安裝」 中所述完成預設安裝,則下列模組此時都已安裝︰所有基礎模組與延伸模組、多重處理模組 Prefork MPM 以及外部模組 mod_php5mod_python

您可以啟動 YaST,然後選擇軟體+軟體管理,來安裝其他的外部模組。現在,請依序選擇過濾器+搜尋,然後搜尋 apache。結果清單中除其他套件之外,還會包含所有可用的外部 Apache 模組。

31.4.2. 啟用和停用

以手動方式或透過 YaST 啟用或停用特定模組。在 YaST 中,若要啟用或停用程序檔語言模組 (PHP5、Perl 和 Python),需要使用第 31.2.3.1 節「HTTP 伺服器精靈」中所述的模組組態。所有其他模組都可以依據第 31.2.3.2.2 節「伺服器模組」說明步驟來啟用或停用。

如果您偏好手動啟用或停用模組,請分別使用 a2enmod mod_fooa2dismod mod_foo 指令。a2enmod -l 會輸出目前所有的使用中模組清單。

[Important]包含外部模組的組態檔案

如果您已經手動啟用外部模組,請確定將其組態檔案載入至所有的虛擬主機組態。外部模組的組態檔案會存放在 /etc/apache2/conf.d/ 之下,而且不會預設載入。如果您需要在每個虛擬主機上載入相同模組,您可以含入此目錄中的 *.conf。另一種做法是含入個別檔案。如需取得範例說明,請參閱/etc/apache2/vhost.d/vhost.template

31.4.3. 基本和延伸模組

Apache 說明文件中詳細介紹了所有的基本模組和延伸模組。本文件只提供最重要模組的概要說明。如需關於每個模組的詳細資訊,請參閱 http://httpd.apache.org/docs/2.2/mod/

mod_actions

提供在需要特定 MIME 類型 (例如 application/pdf)、具有特定副檔名的檔案 (例如 .rpm) 或特定要求方法 (例如 GET) 時執行程序檔的方法。這是預設啟用的模組。

mod_alias

提供 AliasRedirect 指示詞,供您用來將 URL 映射至特定目錄 (Alias) 或將所要求的 URL 重新導向至其他位置。這是預設啟用的模組。

mod_auth*

驗證模組提供了幾種不同的驗證方式:使用 mod_auth_basic 進行基本驗證,或使用 mod_auth_digest 進行摘要驗證。Apache 2.2 的摘要驗證方式仍屬實驗性質。

mod_auth_basicmod_auth_digest 必須與驗證提供者模組 mod_authn_* (例如適用於以文字檔案為基礎之驗證的 mod_authn_file),以及驗證模組 mod_authz_* (例如適用於使用者驗證的 mod_authz_user) 結合使用。

關於此主題的詳細資訊,請參閱 http://httpd.apache.org/docs/2.2/howto/auth.html 上的驗證 HOWTO

mod_autoindex

Autoindex 會在沒有任何索引檔案 (例如,index.html) 出現時產生目錄清單。這些索引的外觀可加以設定。這是預設啟用的模組。然而,目錄清單已預設為停用,經由 Options 指示詞來覆寫虛擬主機組態的這項設定。這個模組的預設組態檔案會存放在 /etc/apache2/mod_autoindex-defaults.conf

mod_cgi

執行 CGI 程序檔時必須使用 mod_cgi。這是預設啟用的模組。

mod_deflate

使用這個模組時,Apache 可以設定成即時壓縮成指定檔案類型之後,再進行傳送。

mod_dir

mod_dir 可提供 DirectoryIndex 指示詞,供您用來設定當要求目錄 (預設是 index.html) 時要自動傳遞哪類檔案。它還提供另一項功能:當目錄要求沒有包含末尾斜線時,就會自動重新導向到正確 URL。這是預設啟用的模組。

mod_env

控制傳遞給 CGI 程序檔或 SSI 頁面的環境。可以在呼叫 httpd 程序的外圍程序中設定、取消設定或傳遞環境變數。這是預設啟用的模組。

mod_expires

使用 mod_expires 時,您可以透過傳送 Expires 標頭,來控制代理和瀏覽器快取重新整理文件的頻率。這是預設啟用的模組。

mod_include

mod_include 可讓您使用 Server Side Include (SSI),這項工具會提供動態產生 HTML 頁面的基本功能。這是預設啟用的模組。

mod_info

可透過 http://localhost/server-info/ 提供伺服器組態的綜合綜覽。基於安全性考量,您應該永遠限制這個 URL 的存取權限。預設只允許 localhost 存取這個 URL。mod_info 是在 /etc/apache2/mod_info.conf 中設定。

mod_log_config

使用此模組時,您可以設定 Apache 記錄檔案的外觀。這是預設啟用的模組。

mod_mime

此 mime 模組會依據傳送檔案的副檔名,來確定其是否包含正確的 MIME 標頭 (例如 HTML 文件為 text/html)。這是預設啟用的模組。

mod_negotiation

內容協商 (Content Negotiation) 所需的模組。如需更多詳細資訊,請參閱 http://httpd.apache.org/docs/2.2/content-negotiation.html。這是預設啟用的模組。

mod_nss

透過 TLS 1.1 和 TLS 1.2 通訊協定使用 Mozilla Network Security Services 程式庫在 Web 伺服器與用戶端之間啟用加密連接。如需詳細資料,請參閱第 31.7 節「使用 NSS 設定安全 Web 伺服器」

mod_rewrite

可提供 mod_alias 的功能,但具備更多功能和更大的靈活性。使用 mod_rewrite 時,您可以依據多個規則、要求標頭和其他條件來重新導向 URL。

mod_setenvif

根據用戶端的要求設定環境變數,如用戶端傳送的瀏覽器字串或用戶端的 IP 位址。這是預設啟用的模組。

mod_speling

mod_speling 會嘗試自動修正 URL 中出現的打字錯誤,例如大小寫錯誤。

mod_ssl

啟用網頁伺服器和用戶端之間的加密連接。如需詳細資料,請參閱 第 31.6 節「設定提供 SSL 的安全網頁伺服器」。這是預設啟用的模組。

mod_status

可透過 http://localhost/server-status/ 提供有關伺服器活動及效能的資訊。基於安全性考量,您應該永遠限制這個 URL 的存取權限。預設只允許 localhost 存取這個 URL。mod_status 是在 /etc/apache2/mod_status.conf 中設定。

mod_suexec

mod_suexec 可讓您以不同使用者和群組身分來執行 CGI 程序檔。這是預設啟用的模組。

mod_userdir

啟用在 ~user/ 之下提供使用者特定目錄。在組態中必須指定 UserDir 指示詞。這是預設啟用的模組。

31.4.4. 多重處理模組

SUSE Linux Enterprise Server 提供了兩種不同的多重處理模組 (MPM) 來搭配 Apache 使用。

31.4.4.1. Prefork MPM

Prefork MPM 會實作非執行緒、預衍生的 Web 伺服器。這個模組會讓 Web 伺服器以類似 Apache 1.x 版的行為作業。在此版本中,Apache 會透過衍生出獨立的子程序,將各個要求分開處理。這樣發生問題的要求就不會影響其他要求,進而避免網頁伺服器出現鎖定現象。

雖然透過這種以處理程序為主的方法可以提供穩定性,但是比起 Worker MPM,Prefork MPM 會耗用較多的系統資源。Unix 作業系統會將 Prefork MPM 當作預設 MPM。

[Important]本文件的 MPM

本文件會假設 Apache 是使用 Prefork MPM。

31.4.4.2. Worker MPM

Worker MPM 會提供多執行緒 Web 伺服器。執行緒是輕量級的處理程序。執行緒和處理程序相比的優點是,它消耗的資源較少。Worker MPM 不只會衍生子處理程序,它還可使用執行緒和伺服器處理程序,來為要求提供服務。預衍生的子程序具有多重執行緒。這種方法因為耗用比 Prefork MPM 更少的系統資源,因此可以提高 Apache 的執行效能。

一個主要缺點就是 Worker MPM 的穩定性:當某執行緒毀損時,處理程序的所有執行緒都會受到影響。最嚴重的情況下,甚至還會造成伺服器當機。尤其是在負載量高的 Apache 上使用通用閘道介面 (CGI) 時,可能就會因線串無法與系統資源進行通訊而產生內部伺服器錯誤。在 Apache 上使用 worker MPM 的另外一點爭議,就是並非所有可用的 Apache 模組都能安全地使用執行緒,這樣就無法配合 worker MPM 使用。

[Warning]搭配 MPM 使用 PHP 模組

並非所有可用的 PHP 模組都是安全執行緒。因此最好不要搭配 worker MPM 來使用 mod_php

31.4.5. 外部模組

此處提供了 SUSE Linux Enterprise Server 隨附的所有外部模組的清單。

mod-apparmor

為 Apache 提供額外支援,對由 mod_php5mod_perl 這類模組處理的個別 CGI 程序檔設定 AppArmor 限制。

套件名稱:apache2-mod_apparmor
詳細資訊︰Part “Confining Privileges with AppArmor” (↑Security Guide)
mod_mono

mod_auth_kerb 提供對 Apache Web 伺服器的 Kerberos 驗證。

套件名稱:apache2-mod_auth_kerb
詳細資訊:http://modauthkerb.sourceforge.net/configure.html
mod_mono

使用 mod_mono 可讓您在伺服器中執行 ASP.NET 頁面。

套件名稱︰apache2-mod_mono
組態檔案︰/etc/apache2/conf.d/mod_mono.conf
mod_perl

mod_perl 可讓您使用內嵌解譯器來執行 Perl 程序檔。內嵌在伺服器的常駐解譯器可以避免因啟動外部解譯器造成的負荷,以及在 Perl 啟動階段時降低速度。

套件名稱︰apache2-mod_perl
組態檔案︰/etc/apache2/conf.d/mod_perl.conf
詳細資訊︰/usr/share/doc/packages/apache2-mod_perl
mod_php5

PHP 是一種伺服器端、跨平台式的 HTML 內嵌程序檔語言。

套件名稱︰apache2-mod_php5
組態檔案︰/etc/apache2/conf.d/php5.conf
詳細資訊︰/usr/share/doc/packages/apache2-mod_php5
mod_python

mod_python 允許在 Apache HTTP 伺服器中內嵌 Python,以便大幅提高效能和增加網頁應用程式的設計彈性。

套件名稱︰apache2-mod_python
詳細資訊︰/usr/share/doc/packages/apache2-mod_python
mod_security

mod_security 提供 Web 應用程式防火牆,用於保護 Web 應用程式免受各種攻擊。此外,它還支援 HTTP 流量監控和即時分析。

套件名稱︰apache2-mod_security2
組態檔案︰/etc/apache2/conf.d/mod_security2.conf
詳細資訊:/usr/share/doc/packages/apache2-mod_security2
文件:http://modsecurity.org/documentation/

31.4.6. 編譯

Apache 允許進階使用者編寫自定模組進行延伸。若要開發 Apache 模組或編譯協力廠商模組,除了相對應開發工具外,還需要套件 apache2-develapache2-devel 也包含了 apxs2 工具,這是在編譯 Apache 其他模組時,需要用到的工具。

apxs2 可以從原始程式碼進行模組編譯和安裝 (其中包括必要的組態檔案變更),並建立可於 Runtime 載入 Apache 的動態共享物件 (DSO)。

apxs2 二進位檔案位在 /usr/sbin 下方:

  • /usr/sbin/apxs2 — 適合用來建立可配合任何 MPM 使用的延伸模組。安裝位置是 /usr/lib/apache2

  • /usr/sbin/apxs2-prefork — 適合用於 prefork MPM 模組。安裝位置是 /usr/lib/apache2-prefork

  • /usr/sbin/apxs2-worker — 適合用於 worker MPM 模組。安裝位置是 /usr/lib/apache2-worker

請使用下列指令透過原始碼安裝並啟用模組︰

cd /path/to/module/source; apxs2 -cia
    mod_foo.c

其中,-c 用於編譯模組,-i 用於安裝模組,-a 用於啟用模組。如需有關 apxs2 的其他選項資訊,請參閱 apxs2(1) man 頁面。

31.5. 啟用 CGI 程序檔

Apache 的通用閘道介面 (CGI) 可讓您使用程式或程序檔 (通常指 CGI 程序檔) 建立動態內容。CGI 程序檔可以用任何程式設計語言來編寫。通常會使用類似 Perl 或 PHP 等程式檔設計語言。

若要讓 Apache 傳送 CGI 程序檔建立的內容,就必須啟用 mod_cgi 模組。同時還需要用到 mod_alias。這兩種都是預設啟用的模組。如需啟用模組的詳細資訊,請參閱第 31.4.2 節「啟用和停用」

[Warning]CGI 安全性

允許伺服器執行 CGI 程序檔會產生潛在的安全性弱點。請參考第 31.8 節「避免安全性問題」,以取得其他資訊。

31.5.1. Apache 組態

SUSE Linux Enterprise Server 中,CGI 程序檔只能在 /srv/www/cgi-bin/ 目錄中執行。這個位置已設定用來執行 CGI 程序檔。如果您已經建立虛擬主機組態 (請參閱第 31.2.2.1 節「虛擬主機組態」) 並想要將程序檔放置到主機特定的目錄,則必須解除鎖定和設定此目錄。

範例 31.5. VirtualHost CGI 組態

ScriptAlias /cgi-bin/ "/srv/www/www.example.com/cgi-bin/"1

<Directory "/srv/www/www.example.com/cgi-bin/">
 Options +ExecCGI2
 AddHandler cgi-script .cgi .pl3
 Order allow,deny4
 Allow from all
</Directory>

1

告知 Apache 依照 CGI 程序檔方式來處理位在這個目錄中的所有檔案。

2

啟用 CGI 程序檔執行

3

告知伺服器依照 CGI 程序檔方式來處理包含 .pl 和 .cgi 副檔名的檔案。依據個人需要來加以調整。

4

OrderAllow 指示詞可控制評估 Allow 和 Deny 指示詞時的預設存取狀態和順序。在這個範例中,會先評估deny陳述式,接著才評估allow陳述式,並啟用通用存取。


31.5.2. 執行程序檔範例

CGI 程式設計不同於「一般」程式設計;因為 CGI 程式和程序檔的最前面必須是 MIME-Type 標頭,例如 Content-type: text/html。這個標頭會傳送到用戶端,使其瞭解所接收內容的類型。其次,程序檔的輸出一定是用戶端 (通常是指網頁瀏覽器) 可了解的內容 -- 舉例來說,在多數情況下是指 HTML,或者是純文字或影像。

Apache 套件會在 /usr/share/doc/packages/apache2/test-cgi 提供簡單的測試程序檔。這個程序檔會以純文字方式輸出部分環境變數的內容。請將這段程序檔複製到 /srv/www/cgi-bin/ 或虛擬主機的程序檔目錄 (/srv/www/www.example.com/cgi-bin/),並將其命名為 test.cgi

可由 Web 伺服器存取的檔案應該屬於 root 使用者所有。如需其他資訊,請參閱第 31.8 節「避免安全性問題」。因為網頁伺服器可由不同使用者身分執行,所以 CGI 程序檔必須具備可供全球執行和可供全球讀取等特性。變更 CGI 目錄和使用 chmod 755 test.cgi 指令,便可套用適當的許可權。

現在,請呼叫 http://localhost/cgi-bin/test.cgihttp://www.example.com/cgi-bin/test.cgi。這時應該會顯示 CGI/1.0 測試程序檔報告

31.5.3. CGI 疑難排解

如果這時沒有顯示測試程式的輸出結果,而是出現錯誤訊息,請檢查下列項目:

CGI 疑難排解

  • 您是否有在變更組態之後重新載入伺服器?請使用 rcapache2 probe 進行檢查。

  • 您是否已正確設定自定的 CGI 目錄 (若有的話)?如果您不確定,請在預設的 CGI 目錄 /srv/www/cgi-bin/ 中測試此程序檔,並使用 http://localhost/cgi-bin/test.cgi 進行呼叫。

  • 檔案許可權是否正確?請切換至 CGI 目錄並執行 ls -l test.cgi。此測試輸出開頭應該是

    -rwxr-xr-x  1 root root
  • 請確定程序檔沒有包含任何程式設計錯誤。如果您未變更過 test.cgi,此情況應該就不會發生,但是如果您是使用自己的程式,請務必確定這些程式中沒有任何程式設計錯誤。

31.6. 設定提供 SSL 的安全網頁伺服器

如果 Web 伺服器和用戶端之間會傳輸信用卡資訊等敏感性資料,最好使用需經過驗證的安全加密連接。mod_ssl 會為用戶端和網頁伺服器之間的 HTTP 通訊,提供使用安全通訊端層 (Secure Sockets Layer, SSL)、以及傳輸層安全性 (Transport Layer Security, TLS) 通訊協定的強式加密。使用 SSL/TSL 時,網頁伺服器和用戶端之間就會建立私人連接。如此便可確保資料完整性,使用戶端和伺服器端可以彼此進行驗證。

為了完成這個目的,伺服器會在回覆任何 URL 要求之前,先傳送可證明伺服器有效身分之相關資訊的 SSL 憑證。如此即可確保該伺服器是此通訊的唯一正確端點。此外,該憑證會在用戶端和伺服器端建立加密連接,以便在沒有洩漏敏感、純文字內容的風險情況下傳輸資訊。

mod_ssl 本身不會實作 SSL/TSL 通訊協定,而是扮演 Apache 和 SSL 程式庫之間的介面。在 SUSE Linux Enterprise Server 中,使用的是 OpenSSL 程式庫。OpenSSL 會自動隨 Apache 完成安裝。

[Note]高於 TLS 1.0 的 TLS 版本

openssl 程式庫最高支援 TLS 1.0 (含) 的 TLS 版本。不支援 1.1 或 1.2 等更新的 TLS 版本。apache2-mod_nss 套件中的 mod_nss 使用 Mozilla Network Security Services 程式庫提供 TLS 1.1 和 1.2。如需詳細資料,請參閱第 31.7 節「使用 NSS 設定安全 Web 伺服器」

使用 mod_ssl 搭配 Apache 的最明顯特徵,就是 URL 的字首都會加上 https://,而不是 http://

[Tip]範例證書

安裝 apache2-example-certificates 套件時,可以使用一家假定公司Snake Oil的範例證書。

31.6.1. 建立 SSL 憑證

為了搭配使用 SSL/TSL 與網頁伺服器,您必須建立 SSL 憑證。網頁伺服器和用戶端在彼此驗證時要用到這項憑證,以便讓任一方可以清楚識別對方。為了確保憑證的完整性,其必須由每位使用者信任的一方加以簽章。

您可以建立下列三種類型的憑證:僅供測試使用的 虛擬 憑證、供已定義信任圈使用者使用的自我簽發憑證,以及由獨立、公開的憑證授權機構 (CA) 簽發的憑證。

憑證建立基本上可分為兩個步驟。首先產生憑證授權機構的私密金鑰,接著再使用該金鑰簽發伺服器憑證。

[Tip]更多資訊

若要更進一步蓋識 SSL/TSL 的概念和定義,請參閱 http://httpd.apache.org/docs/2.2/ssl/ssl_intro.html

31.6.1.1. 建立 虛擬 憑證

產生虛構憑證的步驟很簡單。您只要呼叫程序檔 /usr/bin/gensslcert,此操作會建立或覆寫下列檔案。使用 gensslcert 的可選參數可以校調證書。如需詳細資訊,可呼叫 /usr/bin/gensslcert -h

  • /etc/apache2/ssl.crt/ca.crt

  • /etc/apache2/ssl.crt/server.crt

  • /etc/apache2/ssl.key/server.key

  • /etc/apache2/ssl.csr/server.csr

  • /root/.mkcert.cfg

ca.crt 的複製本也會放在 /srv/www/htdocs/CA.crt 提供下載。

[Important]僅供測試之用

虛構憑證絕對不可用於生產環境系統。這類憑證只能用於測試目的。

31.6.1.2. 建立自我簽發憑證

如果您要設定供內部網路或已定義使用者圈使用的安全 Web 伺服器,透過您自己的憑證管理中心 (CA) 簽發憑證就可有效符合此時的憑證需求。

自我簽署憑證的建立程序分為互動的九個步驟。請切換至目錄 /usr/share/doc/packages/apache2,並執行下列指令︰./mkcert.sh make --no-print-directory /usr/bin/openssl /usr/sbin/ custom。請勿嘗試從這個目錄外面執行這個指令。這個程式會提供一系列提示訊息,其中有部分提示需要使用者輸入。

過程 31.4. 使用 mkcert.sh 建立自我簽發憑證

  1. 決定憑證所使用的簽章演算法

    選擇 RSA (R,此為預設選項),因為有些早期瀏覽器無法使用 DSA。

  2. 產生 CA 的 RSA 私密金鑰 (1024 位元)

    這時不須進行任何互動。

  3. 產生 CA 的 X.509 憑證簽發要求

    在此建立 CA 的可辨識名稱。這時系統會要求您回答一些問題,例如國家/地區名或組織名稱。請輸入有效資料,因為您在此輸入的每項資料將來都會顯示在憑證中。您不需要回答每個問題。如果有不適用的問題或是您希望保留空白,請使用 .。一般名稱是指 CA 本身的名稱 -- 請選擇明顯的名稱,例如 My company CA。

    [Important]CA 的通用名稱

    CA 的通用名稱必須區別於伺服器的通用名稱,因此不要在此步驟中選擇完全合格的主機名稱。

  4. 產生 CA 本身簽發的 X.509 憑證

    選擇憑證版本 3 (預設選項)。

  5. 產生 SERVER 的 RSA 私密金鑰 (1024 位元)

    這時不須進行任何互動。

  6. 產生 SERVER 的 X.509 憑證簽發要求

    在此建立伺服器金鑰的可識別名稱。這時要回答的問題與建立 CA 可識別名稱時回答的問題幾乎一樣。在此輸入的資料會套用到網頁伺服器,因此不需要和 CA 資料完全相同 (例如,伺服器可能會出淚任意位置)。

    [Important]選取通用名稱

    您在此輸入的一般名稱必須是安全伺服器的完整主機名稱 (例如,www.example.com)。否則瀏覽器會在存取網頁伺服器時發出警告,表示憑證與伺服器不相符。

  7. 產生本身 CA 簽發的 X.509 憑證

    選擇憑證版本 3 (預設選項)。

  8. 使用密碼片語為 CA 的 RSA 私密金鑰加密,以提高安全性

    我們強烈建議您使用密碼來加密 CA 的私密金鑰,請選擇 Y 來輸入密碼。

  9. 使用密碼片語為 SERVER 的 RSA 私密金鑰加密,以提高安全性

    若使用密碼為伺服器金鑰加密,則每當要啟動網頁伺服器時就必須輸入這個密碼。如此一來就很難自動在開機時啟動伺服器或是重新啟動網頁伺服器。因此,使用者通常會在回答這個問題時選擇 N。請注意金鑰在沒有使用密碼加密時是不受保護狀態,同時請確定只有經授權人員可以存取該金鑰。

    [Important]加密伺服器金鑰

    如果您選擇使用密碼為伺服器金鑰進行加密,請為存放在 /etc/sysconfig/apache2APACHE_TIMEOUT 提高設定值。否則,您在嘗試啟動伺服器之前可能來不及輸入密碼片語,但是伺服器早就啟動失敗而停止。

程序檔的結果頁面會出現憑證清單,以及其所產生的金鑰。不同於程序檔輸出的結果,這些檔案並不是產生到本地目錄 conf,而是產生到 /etc/apache2/ 下面的正確目錄。

最後一個步驟就是從 /etc/apache2/ssl.crt/ca.crt 將 CA 憑證檔案複製到使用者可存取的位置,以便使用者將該檔案納入其網頁瀏覽器已知和信任的 CA 清單中。否則,瀏覽器會報告該憑證是由不明授權機構所簽發。這類憑證的有效期限是一年。

[Important]自行簽署的證書

僅在供認識您、且信任您為證書管理中心之使用者存取的網頁伺服器上,方可使用自我簽署憑證。我們不建議您在公開商店等場所使用此類證書。

31.6.1.3. 取得官方簽發憑證

目前有一些可簽署憑證的官方證書管理中心。這類憑證是由值得信任的協力廠商所簽署,因此可以完全信任。對外運作的安全網頁伺服器通常已取得官方簽發憑證。

最有名的官方 CA 是 Thawte (http://www.thawte.com/) 或 Verisign (http://www.verisign.com)。這些 CA 和其他 CA 都已經編譯到所有瀏覽器中,所以瀏覽器會自動接受這些憑證授權機構簽發的憑證。

在要求官方簽署的憑證時,您並不需要向 CA 傳送憑證,而只需傳送憑證簽署要求 (Certificate Signing Request, CSR)。若要建立 CSR,請呼叫程序檔 /usr/share/ssl/misc/CA.sh -newreq

首先,程序檔會要求提供該 CSR 進行加密時所使用的密碼。接著,要求您輸入可識別名稱。這時系統會要求您回答一些問題,例如國家/地區名或組織名稱。請輸入有效資料 -- 您在此時輸入的每項資料將來都會顯示在憑證中並用於檢查。您不需要回答每個問題。如果有不適用的問題或是您希望保留空白,請使用 .。一般名稱是指 CA 本身的名稱 -- 請選擇明顯的名稱,例如 My company CA。最後,必須輸入挑戰密碼和替用的公司名稱。

從您呼叫程序檔的目錄中找出此 CSR。這個檔案名稱是 newreq.pem

31.6.2. 設定提供 SSL 的 Apache

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

[Important]防火牆組態

請不要忘記為連接埠 443 上已啟用 SSL 的 Apache 開啟防火牆。您可以依據Section “Configuring the Firewall with YaST” (Chapter 15, Masquerading and Firewalls, ↑Security Guide)所述方式,透過 YaST 完成這個動作。

在全域伺服器組態中,預設會啟用 SSL 模組。如果主機上停用了該模組,請使用 a2enmod ssl 指令將其啟用。若最終要啟用 SSL,需使用旗標 SSL 啟動伺服器。此時,請呼叫 a2enflag SSL。如果選擇使用密碼來加密伺服器證書,您還需要提高 /etc/sysconfig/apache2APACHE_TIMEOUT 的設定值,以便您在啟動 Apache 時有足夠的時間輸入該密碼片語。請重新啟動伺服器來確保這些變更生效。只是重新載入並無法保證變更生效。

虛擬主機組態目錄包含了樣板 /etc/apache2/vhosts.d/vhost-ssl.template 和 SSL 特定指示詞 (將提供詳細文件說明)。如需一般虛擬主機組態的詳細資訊,請參閱第 31.2.2.1 節「虛擬主機組態」

若要開始,請將樣板複製到 /etc/apache2/vhosts.d/mySSL-host.conf 並進行編輯。充分調整下列指示詞的值︰

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

31.6.2.1. 以名稱為基礎的虛擬主機和 SSL

依預設,在只有一個 IP 位址的伺服器上,無法同時執行多個啟用了 SSL 的虛擬主機。以名稱為基礎的虛擬主機需要 Apache 瞭解所要求的伺服器名稱。使用 SSL 連接的問題在於,此類要求只能在使用預設虛擬主機建立了 SSL 連接後才能讀取。如此一來,使用者將會收到證書與伺服器名稱不符的警告訊息。

SUSE Linux Enterprise Server 提供了一項 SSL 通訊協定的延伸︰伺服器名稱指示 (Server Name Indication,SNI)。該項延伸會在 SSL 協議中傳送虛擬網域的名稱,以此解決這個問題。這可讓伺服器早些切換至正確的虛擬網域,並在瀏覽器中顯示正確的證書。

SUSE Linux Enterprise Server 中預設會啟用 SNI。若要針對 SSL 啟用以名稱為基礎的虛擬主機,請依照第 31.2.2.1.1 節「以名稱為基礎的虛擬主機」 中所述設定伺服器 (請注意,您需要對 SSL 連線使用連接埠 443 而非 80)。

[Important]SNI 瀏覽器支援

用戶端上也必須支援 SNI。儘管大多數的瀏覽器都支援 SNI,但一些用於行動硬體的瀏覽器以及 Internet Explorer 和 Windows* XP 上的 Safari 不支援 SNI。如需詳細資料,請參閱 http://en.wikipedia.org/wiki/Server_Name_Indication

請使用指示詞 SSLStrictSNIVHostCheck 設定如何處理不支援 SNI 的瀏覽器。若在伺服器組態中設定為 on,則不支援 SNI 的瀏覽器對所有虛擬主機的存取都會遭到拒絕。若在某個 VirtualHost 指示詞中設定為 on,則對於此特定主機的存取將遭到拒絕。

若在伺服器組態中設定為 off,則伺服器將表現為不支援 SNI。SSL 要求將由為連接埠 443 定義的第一個虛擬主機處理。

31.7. 使用 NSS 設定安全 Web 伺服器

mod_nss 模組使用輸送層安全性 (TLS) 通訊協定 1.1 和 1.2 版提供增強式加密,但當 Apache 與 mod_ssl 搭配使用時無法加密。

apache2 套件中的 SSL/TLS 支援一般由 mod_ssl (使用 openssl 加密程式庫提供 SSL/TLS 的 Apache 模組) 提供。在 SUSE Linux Enterprise Server 11 SP4 中使用的 openssl 程式庫版本僅支援 TLS 1.0 版。提供 TLS 1.1 和 1.2 支援的版本,與 SLE 11 SP4 中包含的大部分套件不相容。替代方法是使用 mozilla-nss 套件提供的 Mozilla Network Security Services 程式庫。

[Note]SSLv2 支援

mod_nss 未提供 SSLv2 支援。如果您需要 SSLv2 通訊協定,則需要使用 mod_ssl

mod_sslmod_nss 可以同時初始化,但是通訊協定處理程式 (對於 mod_sslSSLEngine on,對於 mod_nssNSSEngine on) 不能同時處於使用中狀態、同時處於全域範圍中或同時處於 VirtualHost 組態指令區塊的網路位置中。

如果只有一個 VirtualHost 區段將指令 NSSEngine 設定為 on,則對於 Apache 監聽的連接埠,它的優先順序將高於其他所有 VirtualHost 宣告 (可能在其網路位置中將 SSLEngine 設定為 on)。位於同一 IP 位址和連接埠上不同虛擬主機的模組不能同時操作。如果您需要同時使用 mod_nssmod_ssl 的加密連接支援,應該考量使用多個 IP 位址並將伺服器的加密模組設定為連結至其 IP 位址。如果您不需要同時使用這兩個加密模組,則建議您選擇其中一個,並停用另一個。

因為 mmod_nss 對伺服器及 CA 證書和私密金鑰採用資料庫格式,所以需要轉換現有基於 mod_ssl 的證書,才能與 mmod_nss 搭配使用。套件 apache2-mod_nss 包含的 perl 程序檔 /usr/sbin/mod_nss_migrate.pl 即可實現該等轉換。它會建立新的資料庫。

若要列出 NSS 資料庫中包含的證書,請使用下列指令︰

certutil -d /etc/apache2/mod_nss.d -L

如需 certutil NSS 資料庫管理公用程式的詳細資訊,請使用 certutil --help

mod_nss 套件隨附的預設組態檔案是 /etc/apache2/conf.d/mod_nss.conf。如需詳細資訊,請閱讀該檔案中的注釋。

31.8. 避免安全性問題

向公用網際網路公開的網頁伺服器,必須持續進行系統管理。軟體和意外的錯誤設定不可避免地會產生安全性問題。下面是可用來處理這些問題的幾項秘訣。

31.8.1. 更新軟體

SUSE 會在發現 Apache 軟體弱點時,發出安全性建議事項。其中包含應儘速套用的弱點修正指示。請由下列位置取得 SUSE 安全性公告:

31.8.2. DocumentRoot 許可權

依預設,在 SUSE Linux Enterprise Server 中,DocumentRoot 目錄 /srv/www/htdocs 與 CGI 目錄 /srv/www/cgi-bin 的所有權屬於 root 使用者和群組。這些許可權不可變更。如果目錄對所有人開放寫入權限,則任何使用者都可以將檔案放入其中。然後,這些檔案可能會由具有 wwwrun 許可權的 Apache 執行,而這種情況可能會造成使用者取得非預期的檔案系統資源存取權限。使用 /srv/www 子目錄來存放虛擬主機的 DocumentRoot 和 CGI 目錄,並確定這些目錄所有權屬於 root 使用者和群組。

31.8.3. 檔案系統存取

依預設,/etc/apache2/httpd.conf 已設定成拒絕存取整個檔案系統。切勿覆寫這些指示詞,不過您可以特別啟用 Apache 應當能夠讀取之所有目錄的存取權限。如需詳細資料,請參閱第 31.2.2.1.3 節「基本虛擬主機組態」。如果要執行這個動作,請確保沒有任何重要檔案 (例如密碼或系統組態檔案) 可由外界進行讀取。

31.8.4. CGI 程序檔

使用 Perl、PHP、SSI 或是任何其他程式設計語言的互動式程序檔,基本上都可以執行任意指令,因此會產生常見的安全性問題。將從伺服器執行的程序檔,只能由伺服器管理員信任的來源進行安裝 -- 通常最好不要讓使用者執行自己的程序檔。同時建議您為所有程序檔進行安全性稽核。

為了盡可能簡化程序檔的管理工作,通常建議您限制 CGI 程序檔在特定目錄中執行,而不是全域性開放執行。您可以使用 ScriptAliasOption ExecCGI 指示詞來進行組態設定。SUSE Linux Enterprise Server 的預設組態不允許隨處執行 CGI 程序檔。

所有 CGI 程序檔都是以相同使用者身分執行,所以不同的程序檔彼此之間可能會產生衝突。module suEXEC 可讓您以不同使用者和群組身分來執行 CGI 程序檔。

31.8.5. 使用者目錄

在啟用使用者目錄 (使用 mod_userdirmod_rewrite) 時,您應該審慎考慮不要允許覆寫 .htaccess 檔案,因為這會允許使用者覆寫安全性設定。至少您應該使用 AllowOverRide 指示詞來限制使用者的應用範圍。在 SUSE Linux Enterprise Server 中,.htaccess 檔案預設處於啟用狀態,但使用者不允許在使用 mod_userdir 時覆寫任何 Option 指令 (請參閱 /etc/apache2/mod_userdir.conf 組態檔案)。

31.9. 疑難排解

如果 Apache 未啟動,網頁就無法存取,或者使用者無法連接網頁伺服器,因此找出問題的根源是很重要的工作。下面是您可在其中尋找錯誤原因的幾個常見位置以及需要檢查的重點︰

rcapache2 的輸出

請不要使用二進位檔 /usr/sbin/httpd2 啟動和停止 Web 伺服器,而應使用 rcapache2 程序檔 (如第 31.3 節「啟動和停止 Apache」 中所述)。該程序檔會對錯誤進行詳細說明,甚至會提供一些修復組態錯誤的祕訣與提示。

記錄檔案與詳細層級

無論發生了嚴重錯誤還是非嚴重錯誤,都可以檢查 Apache 記錄檔案尋找原因,主要檢查預設位於 /var/log/apache2/error_log 的錯誤記錄檔案。此外,如果需要檢視記錄檔案中更多的詳細資訊,還可以透過 LogLevel 指示詞來控制記錄訊息的詳細程度。

[Tip]簡單測試

請使用 tail -F /var/log/apache2/my_error_log 指令來檢視 Apache 記錄訊息。然後執行 rcapache2 restart。現在,請嘗試連接到瀏覽器,並檢查輸出結果。

防火牆與連接埠

一個常見的錯誤是,沒有在伺服器的防火牆組態中開啟 Apache 的連接埠。如果是使用 YaST 來設定 Apache,就要透過其他選項來檢查這個特定問題 (請參閱第 31.2.3 節「使用 YaST 設定 Apache」)。如果您要手動設定 Apache,請透過 YaST 防火牆模組來跚

如果無法透過這些功能來查出錯誤原因,則請查閱 http://httpd.apache.org/bug_report.html 的線上 Apache 錯誤資料庫。此外,也可以從 http://httpd.apache.org/userslist.html 取得可用的郵件清單,聯絡 Apache 使用者社群。推薦的新聞群組是 comp.infosystems.www.servers.unix

31.10. 更多資訊

apache2-doc 套件在許多位置包含了完整的 Apache 手冊,用於本地安裝及作為參考文件。這個套件不是預設安裝選項 — 安裝此套件最快的方式就是使用 zypper in apache2-doc 指令。完成安裝之後,您就可以從 http://localhost/manual/ 使用 Apach 手冊。您也可以從 http://httpd.apache.org/docs-2.2/ 網站位置來存取這份手冊。/usr/share/doc/packages/apache2/README.* 目錄會提供 SUSE 特定組態秘訣資訊。

31.10.1. Apache 2.2

如需 Apache 2.2 最新功能的清單,請參閱 http://httpd.apache.org/docs/2.2/new_features_2_2.html。如需從 2.0 升級至 2.2 版的資訊,請參閱下列網址資訊:http://httpd.apache.org/docs-2.2/upgrading.html

31.10.2. Apache 模組

有關第 31.4.5 節「外部模組」 中簡要介紹的外部 Apache 模組的詳細資訊,可在以下位置找到︰

31.10.3. 開發

如需更多有關開發 Apache 模組或是參與 Apache 網頁伺服器計畫的詳細資訊,請參閱下列主題內容:

Apache 開發人員資訊

http://httpd.apache.org/dev/

Apache 開發人員說明文件

http://httpd.apache.org/docs/2.2/developer/

使用 Perl 和 C 來編寫 Apache 模組

http://www.modperl.com/

31.10.4. 其他資源

如果您在 SUSE Linux Enterprise Server 中遇到與 Apache 有關的問題,請查閱「技術資訊搜尋」,網址為:http://www.novell.com/support關於 Apache 的歷程,請參閱 http://httpd.apache.org/ABOUT_APACHE.html。此頁面也說明稱伺服器為 Apache 的原因。


SUSE Linux Enterprise Server 管理指南 11 SP4