Apache HTTP Server 2.4 版
為了協助大家升級,我們持續編寫一份文件,說明對現有的 Apache HTTP Server 使用者至關重要的資訊。以下是要略,您可以在 新功能 文件或 src/CHANGES
檔案中找到更多資訊。應用程式和模組開發人員可以在 API 更新 概要中找到 API 變更摘要。
此文件說明伺服器行為的變更,您可能需要變更組態或使用伺服器的方式,才能持續使用 2.4,就像您現在使用 2.2 一樣。如要進一步利用 2.4 的新功能,請參閱新功能文件的說明。
本文件僅說明 2.2 到 2.4 的變更內容。如果您是從 2.0 版升級,則您也應該諮詢 2.0 到 2.2 升級文件。
編譯程序與 2.2 版中使用的程序非常類似。大部分的情況下,您可以在安裝的伺服器目錄中的 build/config.nice
找到舊的 configure
指令列(也就是修改指令列的前一個指令)。預設設定有部分變更,以下是一些變更的詳細資料
mod_cache_disk
。mod_lbmethod_bybusyness
。您可能需要建立並載入組態中使用的任何模組。LoadModule
指令會加上註解。授權組態已經做過大幅修改,且其他次要組態也做過修改,這表示您可能需要在將 2.2 組態檔案用於 2.4 之前先做修改。
任何使用授權的組態檔案可能都需要進行修改。
您應檢閱 身分驗證、授權和進入控制操作手冊,尤其是超越單純授權這一章節,這會說明用來控制授權指令套用順序的新機制。
已移除會 контроли授權模組在不符合經過身分驗證的使用者時回應方式的指令,包括 AuthzLDAPAuthoritative、AuthzDBDAuthoritative、AuthzDBMAuthoritative、AuthzGroupFileAuthoritative、AuthzUserAuthoritative 和 AuthzOwnerAuthoritative。這些指令已被表現力更豐富的 RequireAny
、RequireNone
和 RequireAll
取代。
如果您使用 mod_authz_dbm
,您必須將組態移植到使用 Require dbm-group ...
來取代 Require group ...
。
在 2.2 中,會使用指令 Order
、Allow
、Deny
和 Satisfy
來根據用戶端主機名稱、IP 位址和用戶端要求的其他特徵執行進入控制
在 2.4 中,此進入控制會使用新模組 mod_authz_host
,其執行方式與其他授權檢查相同。舊的進入控制習語應以新的身分驗證機制取代,儘管為相容舊組態,已提供新的模組 mod_access_compat
。
從技術層面而言,可以將 Order
、Allow
或 Deny
等舊指令與 Require
等新指令混合使用,但並非建議的做法。mod_access_compat
建立的目的在於支援僅包含舊指令的組態,以便簡化 2.4 升級。請檢閱以下範例,深入了解可能產生的問題。
以下是執行相同進入控制的新舊方法範例。
在本範例中,沒有身分驗證,而且所有要求都會被拒絕。
Order deny,allow Deny from all
Require all denied
在本範例中,沒有身分驗證,而且所有要求都會被允許。
Order allow,deny Allow from all
Require all granted
在下一個範例中,沒有身分驗證,而且 example.org 網域中的所有主機都被允許存取所有其他主機都會被拒絕存取。
Order Deny,Allow Deny from all Allow from example.org
Require host example.org
在下一個範例中,混用舊指令和新指令會導致意外的結果。
DocumentRoot "/var/www/html" <Directory "/"> AllowOverride None Order deny,allow Deny from all </Directory> <Location "/server-status"> SetHandler server-status Require local </Location> access.log - GET /server-status 403 127.0.0.1 error.log - AH01797: client denied by server configuration: /var/www/html/server-status
為什麼 httpd 會拒絕存取 servers-status,即使組態似乎允許存取呢?
反之,這個範例會按照預期運作
DocumentRoot "/var/www/html" <Directory "/"> AllowOverride None Require all denied </Directory> <Location "/server-status"> SetHandler server-status Order deny,allow Deny from all Allow From 127.0.0.1 </Location> access.log - GET /server-status 200 127.0.0.1
因此,即使混用組態仍然有可能,請在升級時盡量避免:保留舊指令,然後在稍後階段再移轉至新指令,或是直接全部移轉。
在許多有身分驗證的組態中,其中 Satisfy
的值是預設的 ALL,僅僅停用基於主機的存取控制的區塊會被省略
# 2.2 config that disables host-based access control and uses only authentication Order Deny,Allow Allow from all AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure Require valid-user
# No replacement of disabling host-based access control needed AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure Require valid-user
在身分驗證和存取控制都有意義地結合的組態中,應該移轉存取控制指令。這個範例允許符合 兩個 條件的要求
Order allow,deny Deny from all # Satisfy ALL is the default Satisfy ALL Allow from 127.0.0.1 AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure Require valid-user
AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure <RequireAll> Require valid-user Require ip 127.0.0.1 </RequireAll>
在身分驗證和存取控制都有意義地結合的組態中,應該移轉存取控制指令。這個範例允許符合 任一 條件的要求
Order allow,deny Deny from all Satisfy any Allow from 127.0.0.1 AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure Require valid-user
AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure # Implicitly <RequireAny> Require valid-user Require ip 127.0.0.1
如下所述,某些組態可能需要一些其他小的調整。
MaxRequestsPerChild
已重新命名為 MaxConnectionsPerChild
,更精確地描述其功能。舊名稱仍然受支援。MaxClients
已重新命名為 MaxRequestWorkers
,更精確地描述其功能。對於非同步 MPM,例如 event
,最大客戶端數目不等於工作執行緒數目。舊名稱仍然受支援。DefaultType
指令不再有任何影響,除非它與 none
以外的任何值一起使用,否則會發出警告。您需要使用其他組態設定在 2.4 中替換它。AllowOverride
現在預設為 None
。EnableSendfile
現在預設為關閉。FileETag
現在預設為「MTime Size」(沒有 INode)。mod_dav_fs
:對於使用索引節點的系統,DavLockDB
檔案的格式已經變更。升級時必須刪除舊的 DavLockDB
檔案。KeepAlive
僅接受 開啟
或 關閉
的值。先前非 「關閉」 或「0」 的任何值都被視為「開啟」。Mutex
指令。您需要評估 2.2 組態中是否使用這些已移除的指令,以確定是否只需刪除這些指令,或是需要使用 Mutex
替換這些指令。mod_cache
:CacheIgnoreURLSessionIdentifiers
現在會對查詢字串進行精確比對,而非部分比對。如果您的組態使用部分字串(例如:使用 sessionid
比對 /someapplication/image.gif;jsessionid=123456789
),則需要變更為完整的字串 jsessionid
。mod_cache
:CacheEnable
的第二個參數僅比對正向代理內容(如果以正確的通訊協定開頭)。2.2 及更早版本中,參數 '/' 會比對所有內容。mod_ldap
:LDAPTrustedClientCert
現在只會是一貫的每目錄設定。如果您使用此指令,請檢閱您的組態以確定設定顯示在所有必要的目錄內容中。mod_filter
:FilterProvider
語法已變更,現在會使用布林表達式判斷是否套用篩選器。mod_include
:
#if expr
元素會使用新的 表達式剖析器。舊的語法可使用新指令 SSILegacyExprParser
還原。mod_charset_lite
:DebugLevel
選項已移除,支持每模組 LogLevel
組態。mod_ext_filter
:DebugLevel
選項已移除,支持每模組 LogLevel
組態。mod_proxy_scgi
:PATH_INFO
的預設設定已在 httpd 2.2 中變更,某些網路應用程式會在使用新的 PATH_INFO
設定後無法正常運作。您可透過設定 proxy-scgi-pathinfo
變數,來還原之前的設定。mod_ssl
:基於 CRL 的吊銷檢查現在必須透過 SSLCARevocationCheck
明確設定。mod_substitute
:現在將最大行的長度限制在 1MB。mod_reqtimeout
:如已載入這個模組,現在會設定一些預設的逾時時間。mod_dumpio
:不再支援 DumpIOLogLevel
。資料一律記錄在 LogLevel
trace7
。ErrorLog
或 CustomLog
設定的管道記錄命令,在 2.2 及更早的版本中,使用 /bin/sh -c
呼叫。在 2.4 及後續版本中,管道記錄命令會直接執行。如要還原舊有的行為,請參閱管道記錄文件。mod_autoindex
:現在會擷取標題,並顯示先前遭到忽略的 .xhtml 檔案敘述。mod_ssl
:*_DN
變數的預設格式已變更。舊的格式仍可搭配 SSLOptions
的新引數 LegacyDNStringFormat
使用。SSLv2 協定已不再受支援。 SSLProxyCheckPeerCN
和 SSLProxyCheckPeerExpire
現在預設為開啟,導致對具有不良或過期憑證的 HTTPS 主機發出代理要求時,會以 502 狀態碼 (錯誤閘道) 失敗htpasswd
現在在所有平台上都預設使用 MD5 散列。NameVirtualHost
指令不再有任何效用,除了它會發出警告。出現在多個虛擬主機中的任一地址 / 埠組合,皆會被視為一律為基於名稱的虛擬主機。mod_deflate
現在若知道壓縮所增加的空間使用量大於要壓縮的資料,就會略過壓縮。mod_include
的 #if expr=
項目或精靈指令碼 SSILegacyExprParser
啟用於儲存錯誤文件之目錄。mod_authn_alias
所提供的功能(亦即,指令碼 AuthnProviderAlias
)已移至 mod_authn_core
。LogLevel
為 mod_rewrite
模組設定適當的記錄層級。請一同參閱 mod_rewrite 記錄 區段。在載入之前,所有模組皆需為 2.4 重新編譯。
為 2.2 版本所設計的許多第三方模組,否則將在 Apache HTTP Server 2.4 中運作而無改變。某些模組需要變更;請參閱 API 更新 總覽。
mod_unixd
mod_access_compat
或將設定更新為 2.4 授權指令碼。DefaultType
並替換為其他設定值。- AddOutputFilterByType
已從核心移至 mod_filter,且該模組必須載入。
mod_authn_core
。.htaccess
檔案未處理 - 檢查適當的 AllowOverride
指令碼;預設值在 2.4 已變更為 None
。