34 Apache HTTP 伺服器 #
根據 http://www.netcraft.com/ 的調查表明,Apache HTTP 伺服器 (Apache) 是世界上使用最廣泛的 Web 伺服器。它由 Apache 軟體基金會 (http://www.apache.org/) 研發,可在大部分作業系統上使用。SUSE® Linux Enterprise Server 隨附 Apache 2.4 版本。本章將介紹如何安裝、組態設定與設定 Web 伺服器,如何使用 SSL、CGI 與其他模組,以及如何排解 Apache 疑難。
34.1 快速入門 #
本節中的說明可協助您快速設定和啟動 Apache。您必須登入為 root
身分,才能安裝和設定 Apache。
34.1.1 要求 #
在設定 Apache Web 伺服器之前,請先確定您已符合下列要求:
此機器的網路已正確設定。如需有關這個主題的詳細資訊,請參閱 第 19 章 「基本網路知識」。
此機器的實際系統時間已透過時間伺服器進行同步維護。這是必要動作,因為 HTTP 通訊協定的部分內容會依據正確時間來運作。如需有關這個主題的詳細資訊,請參閱第 30 章 「使用 NTP 同步時間」。
已安裝最新的安全性更新。如果不清楚是否已安裝,請執行「YaST 線上更新」。
防火牆中已開啟預設的 Web 伺服器連接埠 (
80
)。為此,請將firewalld
設定為允許在公共區域中使用http
服務。如需詳細資料,請參閱Section 23.4.3, “Configuring the firewall on the command line”。
34.1.2 安裝 #
SUSE Linux Enterprise Server 中的 Apache 預設不會安裝到系統。若要以可「直接」執行的預先定義標準組態進行安裝,請按照以下步驟操作:
啟動 YaST,然後選取「
› 」。選擇
› ,然後選取 。請確認安裝個別套件,以完成此安裝程序。
34.1.3 開始 #
您可讓 Apache 在開機時自動啟動或者手動將其啟動。
為確定 Apache 會在開機期間於目標 multi-user.target
與 graphical.target
中自動啟動,請執行以下指令:
tux >
sudo
systemctl enable apache2
如需 SUSE Linux Enterprise Server 中 systemd
目標的詳細資訊,以及 YaST 的描述,請參閱第 15.4 節 「使用 YaST 管理服務」。
若要使用外圍程序手動啟動 Apache,請執行 systemctl start apache2
。
如果您在啟動 Apache 時未接收到錯誤訊息,這通常表示 Web 伺服器正在執行。若要對此進行測試:
啟動瀏覽器,並開啟 http://localhost/。
如果 Apache 已啟動且正在執行,系統會顯示「「正常運作!」」的測試頁面。
如果此頁面沒有出現,請參閱第 34.9 節 「疑難排解」。
現在網頁伺服器已經開始執行,您可以加入自己的文件、根據個人需求調整組態,或是安裝模組來新增功能。
34.2 設定 Apache #
SUSE Linux Enterprise Server 提供了兩個組態選項:
手動設定組態可以提供較詳細的設定,但是缺乏 YaST GUI 提供的方便性。
大多數組態變更需要重新載入 (有些還需要重新啟動) Apache 才能生效。請使用 systemctl reload apache2
以手動方式重新載入 Apache,或使用第 34.3 節 「啟動和停止 Apache」中所述的其中一個重新啟動選項。
如果使用 YaST 來設定 Apache,依照第 34.2.3.2 節 「HTTP 伺服器組態」中所述將「 」設定為「 」,即可讓上述操作自動完成。
34.2.1 Apache組態檔案 #
本節提供 Apache 組態檔案的綜覽。如果使用 YaST 進行組態設定,則不需要變更這些檔案,但如果以後要切換到手動組態設定,這些資訊可能非常有用。
您可以在下列兩個不同位置找到 Apache 組態檔案:
34.2.1.1 /etc/sysconfig/apache2
#
/etc/sysconfig/apache2
可控制部分的 Apache 全域設定,例如要載入的模組、要包含的其他組態檔案、伺服器應該啟動的旗標,以及應該新增至指令行的旗標。此檔案對每個組態選項都進行了詳細說明,因此本文不予以介紹。針對一般用途的網頁伺服器,在 /etc/sysconfig/apache2
中的設定應該可以符合任何組態需求。
34.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
charset.conv
指定不同語言所要使用的字元集。請不要編輯此檔案。
conf.d/*.conf
組態檔案由其他模組新增。這些組態檔案可以依實際需要包含至虛擬主機組態。如需範例,請參閱
vhosts.d/vhost.template
。若要執行這個動作,您可以為不同的虛擬主機提供不同的模組組合。default-server.conf
使用合理預設值設定所有虛擬主機的全域組態。這時不是變更組態值,而是採用虛擬主機組態覆寫組態值。
errors.conf
定義 Apache 處理錯誤的方式。若要自訂這些傳送給所有虛擬主機的訊息,請編輯此檔案。另外一種方法是覆寫虛擬主機組態中的這些指示詞。
httpd.conf
主要的 Apache 伺服器組態檔案。請勿變更此檔案。此檔案主要包含 Include 陳述式和全域設定。為此處列出的相關組態檔案覆寫全域設定。變更虛擬主機組態的主機特定設定 (例如文件根目錄)。
listen.conf
繫結 Apache 至特定的 IP 位址與連接埠在此檔案中也可以設定以名稱為基礎的虛擬主機。如需詳細資料,請參閱第 34.2.2.1.1 節 「以名稱為基礎的虛擬主機」。
magic
mime_magic 模組的資料,此模組可協助 Apache 自動判斷不明檔案的 MIME 類型。請不要變更此檔案。
mime.types
系統已知的 MIME 類型 (實際上是
/etc/mime.types
的連結)。請不要編輯此檔案。如果您需要新增這裡未列出的 MIME 類型,請將它們新增到mod_mime-defaults.conf
。mod_*.conf
預設已安裝之模組的組態檔案。如需詳細資訊,請參閱第 34.4 節 「安裝、啟用和設定模組」。請注意,選用模組的組態檔案會存放在
conf.d
目錄。server-tuning.conf
包含不同 MPM 的組態指令 (請參閱第 34.4.4 節 「多處理模組」) 和可控制 Apache 效能的一般組態選項。請在變更此檔案之後為網頁伺服器進行適當測試。
ssl-global.conf
和ssl.*
全域 SSL 組態和 SSL 證書資料。如需詳細資訊,請參閱第 34.6 節 「使用 SSL 設定安全的 Web 伺服器」。
sysconfig.d/*.conf
自動從
/etc/sysconfig/apache2
產生的組態檔案。請勿改變其中任何檔案 -- 而是編輯/etc/sysconfig/apache2
。請不要將其他組態檔案置於此目錄中。uid.conf
指定要在哪個使用者和群組 ID 之下執行 Apache。請不要變更此檔案。
vhosts.d/*.conf
您的虛擬主機組態應存放於此處。該目錄包含採用或不採用 SSL 之虛擬主機的樣板檔案。此目錄中以
.conf
結尾的每個檔案都會自動包含在 Apache 組態中。如需詳細資訊,請參閱第 34.2.2.1 節 「虛擬主機組態」。
34.2.2 以手動方式設定 Apache #
以手動方式設定 Apache 是指以 root
使用者身分來編輯純文字組態檔案。
34.2.2.1 虛擬主機組態 #
「虛擬主機」一詞,是形容 Apache 從同一部實體機器提供多個通用資源識別字串 (URI,Universal Resource Identifier) 的能力。這是指同時由一部實體電腦的單一網頁伺服器來執行多個領域 (例如,www.example.com 和 www.example.net)。
使用虛擬主機的目的,經常是為了節省管理工作 (只需要維護一部網頁伺服器) 和硬體開銷 (不需要將各個網域安裝在專屬伺服器上)。虛擬主機可以使用名稱、IP 或是連接埠作為基礎。
若要列出所有現有的虛擬主機,請使用指令 apache2ctl
-S
。該指令將輸出一份清單,顯示預設伺服器和所有虛擬主機,以及它們的 IP 位址和監聽埠。此外,該清單還顯示每個虛擬主機在組態檔案中的位置。
虛擬主機可依照第 34.2.3.1.4 節 「虛擬主機」中所述透過 YaST 設定,或是手動編輯組態檔案來設定。依預設,系統會根據 /etc/apache2/vhosts.d/ 中每部虛擬主機一個組態檔案的設定,為在 SUSE Linux Enterprise Server 中執行的 Apache 做好準備。此目錄中副檔名為
.conf
的所有檔案,都會自動包含至組態中。這個目錄會提供虛擬主機的基本樣板 (vhost.template
,或是適用於提供 SSL 支援之虛擬主機的 vhost-ssl.template
)。
建議您務必要建立虛擬主機組態檔案,即使網頁伺服器只代管一個網域。如此,您不但可以將網域專屬組態存放在一個檔案中,還可以隨時回復至運作正常的基本組態,只需移動、刪除或重新命名虛擬主機的組態檔案即可。同樣地,您應該也要分別為每個虛擬主機建立組態。
使用名稱型虛擬主機時,建議設定預設組態,以便在網域名稱與虛擬主機組態不相符時使用。系統會首先載入預設虛擬主機的組態。由於組態檔案的順序由檔案名稱決定,因此請在預設虛擬主機組態檔案名稱的開頭使用底線字元 (_
),以確定讓該檔案最先載入 (例如:_default_vhost.conf
)。
<VirtualHost>
</VirtualHost>
區塊包含要套用到特定網域的資訊。當 Apache 接收到來自訂義的虛擬主機的用戶端要求時,就會使用本節所包含的指示詞。幾乎所有指示詞都可以用於虛擬主機網路位置。如需更多有關 Apache 組態指示詞的詳細資訊,請參閱http://httpd.apache.org/docs/2.4/mod/quickreference.html。
34.2.2.1.1 以名稱為基礎的虛擬主機 #
使用以名稱為基礎的虛擬主機時,每個 IP 位址可以為數個網站提供服務。Apache 會使用用戶端所傳送之 HTTP 標頭中的主機欄位,將要求連接到與其中一個虛擬主機宣告相符的 ServerName
項目。如果沒有找到相符的 ServerName
,就會預設使用第一個指定的虛擬主機。
第一步是為要提供服務的每一個不同的名稱型主機建立 <VirtualHost>
區段。在每個 <VirtualHost>
區塊內部,您至少需要一個 ServerName
指令來指定要為哪個主機提供服務,並需要一個 DocumentRoot
指令來顯示該主機的內容位於檔案系統中的哪個位置。
VirtualHost
項目的基本範例 #<VirtualHost *:80> # This first-listed virtual host is also the default for *:80 ServerName www.example.com ServerAlias example.com DocumentRoot /srv/www/htdocs/domain </VirtualHost> <VirtualHost *:80> ServerName other.example.com DocumentRoot /srv/www/htdocs/otherdomain </VirtualHost>
開啟的 VirtualHost
標籤會將 IP 位址 (或完全合格的網域名稱) 當作名稱型虛擬主機組態的引數。連結埠號碼指令是選填項目。
允許使用萬用字元 * 做為 IP 位址的替代符號。如果是使用 IPv6 位址,該位址就必須用方括號包住。
VirtualHost
指令 #<VirtualHost 192.168.3.100:80> ... </VirtualHost> <VirtualHost 192.168.3.100> ... </VirtualHost> <VirtualHost *:80> ... </VirtualHost> <VirtualHost *> ... </VirtualHost> <VirtualHost [2002:c0a8:364::]> ... </VirtualHost>
34.2.2.1.2 以 IP 為基礎的虛擬主機 #
此虛擬主機組態替代方法需要為一台機器設定多個 IP 位址。一個 Apache 例項可裝載多個網域,每個網域都會指定不同的 IP。
實體伺服器必須為每部以 IP 為基礎的虛擬主機設定一個 IP 位址。當該電腦沒有安裝多張網路卡時,也可以使用虛擬網路介面 (IP 別名)。
以下範例顯示,Apache 正執行於 IP 為 192.168.3.100
的機器上,並負責代管 IP 位址為 192.168.3.101
與 192.168.3.102
的兩個網域。每部虛擬伺服器都必須具備個別的 VirtualHost
區塊。
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
) 所顯示的指示詞。
34.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"> Require all granted </Directory>
Require all granted
在先前版本的 Apache 中,陳述式 Require all granted
表達為:
Order allow,deny Allow from all
mod_access_compat
模組仍然支援這種舊式語法。
此完整組態看起來如下:
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"> Require all granted </Directory> </VirtualHost>
34.2.3 使用 YaST 設定 Apache #
若要使用 YaST 來設定您的 Web 伺服器,請啟動 YaST 並選取「第 34.2.3.2 節 「HTTP 伺服器組態」。
› 」。第一次啟動模組時, 會啟動,提示您對伺服器管理進行一些基本設定。完成精靈之後,每當您呼叫 模組時, 對話方塊就會啟動。如需詳細資訊,請參閱34.2.3.1 HTTP 伺服器精靈 #
HTTP 伺服器精靈包含有五個步驟。在最後一個步驟的對話方塊中,您可以進入進階組態模式以執行更具體的設定。
34.2.3.1.1 網路裝置選擇 #
在此,您可以指定 Apache 用來監聽內送要求的網路介面和連接埠。您可以選取任何現有網路介面及其 IP 位址的組合。若連接埠 (連接埠隸屬以下三種:已知埠、註冊埠和動態或私人埠) 不供其他服務使用,則皆可供您使用。預設設定為在連接埠 80
上監聽所有網路介面 (IP 位址)。
核取
選項,可在防火牆中開啟 Web 伺服器監聽的連接埠。若要使網頁伺服器在網路 (包括 LAN、WAN 或公用網際網路) 上為可用狀態,請核取此選項。只有在測試時,並且此時不須由外部網路存取 Web 伺服器,才可以關閉該連接埠。如果您有多個網路介面,請按一下 以指定應在哪些介面上開啟連接埠。按
繼續設定組態。34.2.3.1.2 模組 #
使用第 34.2.3.2.2 節 「伺服器模組」。按一下 ,繼續進行下一個對話方塊。
組態選項,可以啟用或停用 Web 伺服器應支援的程序檔語言。如需有關啟用或停用其他模組的詳細資訊,請參閱34.2.3.1.3 預設主機 #
此選項與預設網頁伺服器相關。正如第 34.2.2.1 節 「虛擬主機組態」內容所述,Apache 可以在一部實體機器上提供多個虛擬主機。組態檔案中第一個宣告的虛擬主機通常稱為預設主機。每部虛擬主機都會繼承預設主機的組態。
若要編輯主機設定 (又稱為指令),請在表格中選取相應項目,然後按一下「 」。若要新增指示詞,請按一下「 」。若要刪除指示詞,請選取該指示詞,然後按一下 。
這是伺服器預設值的清單:
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 建立的錯誤頁面 (舉例說明)。
完成設定
步驟後,請按一下 ,繼續下一個組態步驟。34.2.3.1.4 虛擬主機 #
在此步驟中,精靈會顯示已完成設定之虛擬主機的清單 (請參閱第 34.2.2.1 節 「虛擬主機組態」)。如果在啟動 YaST HTTP 精靈之前尚未進行手動變更,則不會顯示虛擬主機。
若要新增主機,請按一下「DocumentRoot
) 和「 」。「 」可用來決定主機的識別方式 (以名稱為基礎或是以 IP 為基礎)。透過「 」指定名稱或 IP 位址
按一下
,繼續進入虛擬主機組態對話方塊的第二部分。
在虛擬主機組態對話方塊的第二部分中,您可以指定是否要啟用 CGI 程序檔、以及這些程序檔要使用哪個目錄。您也可以在此啟用 SSL。如果執行了這個動作,您就必須同時指定證書的路徑。如需有關 SSL 和證書的詳細資訊,請參閱第 34.6.2 節 「設定提供 SSL 的 Apache」。使用 選項,可以指定當用戶端要求目錄時要顯示哪個檔案 (預設為 index.html
)。新增一或多個檔案名稱 (以空格分隔) 可變更此設定。使用 ,便可在伺服器的 http://www.example.com/~USER
下存取使用者公用目錄 (~USER/public_html/
) 的內容。
您不能在此隨意新增虛擬主機。如果使用以名稱為基礎的虛擬主機,就必須在網路上解析每部主機名稱。如果是使用以 IP 為基礎的虛擬主機,每個可用 IP 位址就只能指派一部主機。
34.2.3.1.5 摘要 #
這是精靈的最後一個步驟。您可以在此處決定 Apache 伺服器啟動的方式和時間:開機時啟動或手動啟動。同時可檢視目前已完成之組態的簡短摘要。如果您接受目前設定,請按一下「第 34.2.3.2 節 「HTTP 伺服器組態」 所介紹的對話方塊。
」以完成組態設定。若要進行變更,請按一下 ,直至所需的對話方塊顯示。按一下 便可開啟34.2.3.2 HTTP 伺服器組態 #
「
」對話方塊可提供比精靈更多的組態調整 (精靈 只會在第一次設定網頁伺服器時執行)。其中包含下列要介紹的四個索引標籤。在此變更的任何選項都無法立即生效 -- 您必須先按一下「 」進行確認之後,它們才會生效。按一下「 」,系統將不變更組態模組,並會捨棄您的變更。34.2.3.2.1 傾聽埠和位址 #
在「80
上監聽所有介面。任何情況下都必須核取 ,否則將無法從外部連接 Web 伺服器。只有在測試時,並且此時不須由外部網路存取 Web 伺服器,才可以關閉該連接埠。如果您有多個網路介面,請按一下 以指定應在哪些介面上開啟連接埠。
使用「第 34.3 節 「啟動和停止 Apache」。這些指令會立即生效,其記錄訊息也會即刻顯示。
」時,可檢視存取記錄檔案或錯誤記錄檔案。測試組態時此選項非常有用。記錄檔案會在另一個視窗中開啟,您也可以在此處重新啟動或重新載入 Web 伺服器。如需詳細資料,請參閱34.2.3.2.2 伺服器模組 #
您可以按一下「第 34.4 節 「安裝、啟用和設定模組」。
」,變更 Apache2 模組的狀態 (啟用或停用)。按一下「 」,可新增已經安裝但是未列出的新模組。若要更進一步認識模組,請參閱34.2.3.2.3 主要主機 #
這些對話方塊相同於前面已介紹過的對話方塊。請參閱第 34.2.3.1.3 節 「預設主機」和第 34.2.3.1.4 節 「虛擬主機」。
34.3 啟動和停止 Apache #
如果已如第 34.2.3 節 「使用 YaST 設定 Apache」中所述使用 YaST 設定,Apache 會在開機時間在 multi-user.target
與 graphical.target
中啟動。若要變更此行為,可以使用 YaST 的「 」或使用 systemctl
指令行工具 (systemctl enable
或 systemctl disable
)。
若要在執行中的系統上啟動、停止或操作 Apache,請依照下方所述使用 systemctl
或 apachectl
指令。
如需 systemctl
指令的一般資訊,請參閱第 15.2.1 節 「管理正在執行系統中的服務」。
systemctl status apache2
檢查 Apache 是否已啟動。
systemctl start apache2
啟動尚未執行的 Apache。
systemctl stop apache2
透過終止父處理程序來停止 Apache。
systemctl restart apache2
停止 Apache,然後重新啟動。啟動之前並未在執行中的網頁伺服器。
systemctl try-restart apache2
若 Apache 已在執行中,則將其停止並重新啟動。
systemctl reload apache2
通知所有 Apache 衍生處理程序在關機之前先完成各自的要求,以停止網頁伺服器。每個程序結束後都會被一個新啟動的程序所取代,最終會將 Apache 完全「重新啟動」。
提示:在生產環境中重新啟動 Apache使用此指令,您無需中斷連接,即可啟用 Apache 組態中的變更。
systemctl stop apache2
於
GracefulShutdownTimeout
所設定的指定期間後停止 Web 伺服器,以確保系統可以完成現有的要求。apachectl configtest
在不影響執行中之網頁伺服器的情況下,檢查組態檔案的語法。因為這項檢查會在每次伺服器啟動、重新載入或重新啟動時強制進行,所以通常並不需要明確執行該測試 (如果這時有找到組態錯誤,網頁伺服器就不會完成啟動、重新載入或是重新啟動)。
apachectl status
和apachectl fullstatus
分別傾印簡要或完整的狀態畫面。需要啟用
mod_status
模組,並安裝文字型瀏覽器 (例如links
或w3m
)。除此之外,必須將STATUS
新增至/etc/sysconfig/apache2
檔案的APACHE_SERVER_FLAGS
。
如果在指令中指定其他旗標,這些旗標將傳遞到 Web 伺服器。
34.4 安裝、啟用和設定模組 #
Apache 軟體採用了模組化設計:除了部分核心任務,其餘所有功能皆由模組處理。這方面的發展很快,甚至連 HTTP 都是由模組 (http_core) 處理。
Apache 模組可以在建構時編譯成 Apache 二進位檔案,或在執行時期動態載入。如需瞭解如何動態載入模組的詳細資訊,請參閱第 34.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 會負責接收和處理網頁伺服器所收到的要求,因此屬於網頁伺服器軟體的核心部分。
34.4.1 模組安裝 #
如果您已依照第 34.1.2 節 「安裝」 中所述完成預設安裝,則下列模組此時都已安裝:所有基礎模組與延伸模組、多重處理模組 Prefork MPM 以及外部模組 mod_python
。
您可以啟動 YaST,然後選擇「apache
。結果清單中除其他套件之外,還會包含所有可用的外部 Apache 模組。
34.4.2 啟用和停用 #
以手動方式或透過 YaST 啟用或停用特定模組。在 YaST 中,需要使用第 34.2.3.1 節 「HTTP 伺服器精靈」中所述的模組組態來啟用或停用程序檔語言模組 (PHP 5 和 Python)。所有其他模組都可以依據第 34.2.3.2.2 節 「伺服器模組」說明步驟來啟用或停用。
如果您想手動啟用或停用這些模組,請分別使用指令 a2enmod
MODULE 或 a2dismod
MODULE。a2enmod -l
會輸出目前所有使用中的模組清單。
如果您已經手動啟用外部模組,請確定將其組態檔案載入至所有的虛擬主機組態。外部模組的組態檔案會存放在 /etc/apache2/conf.d/
之下,而且預設會載入 /etc/apache2/default-server.conf
。如需更精細的控制,可以將 /etc/apache2/default-server.conf
中的內容設定為備註,並將其僅新增至特定的虛擬主機。如需範例,請參閱 /etc/apache2/vhosts.d/vhost.template
。
34.4.3 基礎模組和延伸模組 #
Apache 說明文件中詳細介紹了所有的基本模組和延伸模組。本文件只提供最重要模組的概要說明。如需關於每個模組的詳細資訊,請參閱 http://httpd.apache.org/docs/2.4/mod/。
mod_actions
提供在需要特定 MIME 類型 (例如
application/pdf
)、具有特定副檔名的檔案 (例如.rpm
) 或特定要求方法 (例如GET
) 時執行程序檔的方法。這是預設啟用的模組。mod_alias
提供
Alias
和Redirect
指令,供您將 URL 對應到特定目錄 (Alias
),或將所要求的 URL 重新導向到另一個位置。這是預設啟用的模組。mod_auth*
驗證模組提供了幾種不同的驗證方式:使用
mod_auth_basic
進行基本驗證,或使用mod_auth_digest
進行摘要驗證。mod_auth_basic
和mod_auth_digest
必須與驗證提供者模組mod_authn_*
(例如適用於以文字檔案為基礎之驗證的mod_authn_file
),以及驗證模組mod_authz_*
(例如適用於使用者驗證的mod_authz_user
) 結合使用。關於此主題的詳細資訊,請參閱 http://httpd.apache.org/docs/2.4/howto/auth.html 上的 Authentication HOWTO。
mod_auth_openidc
在 Apache HTTP 伺服器中使用 OpenID Connect 的唯一認可方式是借助
mod_auth_openidc
。(請參閱https://openid.net/developers/certified/)。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_http2
Apache 可以使用
mod_http2
取得對 HTTP/2 通訊協定的支援。在VirtualHost
中指定Protocols h2 http/1.1
即可實現支援。mod_include
mod_include
可讓您使用 Server Side Include (SSI),這項工具會提供動態產生 HTML 頁面的基本功能。這是預設啟用的模組。mod_info
可透過 http://localhost/server-info/ 提供伺服器組態的綜合綜覽。基於安全性考量,您應該永遠限制這個 URL 的存取權限。依預設,只有
localhost
允許存取這個 URL。可在/etc/apache2/mod_info.conf
中設定mod_info
。mod_log_config
使用此模組時,您可以設定 Apache 記錄檔案的外觀。這是預設啟用的模組。
mod_mime
Mime 模組會根據所傳送檔案的副檔名 (例如,HTML 文件的副檔名為
text/html
) 來確定檔案是否包含正確的 MIME 標頭。這是預設啟用的模組。mod_negotiation
內容協商 (Content Negotiation) 所需的模組。如需更多詳細資訊,請參閱 http://httpd.apache.org/docs/2.4/content-negotiation.html。這是預設啟用的模組。
mod_rewrite
可提供
mod_alias
的功能,但具備更多功能和更大的靈活性。使用mod_rewrite
時,您可以依據多個規則、要求標頭和其他條件來重新導向 URL。mod_setenvif
根據用戶端的要求設定環境變數,如用戶端傳送的瀏覽器字串或用戶端的 IP 位址。這是預設啟用的模組。
mod_spelling
mod_spelling
會嘗試自動修正 URL 中出現的打字錯誤,例如大小寫錯誤。mod_ssl
啟用網頁伺服器和用戶端之間的加密連接。如需詳細資料,請參閱第 34.6 節 「使用 SSL 設定安全的 Web 伺服器」。這是預設啟用的模組。
mod_status
可透過 http://localhost/server-status/ 提供有關伺服器活動及效能的資訊。基於安全性考量,您應該永遠限制這個 URL 的存取權限。預設僅允許
localhost
存取此 URL。可在/etc/apache2/mod_status.conf
中設定mod_status
。mod_suexec
mod_suexec
可讓您以不同使用者和群組身分來執行 CGI 程序檔。這是預設啟用的模組。mod_userdir
啟用
~USER/
下使用者特定的目錄。在組態中必須指定UserDir
指示詞。這是預設啟用的模組。
34.4.4 多處理模組 #
SUSE Linux Enterprise Server 提供了兩種不同的多重處理模組 (MPM) 來搭配 Apache 使用。
34.4.4.1 Prefork MPM #
Prefork MPM 會實作未產生執行緒、正在進行 Prefork 的 Web 伺服器。這個模組會讓 Web 伺服器以類似 Apache 1.x 版的行為作業。在此版本中,Apache 會透過衍生出獨立的子程序,將各個要求分開處理。這樣發生問題的要求就不會影響其他要求,進而避免網頁伺服器出現鎖定現象。
雖然透過這種以處理程序為主的方法可以提供穩定性,但是比起 Worker MPM,Prefork MPM 會耗用較多的系統資源。Unix 作業系統會將 Prefork MPM 當作預設 MPM。
本文件會假設 Apache 是使用 Prefork MPM。
34.4.4.2 Worker MPM #
Worker MPM 會提供多執行緒 Web 伺服器。執行緒是「輕量級」的處理程序。執行緒和處理程序相比的優點是,它消耗的資源較少。Worker MPM 不只會衍生子處理程序,它還可使用執行緒和伺服器處理程序,來為要求提供服務。預衍生的子程序具有多重執行緒。這種方法因為耗用比 Prefork MPM 更少的系統資源,因此可以提高 Apache 的執行效能。
一個主要缺點就是 Worker MPM 的穩定性:當某執行緒毀損時,處理程序的所有執行緒都會受到影響。最嚴重的情況下,甚至還會造成伺服器當機。尤其是在負載量高的 Apache 上使用通用閘道介面 (CGI) 時,可能就會因執行緒無法與系統資源進行通訊而產生內部伺服器錯誤。在 Apache 上使用 worker MPM 的另外一點爭議,就是並非所有可用的 Apache 模組都能安全地使用執行緒,這樣就無法配合 worker MPM 使用。
並非所有可用的 PHP 模組都是安全執行緒。因此最好不要搭配 worker MPM 來使用 mod_php
。
34.4.5 外部模組 #
此處提供了 SUSE Linux Enterprise Server 隨附的所有外部模組的清單。在列出目錄中找出模組的說明文件。
mod_apparmor
為 Apache 新增支援,以便對
mod_php5
等模組所處理的個別 CGI 程序檔設定 AppArmor 限制。套件名稱: apache2-mod_apparmor
詳細資訊: Part V, “Confining privileges with AppArmor” 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/
34.4.6 編譯 #
Apache 允許進階使用者編寫自訂模組進行延伸。若要跚apache2-devel
也包含了 apxs2
工具,這是在編譯 Apache 其他模組時,需要用到的工具。
apxs2
可以從原始程式碼進行模組編譯和安裝 (其中包括必要的組態檔案變更),並建立可於 Runtime 載入 Apache 的動態共用物件 (DSO)。
apxs2
二進位檔案位在 /usr/sbin
下方:
/usr/sbin/apxs2
— 適合用來建立可配合任何 MPM 使用的延伸模組。安裝位置是/usr/lib64/apache2
。/usr/sbin/apxs2-prefork
— 適合用於 prefork MPM 模組。安裝位置是/usr/lib64/apache2-prefork
。/usr/sbin/apxs2-worker
— 適合用於 worker MPM 模組。安裝位置是/usr/lib64/apache2-worker
。
請使用下列指令透過原始碼安裝並啟用模組:
tux >
sudo
cd /path/to/module/sourcetux >
sudo
apxs2 -cia MODULE.c
其中,-c
用於編譯模組,-i
用於安裝模組,-a
用於啟用模組。如需有關 apxs2
的其他選項資訊,請參閱 apxs2(1)
man 頁面。
34.5 啟用 CGI 程序檔 #
Apache 的通用閘道介面 (CGI) 可讓您使用程式或程序檔 (通常稱 CGI 程序檔) 建立動態內容。CGI 程序檔可以用任何程式設計語言來編寫。通常使用 PHP 之類的程序檔語言。
為了使 Apache 能夠傳遞 CGI 程序檔建立的內容,需要啟用 mod_cgi
。這時也需要用到 mod_alias 模組。
這兩種都是預設啟用的模組。如需啟用模組的詳細資訊,請參閱第 34.4.2 節 「啟用和停用」。
允許伺服器執行 CGI 程序檔會產生潛在的安全性弱點。請參考第 34.8 節 「避免安全性問題」,以取得其他資訊。
34.5.1 Apache 組態 #
在 SUSE Linux Enterprise Server 中,CGI 程序檔只能在 /srv/www/cgi-bin/
目錄中執行。這個位置已設定用來執行 CGI 程序檔。如果您已經建立虛擬主機組態 (請參閱第 34.2.2.1 節 「虛擬主機組態」) 並想要將程序檔放置到主機特定的目錄,則必須解除鎖定和設定此目錄。
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 Require all granted4 </Directory>
告知 Apache 依照 CGI 程序檔方式來處理位在這個目錄中的所有檔案。 | |
啟用 CGI 程序檔執行 | |
告知伺服器依照 CGI 程序檔方式來處理包含 .pl 和 .cgi 副檔名的檔案。依據個人需要來加以調整。 | |
|
34.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
。編輯檔案,讓 #! /bin/sh
位於第一行。
可由 Web 伺服器存取的檔案應該屬於 root
使用者所有。如需其他資訊,請參閱第 34.8 節 「避免安全性問題」。因為網頁伺服器可由不同使用者身分執行,所以 CGI 程序檔必須具備可供全球執行和可供全球讀取等特性。變更 CGI 目錄和使用 chmod 755 test.cgi
指令,便可套用適當的權限。
現在,請呼叫 http://localhost/cgi-bin/test.cgi
或 http://www.example.com/cgi-bin/test.cgi
。這時應該會顯示 「CGI/1.0 測試程序檔報告」。
34.5.3 CGI 疑難排解 #
如果這時沒有顯示測試程式的輸出結果,而是出現錯誤訊息,請檢查下列項目:
您是否有在變更組態之後重新載入伺服器?如果沒有,請使用
systemctl reload apache2
重新載入。您是否已正確設定自訂的 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
,此情況應該就不會發生,但是如果您是使用自己的程式,請務必確定這些程式中沒有任何程式設計錯誤。
34.6 使用 SSL 設定安全的 Web 伺服器 #
如果 Web 伺服器和用戶端之間會傳輸信用卡資訊等敏感性資料,最好使用需經過驗證的安全加密連接。mod_ssl
會為用戶端和網頁伺服器之間的 HTTP 通訊,提供使用安全通訊端層 (Secure Sockets Layer, SSL)、以及傳輸層安全性 (Transport Layer Security, TLS) 通訊協定的強式加密。使用 TLS/SSL 時,將在 Web 伺服器與用戶端之間建立私人連接。如此便可確保資料完整性,使用戶端與伺服器可以彼此進行驗證。
為了完成這個目的,伺服器會在回覆任何 URL 要求之前,先傳送可證明伺服器有效身分之相關資訊的 SSL 證書。如此即可確保該伺服器是此通訊的唯一正確端點。此外,該證書會在用戶端和伺服器端建立加密連接,以便在沒有洩漏敏感、純文字內容的風險情況下傳輸資訊。
mod_ssl
自身不會實作 TLS/SSL 通訊協定,而是充當 Apache 和 SSL 庫之間的介面。在 SUSE Linux Enterprise Server 中,使用的是 OpenSSL 程式庫。OpenSSL 會自動隨 Apache 完成安裝。
使用 mod_ssl
搭配 Apache 的最明顯特徵,就是 URL 的字首都會加上 https://
,而不是 http://
。
34.6.1 建立 SSL 證書 #
若要將 TLS/SSL 與 Web 伺服器搭配使用,您需要建立 SSL 證書。網頁伺服器和用戶端在彼此驗證時要用到這項證書,以便讓任一方可以清楚識別對方。為了確保證書的完整性,其必須由每位使用者信任的一方加以簽章。
您可以建立下列三種類型的證書:僅供測試使用的 「虛擬」 證書、供已定義信任圈使用者使用的自我簽發證書,以及由獨立、公開的證書授權機構 (CA) 簽發的證書。
證書的建立可分為兩個步驟。首先產生證書授權機構的私密金鑰,接著再使用該金鑰簽發伺服器證書。
若要進一步瞭解 TLS/SSL 的概念和定義,請參閱 http://httpd.apache.org/docs/2.4/ssl/ssl_intro.html。
34.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
ca.crt
的複製本也會放在 /srv/www/htdocs/CA.crt
提供下載。
虛構證書絕對不可用於生產環境系統。這類證書只能用於測試目的。
34.6.1.2 建立自行簽署的證書 #
如果您要設定一個安全 Web 伺服器供內部網路或已定義的一群使用者圈使用,則透過您自己的證書管理中心 (CA) 簽發證書就可能足以有效符合此時的證書需求。請注意,此類網站的造訪者將看到類似「此網站不可信」的警告,因為網頁瀏覽器不能識別自行簽署的證書。
僅在供認識您、且信任您為證書管理中心之使用者存取的網頁伺服器上,方可使用自我簽署證書。我們不建議您在公開商店等場所使用此類證書。
首先您需要產生證書簽署要求 (CSR)。然後使用 openssl
,並使用 PEM
作為證書格式。在此步驟中,系統會要求您輸入密碼片語並回答若干問題。請記住該密碼片語,日後還將使用。
tux >
sudo
openssl req -new > new.cert.csr Generating a 1024 bit RSA private key ..++++++ .........++++++ writing new private key to 'privkey.pem' Enter PEM pass phrase:1 Verifying - Enter PEM pass phrase:2 ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:3 State or Province Name (full name) [Some-State]:4 Locality Name (eg, city) []:5 Organization Name (eg, company) [Internet Widgits Pty Ltd]:6 Organizational Unit Name (eg, section) []:7 Common Name (for example server FQDN, or YOUR name) []:8 Email Address []:9 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:10 An optional company name []:11
填寫您的密碼片語。 | |
再次填寫密碼片語 (並記住它)。 | |
填寫以 2 個字母表示的國家/地區代碼,例如 | |
填寫您所在的州/省。 | |
填寫城市名稱,例如 | |
填寫您在職的組織機構名稱。 | |
填寫您的組織單位,沒有則保留為空白。 | |
填寫伺服器的網域名稱,或者您的名字和姓氏。 | |
填寫您的辦公電子郵件地址。 | |
將挑戰密碼保留空白,否則您每次重新啟動 Apache Web 伺服器時都需要輸入該密碼。 | |
填寫選填的公司名稱,或保留為空白。 |
現在,您可以產生證書。您將再次使用 openssl
,並且證書的格式是預設 PEM
。
將金鑰的私密部分輸出至
new.cert.key
。系統將提示您輸入在建立證書簽署要求 (CSR) 時所輸入的密碼片語。tux >
sudo
openssl rsa -in privkey.pem -out new.cert.key根據您在簽署要求中填寫的資訊產生證書的公開部分。
-days
選項指定證書到期之前的時間長度。您可以撤銷證書,或在證書到期之前更換證書。tux >
sudo
openssl x509 -in new.cert.csr -out new.cert.cert -req \ -signkey new.cert.key -days 365將證書檔案複製到相關的目錄,以便 Apache 伺服器可以讀取這些檔案。請確定私密金鑰
/etc/apache2/ssl.key/server.key
無法辨識,而公開 PEM 證書/etc/apache2/ssl.crt/server.crt
則可辨識。tux >
sudo
cp new.cert.cert /etc/apache2/ssl.crt/server.crttux >
sudo
cp new.cert.key /etc/apache2/ssl.key/server.key
最後一個步驟是將公用證書檔案從 /etc/apache2/ssl.crt/server.crt
複製到使用者可存取的位置,以便使用者將該檔案納入其網頁瀏覽器已知和信任的 CA 清單中。否則,瀏覽器會報告該證書是由不明授權機構所簽發。
34.6.1.3 獲取官方簽署的證書 #
目前有多家可簽署證書的官方證書管理中心。這類證書是由值得信任的協力廠商所簽署,因此可以完全信任。對外運作的安全網頁伺服器通常已取得官方簽發證書。最常用的證書管理中心 (CA) 一覽表可參閱 https://en.wikipedia.org/wiki/Certificate_authority#Providers。
在要求官方簽署的證書時,您並不需要向 CA 傳送證書,而只需傳送證書簽署要求 (Certificate Signing Request, CSR)。若要建立 CSR,請執行以下指令:
tux >
openssl req -new -newkey rsa:2048 -nodes -keyout newkey.pem -out newreq.pem
系統會要求您輸入可辨識名稱。這時系統會要求您回答一些問題,例如國家/地區名或組織名稱。請輸入有效資料 -- 您在此時輸入的每項資料將來都會顯示在證書中並用於檢查。您不需要回答每個問題。如果有不適用的問題或是您希望保留空白,請使用 「.」。一般名稱是指 CA 本身的名稱 -- 請選擇明顯的名稱,例如 My company CA。最後,必須輸入挑戰密碼和替用的公司名稱。
從您呼叫程序檔的目錄中找出此 CSR。這個檔案名稱是 newreq.pem
。
34.6.2 設定提供 SSL 的 Apache #
在 Web 伺服器一端,TLS/SSL 要求的預設連接埠為 443。監聽連接埠 80 的「一般」Apache 與監聽連接埠 443 且支援 TLS/SSL 的 Apache 之間沒有衝突。事實上,HTTP 和 HTTPS 可以執行相同的 Apache 例項。通常這時會使用不同的虛擬主機,將連接埠 80 和連接埠 443 的要求分派到不同的虛擬伺服器。
請不要忘記為連接埠 443 上已啟用 SSL 的 Apache 開啟防火牆。可依Section 23.4.3, “Configuring the firewall on the command line”中所述透過 firewalld
執行此操作。
在全域伺服器組態中,預設會啟用 SSL 模組。如果主機上停用了該模組,請使用 a2enmod ssl
指令將其啟用。若最終要啟用 SSL,需使用旗標 「SSL」 啟動伺服器。為此,請呼叫 a2enflag SSL
(區分大小寫!)。如果選擇使用密碼來加密伺服器證書,您還需要提高 /etc/sysconfig/apache2
中 APACHE_TIMEOUT
的設定值,以便您在啟動 Apache 時有足夠的時間輸入該密碼片語。請重新啟動伺服器來確保這些變更生效。只是重新載入並無法保證變更生效。
虛擬主機組態目錄包含了樣板 /etc/apache2/vhosts.d/vhost-ssl.template
和 SSL 特定指示詞 (將提供詳細文件說明)。如需一般虛擬主機組態的詳細資訊,請參閱第 34.2.2.1 節 「虛擬主機組態」。
若要開始設定組態,請將範本複製到 /etc/apache2/vhosts.d/mySSL-host.conf
,並對其進行編輯。充分調整下列指示詞的值:
DocumentRoot
ServerName
ServerAdmin
ErrorLog
TransferLog
34.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 啟用以名稱為基礎的虛擬主機,請依照第 34.2.2.1.1 節 「以名稱為基礎的虛擬主機」中所述設定伺服器 (請注意,您需要對 SSL 使用連接埠 443
而非 80
)。
用戶端上也必須支援 SNI。不過,只有大部分瀏覽器支援 SNI,某些較舊的瀏覽器不支援。如需詳細資訊,請參閱 https://en.wikipedia.org/wiki/Server_Name_Indication#Support。
若要設定對不支援 SNI 的瀏覽器的處理方式,請使用指令 SSLStrictSNIVHostCheck
。若在伺服器組態中設定為 on
,則不支援 SNI 的瀏覽器對所有虛擬主機的存取都會遭到拒絕。如果 VirtualHost
指令中設定為 on
,將拒絕存取此特定主機。
若在伺服器組態中設定為 off
,則伺服器將表現為不支援 SNI。將由定義的第一個虛擬主機 (連接埠 443) 來處理 SSL 要求。
34.7 在同一部伺服器上執行多個 Apache 例項 #
相較於執行多個虛擬主機 (請參閱第 34.2.2.1 節 「虛擬主機組態」),在同一部伺服器上執行多個 Apache 例項具有以下優勢:
如果需要將虛擬主機停用一段時間,您需要變更 Web 伺服器組態並將其重新啟動才能使變更生效。
如果一個虛擬主機出現問題,您需要重新啟動所有的虛擬主機。
您可以照常執行預設的 Apache 例項:
tux >
sudo
systemctl start apache2
它將會讀取預設的 /etc/sysconfig/apache2
檔案。如果該檔案不存在,或者存在但未設定 APACHE_HTTPD_CONF
變數,則該例項將會讀取 /etc/apache2/httpd.conf
。
若要啟動另一個 Apache 例項,請執行:
tux >
sudo
systemctl start apache2@INSTANCE_NAME
例如:
tux >
sudo
systemctl start apache2@example_web.org
依預設,例項會使用 /etc/apache2@example_web.org/httpd.conf
做為主要組態檔案,您可以透過設定 /etc/sysconfig/apache2@example_web.org
中的 APACHE_HTTPD_CONF
予以覆寫。
下面顯示了一個設定更多 Apache 例項的範例。請注意,您需要以 root
身分執行所有指令。
依據
/etc/sysconfig/apache2
建立一個新的組態檔案,例如/etc/sysconfig/apache2@example_web.org
:tux >
sudo
cp /etc/sysconfig/apache2 /etc/sysconfig/apache2@example_web.org編輯檔案
/etc/sysconfig/apache2@example_web.org
,將包含以下內容的行APACHE_HTTPD_CONF
針對
APACHE_HTTPD_CONF="/etc/apache2/httpd@example_web.org.conf"
依據
/etc/apache2/httpd.conf
建立檔案/etc/apache2/httpd@example_web.org.conf
。tux >
sudo
cp /etc/apache2/httpd.conf /etc/apache2/httpd@example_web.org.conf編輯
/etc/apache2/httpd@example_web.org.conf
,將Include /etc/apache2/listen.conf
針對
Include /etc/apache2/listen@example_web.org.conf
檢閱所有指令,並視需要予以變更。您可能需要變更
Include /etc/apache2/global.conf
並為每個例項建立新的
global@example_web.org.conf
。建議將ErrorLog /var/log/apache2/error_log
針對
ErrorLog /var/log/apache2/error@example_web.org_log
以便每個例項都有個別的記錄。
依據
/etc/apache2/listen.conf
建立/etc/apache2/listen@example_web.org.conf
。tux >
sudo
cp /etc/apache2/listen.conf /etc/apache2/listen@example_web.org.conf編輯
/etc/apache2/listen@example_web.org.conf
,將Listen 80
變更為要執行新例項的埠號,例如 82:
Listen 82
若要透過安全通訊協定 (請參閱第 34.6 節 「使用 SSL 設定安全的 Web 伺服器」) 執行新的 Apache 例項,還需將下面一行
Listen 443
(範例) 變更為
Listen 445
啟動新的 Apache 例項:
tux >
sudo
systemctl start apache2@example_web.org在網頁瀏覽器中開啟
http://server_name:82
,檢查伺服器是否正在執行中。如果先前變更了新例項的錯誤記錄檔案名稱,您可以檢查這項變更:tux >
sudo
tail -f /var/log/apache2/error@example_web.org_log
下面是在同一部伺服器上設定多個 Apache 例項時要注意的幾點:
/etc/sysconfig/apache2@INSTANCE_NAME
檔案可以包含與/etc/sysconfig/apache2
相同的變數,包括模組載入和 MPM 設定。當有其他例項正在執行時,不需要執行預設的 Apache 例項。
如果未使用
HTTPD_INSTANCE
環境變數另行指定,Apache 輔助程式公用程式a2enmod
、a2dismod
和apachectl
將在預設的 Apache 例項上執行。以下範例tux >
sudo
export HTTPD_INSTANCE=example_web.orgtux >
sudo
a2enmod access_compattux >
sudo
a2enmod statustux >
sudo
apachectl start會將
access_compat
和status
模組新增到/etc/sysconfig/apache2@example_web.org
的APACHE_MODULES
變數,然後啟動example_web.org
例項。
34.8 避免安全性問題 #
向公用網際網路公開的網頁伺服器,必須持續進行系統管理。軟體和意外的錯誤設定不可避免地會產生安全性問題。下面是可用來處理這些問題的幾項秘訣。
34.8.1 最新軟體 #
SUSE 會在發現 Apache 軟體弱點時,發出安全性建議事項。其中包含弱點修正指示,應盡可能套用。請由下列位置取得 SUSE 安全性公告:
34.8.2 DocumentRoot 權限 #
依預設,在 SUSE Linux Enterprise Server 中,DocumentRoot
目錄 /srv/www/htdocs
與 CGI 目錄 /srv/www/cgi-bin
的所有權屬於 root
使用者和群組。這些權限不可變更。如果目錄對所有人開放寫入權限,則任何使用者都可以將檔案放入其中。然後,這些檔案可能會由具有 wwwrun
權限的 Apache 執行,而這種情況可能會造成使用者取得非預期的檔案系統資源存取權限。使用 /srv/www
子目錄來存放虛擬主機的 DocumentRoot
和 CGI 目錄,並確定這些目錄所有權屬於 root
使用者和群組。
34.8.3 檔案系統存取 #
依預設,/etc/apache2/httpd.conf
已設定成拒絕存取整個檔案系統。切勿覆寫這些指示詞,不過您可以特別啟用 Apache 應當能夠讀取之所有目錄的存取權限。如需詳細資料,請參閱第 34.2.2.1.3 節 「基本虛擬主機組態」。如果要執行這個動作,請確保沒有任何重要檔案 (例如密碼或系統組態檔案) 可由外界進行讀取。
34.8.4 CGI 程序檔 #
使用 HP、SSI 或任何其他程式設計語言的互動式程序檔基本上可以執行任意指令,因此一般會存在安全性問題。將從伺服器執行的程序檔,只能由伺服器管理員信任的來源進行安裝 -- 通常最好不要讓使用者執行自己的程序檔。同時建議您為所有程序檔進行安全性稽核。
為了盡可能簡化程序檔的管理工作,通常建議您限制 CGI 程序檔在特定目錄中執行,而不是全域性開放執行。您可以使用 ScriptAlias
和 Option ExecCGI
指示詞來進行組態設定。SUSE Linux Enterprise Server 的預設組態不允許隨處執行 CGI 程序檔。
所有 CGI 程序檔都是以相同使用者身分執行,所以不同的程序檔彼此之間可能會產生衝突。module suEXEC 可讓您以不同使用者和群組身分來執行 CGI 程序檔。
34.8.5 使用者目錄 #
在啟用使用者目錄 (使用 mod_userdir
或 mod_rewrite
) 時,您應該審慎考慮不要允許覆寫 .htaccess
檔案,因為這會允許使用者覆寫安全性設定。至少您應該使用 AllowOverRide
指示詞來限制使用者的應用範圍。在 SUSE Linux Enterprise Server 中,.htaccess
檔案預設處於啟用狀態,但使用者在使用 mod_userdir
(請參閱 /etc/apache2/mod_userdir.conf
組態檔案) 時不允許覆寫任何 Option
指令。
34.9 疑難排解 #
如果 Apache 未啟動,網頁就無法存取,或者使用者無法連接網頁伺服器,因此找出問題的根源是很重要的工作。下面是您可在其中尋找錯誤原因的幾個常見位置以及需要檢查的重點:
apache2.service
子指令的輸出:不要使用
/usr/sbin/apache2ctl
二進位檔案來啟動和停止 Web 伺服器,而應使用systemctl
指令 (如第 34.3 節 「啟動和停止 Apache」中所述)。systemctl status apache2
詳細描述了錯誤,甚至還提供了修復組態錯誤的提示。- 記錄檔案和詳細層級
無論發生了嚴重錯誤還是非嚴重錯誤,都可以檢查 Apache 記錄檔案尋找原因,主要檢查預設位於
/var/log/apache2/error_log
的錯誤記錄檔案。此外,如果需要檢視記錄檔案中更多的詳細資訊,還可以透過LogLevel
指示詞來控制記錄訊息的詳細程度。提示:一個簡單的測試使用
tail -F /var/log/apache2/MY_ERROR_LOG
指令檢視 Apache 記錄訊息。然後執行systemctl restart apache2
。現在,請嘗試連接到瀏覽器,並檢查輸出結果。- 防火牆和連接埠
一個常見的錯誤是,沒有在伺服器的防火牆組態中開啟 Apache 的連接埠。如果是使用 YaST 來設定 Apache,就要透過其他選項來檢查這個特定問題 (請參閱第 34.2.3 節 「使用 YaST 設定 Apache」)。如果您要手動設定 Apache,請透過 YaST 防火牆模組來跚
如果無法透過這些功能來查出錯誤原因,則請查閱 http://httpd.apache.org/bug_report.html 中的線上 Apache 錯誤資料庫。此外,也可以從 http://httpd.apache.org/userslist.html 取得可用的郵件清單,聯絡 Apache 使用者社群。
34.10 更多資訊 #
apache2-doc
套件在許多位置包含了完整的 Apache 手冊,用於本地安裝及作為參考文件。這個套件不是預設安裝選項 — 安裝此套件最快的方式就是使用 zypper in apache2-doc
指令。完成安裝之後,http://localhost/manual/ 中將會有 Apach 手冊可供使用。您也可以從 http://httpd.apache.org/docs-2.4/ 網站位置來存取這份手冊。/usr/share/doc/packages/apache2/README.*
目錄會提供 SUSE 特定組態秘訣資訊。
34.10.1 Apache 2.4 #
如需 Apache 2.4 最新功能的清單,請參閱 http://httpd.apache.org/docs/2.4/new_features_2_4.html。如需從 2.2 升級至 2.4 版的資訊,請參閱下列網址資訊:http://httpd.apache.org/docs-2.4/upgrading.html。
34.10.2 Apache 模組 #
有關第 34.4.5 節 「外部模組」 中簡要介紹的外部 Apache 模組的詳細資訊,可在以下位置找到:
mod_apparmor
mod_php5
mod_python
mod_security
34.10.3 開發 #
如需更多有關開發 Apache 模組或是參與 Apache 網頁伺服器計畫的詳細資訊,請參閱下列主題內容:
- Apache 開發人員資訊
- Apache 開發人員文件
34.10.4 其他來源 #
如果您在 SUSE Linux Enterprise Server 中遇到與 Apache 有關的問題,請查閱「技術資訊搜尋」,網址為:https://www.suse.com/support。關於 Apache 的歷程,請參閱 https://httpd.apache.org/ABOUT_APACHE.html。此頁面也說明稱伺服器為 Apache 的原因。