Apache HTTP Server 第 2.4 版
說明 | 多重協定的代理/閘道伺服器 |
---|---|
狀態 | 擴充功能 |
模組識別碼 | proxy_module |
原始檔 | mod_proxy.c |
在 確保伺服器安全 前請勿啟用與 ProxyRequests
搭配使用的代理功能。開放的代理伺服器對您的網路和整個網際網路都非常危險。
mod_proxy
和相關模組為 Apache HTTP Server 實作一個代理/閘道,支援多種常見協定和負載平衡演算法。第三方模組可以新增對其他協定和負載平衡演算法的支援。
必須載入一組模組到伺服器才能提供必要的功能。這些模組可以在編譯時以靜態方式包含,或透過 LoadModule
指令以動態方式包含。這組模組必須包含下列模組:
mod_proxy
,提供基本的代理功能mod_proxy_balancer
以及一個或多個平衡器模組,如果需要執行負載平衡。(有關詳細資訊,請參閱 mod_proxy_balancer
。)協定 | 模組 |
---|---|
AJP13(Apache JServe 協定 1.3 版) | mod_proxy_ajp |
CONNECT(適用於 SSL) | mod_proxy_connect |
FastCGI | mod_proxy_fcgi |
ftp | mod_proxy_ftp |
HTTP/0.9、HTTP/1.0 和 HTTP/1.1 | mod_proxy_http |
HTTP/2.0 | mod_proxy_http2 |
SCGI | mod_proxy_scgi |
UWSGI | mod_proxy_uwsgi |
WS 和 WSS(網路套接字) | mod_proxy_wstunnel |
此外,其他模組還提供了延伸功能。快取功能由 mod_cache
和相關模組提供。使用 SSL/TLS 協定與遠端伺服器進行連線的能力是由 mod_ssl
的 SSLProxy*
指令提供的。您需要載入這些其他模組並進行設定才能利用這些功能。
Apache HTTP Server 可以設定在 正向 和 反向 代理模式(也稱為 閘道)。
一般 正向代理 是介於用戶端和來源伺服器之間的伺服器。為從來源伺服器取得內容,用戶端會傳送請求至代理伺服器,並指明來源伺服器為目標。然後,代理會要求取得來源伺服器的內容,並傳回給用戶端。必須針對用戶端設定,才能使用正向代理存取其他網站。
通常會將正向代理用於提供網路存取給本機用戶端,而這些用戶端已透過防火牆加以限制。正向代理也可以透過快取(由 mod_cache
提供)來減少網路使用。
使用 ProxyRequests
指令可啟動正向代理。正向代理允許用戶端透過你的伺服器存取任意網站,並隱藏其真實來源,因此,在啟動正向代理之前,一定要 確保你的伺服器安全,這樣,只有授權的用戶端才能存取代理。
反之,反向代理(或 閘道)對用戶端而言就像一般網站伺服器一樣。用戶端不需要做任何設定。用戶端針對反向代理名稱空間中的內容進行一般請求。然後,反向代理會決定要把這些請求傳送至何處,並回傳內容,彷彿反向代理本身就是來源一樣。
通常會將反向代理用於提供網路使用者存取防火牆後方的伺服器。反向代理也可以用於平衡多個後端伺服器的負載,或提供較慢後端伺服器的快取。此外,反向代理也可以用於把多個伺服器單純併入同一 URL 空間。
使用 ProxyPass
指令或 RewriteRule
指令的 [P]
旗標可啟動反向代理。為設定反向代理,不必啟用 ProxyRequests
。
下列範例僅供參考,以協助你入門。請閱讀各個指令的說明文件。
此外,如果你想要啟用快取,請參閱 mod_cache
的說明文件。
ProxyPass "/foo" "http://foo.example.com/bar" ProxyPassReverse "/foo" "http://foo.example.com/bar"
ProxyRequests On ProxyVia On <Proxy "*"> Require host internal.example.com </Proxy>
ProxyPass "/some/ws/capable/path/" "http://example.com/some/ws/capable/path/" upgrade=websocket
你也可以強制要求作為反向代理請求來處理,透過建立合適的處理程式傳遞。下列範例設定會使用反向代理,將所有 PHP 腳本的請求傳回至指定 FastCGI 伺服器。
<FilesMatch "\.php$"> # Unix sockets require 2.4.7 or later SetHandler "proxy:unix:/path/to/app.sock|fcgi://127.0.0.1/" </FilesMatch>
這項功能在 Apache HTTP Server 2.4.10 及更新版本中提供。
該代理伺服器會在物件中管理原始伺服器及其通訊參數的組態,稱之為工作執行緒。內建兩個工作執行緒:預設前向代理伺服器工作執行緒和預設反向代理伺服器工作執行緒。可明確組態其他工作執行緒。
兩個預設工作執行緒具有固定組態,而且當沒有其他工作執行緒符合要求時,就會使用這兩個工作執行緒。它們不會使用 HTTP 保持連線或連線再利用。反之,每次要求都會開啟及關閉與原始伺服器的 TCP 連線。
明確組態的工作執行緒由其 URL 識別。通常使用 ProxyPass
或 ProxyPassMatch
(用於反向代理時)建立和組態工作執行緒。
ProxyPass "/example" "http://backend.example.com" connectiontimeout=5 timeout=30
這將建立一個相關聯工作執行緒,其原始伺服器 URL 為 http://backend.example.com
,並將使用指定的逾時值。在使用前向代理時,通常會透過 ProxySet
指令定義工作執行緒
ProxySet "http://backend.example.com" connectiontimeout=5 timeout=30
<Proxy "http://backend.example.com"> ProxySet connectiontimeout=5 timeout=30 </Proxy>
在前進模式中使用明確組態的工作執行緒並不常見,因為前向代理伺服器通常會與許多不同的原始伺服器通訊。如果某個原始伺服器十分常使用,為這些原始伺服器建立明確工作執行緒還是有用的。明確組態的工作執行緒本身沒有前向或反向代理的概念。它們封裝了與原始伺服器通訊的共同概念。透過 ProxyPass
建立的工作執行緒供反向代理使用時,也將用於前向代理要求,此時,只要至原始伺服器的 URL 與工作執行緒 URL 相符,反之亦然。
識別直接工作執行緒的 URL 是其原始伺服器的 URL,含任何提供的路徑元件。
ProxyPass "/examples" "http://backend.example.com/examples" ProxyPass "/docs" "http://backend.example.com/docs"
此範例定義兩個不同的工作執行緒,各使用獨立的連線池和組態。
如果工作執行緒 URL 重疊,就會發生工作執行緒共用,而這會在以下情況發生:某工作執行緒的 URL 為組態檔中定義的其他工作執行緒的 URL 的前置子字串。在以下範例中
ProxyPass "/apps" "http://backend.example.com/" timeout=60 ProxyPass "/examples" "http://backend.example.com/examples" timeout=10
實際上並不會建立第二個工作執行緒。反之,使用第一個工作執行緒。好處是,只有一個連線池,所以更常重複使用連線。請注意,明確提供給後續工作執行緒的所有組態屬性都將被略過。系統會記錄這一點並發出警告。在上述範例中,URL /examples
的最終逾時值將是 60
,而不是 10
!
若要避免工作執行緒共用,請依 URL 長度對工作執行緒定義進行排序,從最長的 URL 開始。若要最大化工作執行緒共用,請使用反向排序順序。另請參閱 ProxyPass
指令排序相關的警告。
明確設定的 worker 有兩種方式:直接 worker 和 (加載) 平衡器 worker。它們支援許多重要的設定屬性,如下方 ProxyPass
指令中所述。同樣的屬性也可以使用 ProxySet
設定。
直接 worker 可用的選項組取決於原始伺服器 URL 中指定的通訊協定。可用通訊協定包括 ajp
、fcgi
、ftp
、http
和 scgi
。
平衡器 worker 是虛擬 worker,它們使用稱為其成員的直接 worker 來實際處理要求。每個平衡器可以有多個成員。當它處理要求時,會根據設定的負載平衡演算法選擇一個成員。
如果其 worker URL 使用 balancer
作為通訊協定範例,則會建立一個平衡器 worker。平衡器 URL 會唯一識別平衡器 worker。使用 BalancerMember
將成員新增到平衡器。
DNS 解析發生在第一次建立與原始網域的 socket 時。當連線重複使用啟用時,每個後端網域只會在每個子行程中解析一次,然後快取所有後續連線,直到子行程被回收為止。規劃涉及後端網域的 DNS 維護工作時,應考慮這項資訊。請同時查看 ProxyPass
參數,以取得關於連線重複使用的更多詳情。
您可以透過 <Proxy>
控制區塊來控制誰可以存取您的 proxy,如下方範例所示
<Proxy "*"> Require ip 192.168.0 </Proxy>
更多關於存取控制指令的資訊,請參閱 mod_authz_host
。
如果您使用前進代理伺服器(使用 ProxyRequests
指令),則嚴格限制存取非常重要。否則,您的伺服器可能會被任何客戶端用於存取任意主機,同時隱藏其真實身分。這對您的網路和整體網際網路來說都很危險。當使用反向代理伺服器(使用 ProxyPass
指令,同時搭配 ProxyRequests Off
)時,存取控制不那麼重要,因為客戶端只能連絡您特定設定的主機。
另請參閱 Proxy-Chain-Auth 環境變數。
如果您使用 ProxyBlock
指令,會在啟動期間查詢並快取主機名稱的 IP 位址,以便稍後進行比對測試。這可能需要花費幾秒鐘(或更久時間),具體取決於主機名稱查詢發生的速度。
放置在內網的 Apache httpd 代理伺服器需要透過公司的防火牆轉發外部要求(針對這項要求,設定 ProxyRemote
指令將對應的 scheme 轉發至防火牆代理伺服器)。不過,當它在存取內網內的資源時,在存取主機時可以繞過防火牆。 NoProxy
指令對於指定哪些主機屬於內網且應該直接存取是很有用的。
內網中的使用者傾向於從 WWW 要求省略本機網域名稱,因此要求「http://somehost/」而不是 http://somehost.example.com/
。一些商業代理伺服器會讓他們順利存取,並簡單提供要求,表示設定了本機網域。當 ProxyDomain
指令被使用,而且伺服器 設定為代理服務 時,Apache httpd 可以傳回重新導向的回應,並將客戶端寄送至正確的、完整的伺服器位址。這是優先的方法,因為使用者的書籤檔案會包含完整的網域主機。
在 mod_proxy
將要求傳送至未正確實作 KeepAlive 或 HTTP/1.1 的原始伺服器時,會有兩個 環境變數 可以強制要求使用不具備 KeepAlive 的 HTTP/1.0。這些變數是透過 SetEnv
指令設定的。
這些變數是 force-proxy-request-1.0
和 proxy-nokeepalive
筆記。
<Location "/buggyappserver/"> ProxyPass "http://buggyappserver:7001/foo/" SetEnv force-proxy-request-1.0 1 SetEnv proxy-nokeepalive 1 </Location>
在 2.4.26 和較新版本中,可以設定「no-proxy」環境變數,以停用 mod_proxy
處理目前的請求。這個變數應該使用 SetEnvIf
設定,原因是 SetEnv
沒有提早進行評估。
某些請求方法(例如 POST)包含一個請求主體。HTTP 通訊協定要求包含主體的請求使用 Chunked 傳輸編碼或傳送 Content-Length
請求標頭。在將這些請求傳遞至原始伺服器時, mod_proxy_http
會嘗試傳送 Content-Length
。但是,如果主體很大且原始請求使用 Chunked 編碼,那麼可以在上游請求中使用 Chunked 編碼。你可以使用 環境變數 來控制這個選取。設定 proxy-sendcl
透過持續傳送 Content-Length
來確保與上游伺服器最大的相容性,而設定 proxy-sendchunked
透過使用 Chunked 編碼來將資源使用降至最低。
在某些情況下,伺服器會將請求主體暫存到磁碟中以滿足請求主體的處理需求。例如,如果原始主體傳送時使用分段編碼(且檔案過大),但管理員已要求後端請求使用 Content-Length 或 HTTP/1.0 傳送時,將會發生此暫存。如果請求主體已包含 Content-Length 標頭,但伺服器已設定為濾除接收的請求主體,也可能發生此暫存。
在反向代理模式中運作(例如使用 ProxyPass
指令),mod_proxy_http
會新增多個請求標頭以將資訊傳遞至原始伺服器。這些標頭為:
X-Forwarded-For
X-Forwarded-Host
Host
HTTP 請求標頭中由客戶端要求的主機。X-Forwarded-Server
在原始伺服器上使用這些標頭時請小心,因為如果原始請求已包含其中一個標頭,則它們將包含多個值(以逗號分隔)。例如,你可以在原始伺服器的記錄格式字串中使用 %{X-Forwarded-For}i
記錄原始客戶端的 IP 位址,但如果請求經過多個代理伺服器,你可能會取得多個位址。
另請參閱 ProxyPreserveHost
和 ProxyVia
指令,用於控制其他請求標頭。
註:如果你需要指定自訂請求標頭,再新增至轉送的請求,請使用 RequestHeader
指令。
說明 | 組態後可新增的代理負載平衡器數量 |
---|---|
語法 | BalancerGrowth # |
預設值 | BalancerGrowth 5 |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | BalancerGrowth 僅可於 Apache HTTP 伺服器 2.3.13 及更新版本中使用。 |
此指令允許在可供應給虛擬主機的代理負載平衡器數量(預先組態的數量以外)中有成長的可能性。僅當至少預先組態了一個代理負載平衡器時,此指令才會生效。
說明 | 繼承主伺服器的針對 ProxyPass 的代理負載平衡器/工作者 |
---|---|
語法 | BalancerInherit On|Off |
預設值 | BalancerInherit On |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | BalancerInherit 僅可於 Apache HTTP 伺服器 2.4.5 及更新版本中使用。 |
此指令將會導致目前的伺服器/vhost「繼承」主伺服器中定義的針對 ProxyPass 的代理負載平衡器和工作者。若使用代理負載平衡器管理程式,此動作可能會造成問題和行為不一致,因此在使用該功能時,應該禁用此指令。
全域伺服器中的設定值定義所有 vhost 的預設值。
說明 | 將成員新增至負載平衡群組 |
---|---|
語法 | BalancerMember [balancerurl] url [key=value [key=value ...]] |
環境 | 目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | BalancerMember 僅在 Apache HTTP Server 2.2 以上的版本中提供。 |
此指令將成員新增至負載平衡群組中。它可以在 <Proxy balancer://...>
容器指令中使用,並可以使用 ProxyPass
指示可用的任一關鍵值對參數。
只有一個附加參數僅適用於 BalancerMember
指令:loadfactor。這是成員負載係數,介於 1.0(預設值)與 100.0 之間的小數數字,用來定義要套用至相關成員的加權負載。
僅在未包含於 <Proxy balancer://...>
容器指令時,才需要 balancerurl。它與在 ProxyPass
指令中定義的平衡器 URL 相符。
任何 <Proxy balancer://...>
容器指令中,平衡器 URL 的路徑組件都會被忽略。
通常應該從 BalancerMember
的 URL 中移除尾隨斜線。
說明 | 嘗試讓 Balancer Manager 做出的變更在重新啟動後仍然存在。 |
---|---|
語法 | BalancerPersist On|Off |
預設值 | BalancerPersist Off |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | BalancerPersist 僅在 Apache HTTP Server 2.4.4 以上的版本中提供。 |
此指令將讓與平衡器和平衡器成員關聯的共用記憶體儲存在重新啟動後仍然存在。如此一來,這些本機變更就不會在正常的重新啟動/正常狀態過渡期間遺失。
說明 | 將直接連線的主機、網域或網路 |
---|---|
語法 | NoProxy host [host] ... |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
此指令僅適用於內部網路中的 Apache httpd 代理伺服器。NoProxy
指令會指定一串子網域、IP 位址、主機和/或網域,並以空格分隔。針對與其中一項或多項相符的主機發出的請求,會直接提供服務,而不會轉發至已設定的 ProxyRemote
代理伺服器。
ProxyRemote "*" "http://firewall.example.com:81" NoProxy ".example.com" "192.168.112.0/21"
NoProxy
指令中的 host 引數屬於下列型別清單之一
網域 是部分限定的 DNS 網域名稱,前面有句點。它代表一群在邏輯上屬於同一 DNS 網域或區域的主機(即,所有主機名稱的字尾都以 網域 結尾)。
.com .example.org.
為了區分 網域 和 主機名稱(在語法和語義上;DNS 網域也可以有 DNS A 記錄!),網域 通常會寫成前面有句點。
網域名稱比較時不區分大小寫,且Domain預設固定在 DNS 樹狀結構的根節點;因此,.ExAmple.com
和 .example.com.
(注意結尾的句點)這兩個網域視為相等。由於網域比較不涉及 DNS 查詢,所以比子網路比較更有效率。
SubNet 是一種網域名稱,採用數字 (點分十進位數) 格式,並可選擇加上斜線和網路遮罩,規定為SubNet 中的有效位元數。用於表示可透過共用網路介面存取的主機子網路。如果沒有明確指定網路遮罩,則會假設省略 (或為零) 的尾數位元組指定遮罩。(在此情況下,網路遮罩只能為 8 位元的倍數。)範例
192.168
或 192.168.0.0
255.255.0.0
的網路遮罩格式)192.168.112.0/21
192.168.112.0/21
,網路遮罩為 21 個有效位元 (也採用 255.255.248.0
的格式)極端情況下,具有 32 個有效位元 的SubNet等同於IPAddr,而具有零個有效位元的SubNet (例如,0.0.0.0/0) 則與常數_Default_相同,適用於任何 IP 位址。
IPAddr 表示使用數字 (點分十進位數) 格式的完整網際網路位址。通常,這個位址代表一個主機,但與該位址連結不一定會有 DNS 網域名稱。
192.168.123.7
IPAddr 不需要由 DNS 系統解析,所以可提升 apache 的效能。
Hostname 是一個完整的 DNS 網域名稱,可透過 DNS 網域名稱服務解析為一個或多個IPAddrs。它表示一個邏輯主機 (與Domain不同,如上所述),而且必須可解析為至少一個IPAddr (或通常是解析為具有不同IPAddr 的主機清單)。
prep.ai.example.edu
www.example.org
在許多情況下,將Hostname指定為IPAddr會更有效率,因為可以避免 DNS 查詢。當與名稱伺服器的連線使用速度較慢的 PPP 連結時,Apache httpd 中的名稱解析會花費相當長的時間。
Hostname 比較時不區分大小寫,且預設會將Hostname固定在 DNS 樹狀結構的根節點;因此,WWW.ExAmple.com
和 www.example.com.
(注意結尾的句點)這兩個主機視為相等。
說明 | 套用至代理資源的指令容器 |
---|---|
語法 | <Proxy 萬用字元 URL> ...</Proxy> |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
置於 <Proxy>
區段的指令僅適用於符合的代理內容。允許使用 shell 型式的萬用字元。
例如,下列指令只會允許 yournetwork.example.com
中的主機透過您的代理伺服器存取內容
<Proxy "*"> Require host yournetwork.example.com </Proxy>
當下列範例中的 foo
目錄中的所有檔案透過代理伺服器傳送時,將使用 INCLUDES
篩選器處理這些檔案
<Proxy "http://example.com/foo/*"> SetOutputFilter INCLUDES </Proxy>
後端 URL 會比對設定區段,只要 URL 開頭包含 wildcard-url 字串,即使指令中的最後路徑區段僅符合後端 URL 的字首。例如,<Proxy "http://example.com/foo"> 會比對所有 http://example.com/foo、http://example.com/foo/bar 以及 http://example.com/foobar。最後 URL 的比對方式與 <Location>
區段的行為不同,後者會將最後路徑元件視為以斜線結尾。
如要更細緻地控制比對,請參閱<ProxyMatch>
。
說明 | 將 100-continue 預期值轉發至原始伺服器 |
---|---|
語法 | Proxy100Continue Off|On |
預設值 | Proxy100Continue On |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 在版本 2.4.40 及後續版本中提供 |
此指令決定代理伺服器是否應將 100-continue Expect:ation 轉發至原始伺服器,進而讓原始伺服器決定何時/是否讀取 HTTP 要求本體,或是在 Off
狀態下,代理伺服器應自行產生 100 Continue 中間回應再轉發請求本體。
此選項僅適用於 HTTP 代理,由 mod_proxy_http
處理。
說明 | 在 X-Forwarded-* 標頭中加入代理資訊 |
---|---|
語法 | ProxyAddHeaders Off|On |
預設值 | ProxyAddHeaders On |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 在版本 2.3.10 及後續版本中提供 |
此指令決定是否透過 X-Forwarded-For、X-Forwarded-Host 及 X-Forwarded-Server HTTP 標頭將代理相關資訊傳遞至後端伺服器。
此選項僅適用於 HTTP 代理,由 mod_proxy_http
處理。
說明 | 決定如何處理回應中的錯誤標頭列 |
---|---|
語法 | ProxyBadHeader IsError|Ignore|StartBody |
預設值 | ProxyBadHeader IsError |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
如果 mod_proxy
從原始伺服器接收語法無效的回應標頭列(例如不含冒號),ProxyBadHeader
指令會決定 mod_proxy
的行為。可用參數如下
IsError
Ignore
StartBody
說明 | 禁止代理的文字、主機或網域 |
---|---|
語法 | ProxyBlock *|字詞|主機|網域 [字詞|主機|網域] ... |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
ProxyBlock
指令指定一個以空格分隔的文字、主機和/或網域清單。代理伺服器會封鎖名稱包含符合的文字、主機或網域的 HTTP、HTTPS 和 FTP 文件要求。代理模組也會在啟動時嘗試找出清單項目(可能是主機名稱)的 IP 位址,並將其快取以進行配對測試。這可能會減慢伺服器的啟動時間。
ProxyBlock "news.example.com" "auctions.example.com" "friends.example.com"
請注意,example
也足以與這些網站中的任何一個配對。
主機也會在被 IP 位址參照時配對。
另請注意
ProxyBlock "*"
會封鎖與所有網站的連線。
說明 | 代理請求的預設網域名稱 |
---|---|
語法 | ProxyDomain 網域 |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
此指令僅適用於內部網路內的 Apache httpd 代理伺服器。ProxyDomain
指令指定 Apache 代理伺服器所屬的預設網域。若遇到一個沒有網域名稱的主機要求,系統會產生一個重新導向回應,並加上已設定的 網域 附加到相同的主機。
ProxyRemote "*" "http://firewall.example.com:81" NoProxy ".example.com" "192.168.112.0/21" ProxyDomain ".example.com"
說明 | 覆寫代理內容的錯誤頁面 |
---|---|
語法 | ProxyErrorOverride Off|On [代碼 ...] |
預設值 | ProxyErrorOverride Off |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 狀態代碼清單已新增到 2.4.47 |
此指令適用於反向代理設定,您希望在使用者看到的錯誤頁面上擁有相同的外觀和感覺。這也允許包含的文件(透過 mod_include
的 SSI)取得錯誤代碼並採取相應的動作。(預設行為會顯示代理伺服器的錯誤頁面。開啟此選項會顯示 SSI 錯誤訊息。)
此指令不會影響資訊 (1xx)、正常成功 (2xx) 或重新導向 (3xx) 回應的處理。
預設情況下,ProxyErrorOverride
會影響所有代碼介於 400(包含)到 600(不包含)之間的回應。
ProxyErrorOverride On
若要變更預設行為,您可以指定狀態代碼,以空格分隔。如果您這樣做,所有其他狀態代碼將被忽略。您只能指定被視為錯誤代碼的狀態代碼:介於 400(包含)到 600(不包含)之間。
ProxyErrorOverride On 403 405 500 501 502 503 504
說明 | 確定內部資料傳輸緩衝區的大小 |
---|---|
語法 | ProxyIOBufferSize 位元組 |
預設值 | ProxyIOBufferSize 8192 |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
ProxyIOBufferSize
指令調整用於輸入與輸出之間資料暫存區的內部緩衝區大小。大小必須至少為 512
。
在幾乎所有情況下,都不需要變更該值。
若與 AJP 使用,此指令會設定最大 AJP 封包大小(以位元組為單位)。大於 65536 的值會設為 65536。如果您將其變更為預設值,也必須變更 Tomcat 端上 AJP 連接器的 packetSize
屬性!packetSize
屬性僅在 Tomcat 5.5.20+
和 6.0.2+
中可用。
通常不需要變更最大封包大小。在傳送憑證或憑證鏈時,已報告預設值有問題。
說明 | 套用於常規表達式匹配的代理資源的指令容器 |
---|---|
語法 | <ProxyMatch resex>…</ProxyMatch> |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
<ProxyMatch>
指令與 <Proxy>
指令相同,差別在於它使用 正規表示法來比對 URL。
從 2.4.8 起,命名的群組和反向參考會被擷取並寫入至環境,對應名稱加上前置詞「MATCH_」並以大寫表示。這允許從 表示式和 mod_rewrite
等模組中參照 URL 的元素。為了避免混淆,已忽略編號(未命名)反向參考。請改用命名群組。
<ProxyMatch "^http://(?<sitename>[^/]+)"> Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example </ProxyMatch>
說明 | 請求可轉發的代理最大數目 |
---|---|
語法 | ProxyMaxForwards 數目 |
預設值 | ProxyMaxForwards -1 |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 預設行為於 2.2.7 中變更 |
ProxyMaxForwards
指令指定請求可能通過的最大代理數目(如果請求中沒有提供 Max-Forwards
標頭)。可設定此選項以防止無限代理迴圈或 DoS 攻擊。
ProxyMaxForwards 15
請注意,設定 ProxyMaxForwards
違反 HTTP/1.1 協定(RFC2616),這會禁止 Proxy 設定 Max-Forwards
(如果 Client 沒有設定)。舊版的 Apache httpd 會始終設定它。負 ProxyMaxForwards
值(包括預設值 -1)會提供相符協定的行為,但可能會讓您暴露於迴圈中。
說明 | 將遠端伺服器對應到本機伺服器 URL 空間 |
---|---|
語法 | ProxyPass [路徑] !|網址 [鍵=值 [鍵=值 ...]] [nocanon] [interpolate] [noquery] |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 於 2.4.7 中新增 Unix Domain Socket (UDS) 支援 |
此指令允許將遠端伺服器對映到本機伺服器的空間中。本機伺服器不會像傳統意義上的代理伺服器那樣作為代理伺服器,而是看起來是遠端伺服器的鏡像。本機伺服器通常稱為反向代理伺服器或閘道。‹var›路徑‹/var›是本機虛擬路徑的名稱;‹var›網址‹/var›是遠端伺服器的一部分網址,且不能包含查詢字串。
ProxyPass
時,ProxyRequests
指令通常應該設定為 關閉。在 2.4.7 及後續版本中,支援使用 Unix Domain Socket,方法是使用一個之前加上 unix:/path/lis.sock|
的目標。例如,要代理 HTTP,並將 UDS 目標設定為 /home/www.socket,則可以使用 unix:/home/www.socket|https://127.0.0.1/whatever/
。
unix:
網址關聯的路徑會辨識 DefaultRuntimeDir
。當在 <Location>
區段中使用時,第一個參數會被略過,而本機目錄會從 <Location>
取得。在 <LocationMatch>
區段中也會發生相同的情況;但是,ProxyPass 不會 將正規表示法詮釋為正規表示法,因此必須在此情況下改用 ProxyPassMatch
。
假設本機伺服器的位址為 http://example.com/
;那麼
<Location "/mirror/foo/"> ProxyPass "http://backend.example.com/" </Location>
會將本機針對 http://example.com/mirror/foo/bar
的請求在內部轉換為對 http://backend.example.com/bar
的代理請求。
如果你需要更彈性的反向代理組態,請參閱具有 [P]
旗標的 RewriteRule
指令。
下列替代語法是可行的;但是,當存在大量替代語法時,可能會造成效能下降。下列語法的優點是它允許透過負載平衡管理員介面進行動態控制。
ProxyPass "/mirror/foo/" "http://backend.example.com/"
如果第一個參數以尾端的 / 結尾,第二個參數也應該以尾端的 / 結尾,反之亦然。否則,傳送給後端的請求可能會遺失部分必要的斜線,而且不會傳送預期的結果。
!
指令在你不想要反向代理子目錄的情況下很有用,例如
<Location "/mirror/foo/"> ProxyPass "http://backend.example.com/" </Location> <Location "/mirror/foo/i"> ProxyPass "!" </Location>
ProxyPass "/mirror/foo/i" "!" ProxyPass "/mirror/foo" "http://backend.example.com"
將會將所有對 /mirror/foo
的請求代理到 backend.example.com
,除了對 /mirror/foo/i
的請求。
在不同內容中混合 ProxyPass 設定不會起作用
ProxyPass "/mirror/foo/i" "!" <Location "/mirror/foo/"> ProxyPass "http://backend.example.com/" </Location>
在這種情況下,傳送給 /mirror/foo/i
的要求將會透過代理傳送,因為 ProxyPass
指令在位置區塊中將會率先評估。ProxyPass
支援伺服器和目錄背景,並沒有表示在組態檔案中的範圍和位置會保證任何順序或覆寫。
所設定的 ProxyPass
和 ProxyPassMatch
規則會依照組態的順序檢查。第一個符合的規則勝出。所以通常您要先排序相互衝突的 ProxyPass
規則,從最長的網址開始。否則,較長網址的後續規則會遭到任何使用網址開頭子字串而較早出現的規則隱藏。請注意,有一些與工作者分享有關。
排除必須置於一般 ProxyPass
指令之前。在 2.4.26 和後續版本中,「no-proxy」環境變數是排除的替代選項,而且是唯一可以用來設定 ProxyPass
指令的排除選項的方式,在 Location
背景中。這個變數必須設定為 SetEnvIf
,因為 SetEnv
評估的時間並不夠早。
ProxyPass key=value
參數
在 Apache HTTP Server 2.1 和後續版本中,mod_proxy 支援後端伺服器的共同連線。可以依據需求建立的連線可以保留在共同連線中,以供未來使用。可以在 ProxyPass
指令上以 key=value
參數編碼共同連線大小和其他設定,這些設定於下列表格中說明。
預設上,mod_proxy 會允許並保留網頁伺服器之子處理程序可以同時使用的最大連線數。使用 max
參數可以從預設值減少數量。共同連線會針對每個網頁伺服器之子處理程序維護,而且 max
和其他設定不會在所有之子處理程序之間協調,除非透過組態或 MPM 設計僅允許一個之子處理程序。
使用 ttl
參數設定選擇性的到期時間;未使用長達 ttl
秒的連線將會關閉。ttl
可以用來避免使用可能會因為後端伺服器的保活逾時而關閉的連線。
ProxyPass "/example" "http://backend.example.com" max=20 ttl=120 retry=300
Worker 或 BalancerMember 參數 |
---|
參數 | 預設值 | 說明 | |||||||
---|---|---|---|---|---|---|---|---|---|
最小 | 0 | 連線池條目的最小數目,與實際連線數無關。這是僅在特殊情況下,當應該預先配置與後端連線關聯的堆疊記憶體或將其保留時,才需要修改為預設值。 | |||||||
max | 1...n | 允許連往後端伺服器連線的最大數目。這個限制的預設值為每個程序執行中的執行緒數目。在 Prefork MPM 中,這個值總是 1,而與其他 MPM 結合時,這個值則受 ThreadsPerChild 指令控制。 | |||||||
smax | max | 如果超出的連線池項目未使用超過生存時間 (受 ttl 參數控制),它們會在特定操作期間釋放。如果連線池項目具有關聯的連線,則該連線將會關閉。這僅在特殊情況下需要修改為預設值,在這些情況下需要更積極地釋放或關閉連線池項目與任何已超過生存時間的關聯連線。 | |||||||
acquire | - | 如果已設定,這將成為連線池中等待可用連線的最大時間(以毫秒為單位)。如果池中沒有可用連線,Apache httpd 會傳回 SERVER_BUSY 狀態給用戶端。 | |||||||
connectiontimeout | timeout | 以秒為單位的連線逾時時間。Apache httpd 等待完成與後端的連線建立的秒數。透過增加 ms 字尾,也可以用毫秒為單位設定逾時時間。 | |||||||
disablereuse | 關閉 | 當您要強制 mod_proxy 在使用後立即關閉到後端的連線,因此停用其對那個後端的持續連線和池時,應該使用這個參數。這有助於在 Apache httpd 和後端伺服器之間的防火牆(不論協定)傾向於靜默中斷連線,或後端本身可能處於循環 DNS 的情況下。當連線重複使用已啟用時,每個後端網域每子程序只會解析(經由 DNS 查詢)一次,並為所有進一步連線快取,直到該子程序回收為止。要停用連線重複使用,請將此屬性的值設定為 開啟 。 | |||||||
enablereuse | 開啟 | 這是上述「disablereuse」的反向,只要連線重複使用 (例如 mod_proxy_fcgi ) 需要選擇加入,就能提供方案處理常式作為一個便利性。僅限 2.4.11 和更新版本。 | |||||||
flushpackets | 關閉 | 確定代理模組是否會在每次資料「區塊」後自動清除輸出編組。'關閉' 表示只會在需要時清除;'開啟' 表示在傳送每個區塊後清除;'自動' 表示輪詢/等待一段時間,如果在「flushwait」毫秒內沒有收到任何輸入,則會清除。目前,這僅對 mod_proxy_ajp 和 mod_proxy_fcgi 有效。 | |||||||
flushwait | 10 | 如果 'flushpackets' 為 'auto',則在清除輸出編組前的等待時間(以毫秒為單位),等候額外的輸入。 | |||||||
iobuffersize | 8192 | 調整內部刮痕板 IO 緩衝區大小。這讓您可以覆寫特定工作者的 ProxyIOBufferSize 。它必須至少為 512,或設為 0 以使用 8192 的系統預設值。 | |||||||
responsefieldsize | 8192 | 調整代理回應欄位緩衝區大小。緩衝區大小至少應該為代理回應中預測標頭大小的最大值。將值設為 0 會使用 8192 位元的系統預設值。 可用於 Apache HTTP Server 2.4.34 及之後版本。 | |||||||
keepalive | 關閉 | 當 Apache httpd 與後端伺服器之間有防火牆時,應使用此參數,這種情況會導致中斷閒置連線。此標記會告知作業系統在閒置連線上傳送 初次和後續 TCP KeepAlive 探測的頻率取決於作業系統的全球設定,且可能長達 2 小時。為了發揮作用,在作業系統中設定的頻率必須小於防火牆使用的門檻值。 | |||||||
lbset | 0 | 設定工作者為其成員的負載平衡器叢集組。負載平衡器會先嘗試較低編號 lbset 的所有成員,再嘗試較高編號的成員。 | |||||||
ping | 0 | Ping 屬性會指示 Web 伺服器在轉送請求之前「測試」與後端伺服器的連線。對於 AJP,它會導致 mod_proxy_ajp 在 ajp13 連線上傳送 CPING 請求(在 Tomcat 3.3.2+、4.1.28+ 和 5.0.13+ 上實作)。對於 HTTP,它會導致 mod_proxy_http 將 100-Continue 傳送至後端(僅適用於 HTTP/1.1 - 對非 HTTP/1.1 後端,此屬性無效)。在兩種情況下,參數都是等待回復的秒數延遲時間。新增此功能的目的是避免處理已中斷和過載的後端所帶來的問題。這會在一般操作過程中增加網路流量,可能會造成問題,但如果部分叢集節點中斷或過載,它會降低流量。透過加 ms 字尾,延遲時間也可以使用毫秒為單位來設定。 | |||||||
receivebuffersize | 0 | 調整代理連線的明確 (TCP/IP) 網路緩衝區大小。這讓您可以覆寫特定工作者的 ProxyReceiveBufferSize 。它必須至少為 512,或設為 0 以使用系統預設值。 | |||||||
redirect | - | 工作者的重新導向路由。此值通常會動態設定為安全地從叢集中移除節點。如果已設定,所有沒有工作階段 ID 的請求將會重新導向至路由參數等於此值的 BalancerMember。 | |||||||
retry | 60 | 連線池工作執行緒重試逾時(秒)。如果連線池工作執行緒至後端伺服器處於錯誤狀態,Apache httpd 在逾時到期前不會將任何要求轉送至該伺服器。這能讓維護中的後端伺服器關閉,並在稍後重新上線。值 0 表示永遠重試處於錯誤狀態的工作執行緒,且沒有逾時。 | |||||||
路由 | - | 當在負載平衡器內部使用時的工作執行緒路由。路由是附加至工作階段識別碼的一個值。 | |||||||
狀態 | - | 定義此工作執行緒初始狀態的單一字母值。
| |||||||
timeout | ProxyTimeout |
Socket 逾時(秒)。Apache httpd 等待後端傳送或接收資料的秒數。 | |||||||
ttl | - | 非活動連線和關聯連線池條目的存活時間(秒)。一旦達到此限制,就不會再使用連線;它會在稍後某個時間點關閉。 | |||||||
flusher | flush |
| |||||||
secret | - | 供 mod_proxy_ajp 使用的秘文值。它必須與 AJP 連線伺服器端設定的秘文相同。可用於 Apache HTTP Server 2.4.42 及以上版本。 | |||||||
升級 | - | HTTP 用戶端或瀏覽器協商時, | |||||||
對應 | - | 路徑 與 網址 之間的對應類型。這會決定
ProxyPass "/special%3Fsegment" "https://example.com/special%3Fsegment" mapping=encoded <Location "/special%3Fsegment"> Require ip 172.17.2.0/24 </Location>
ProxyPass "/some/path" "https://servlet.example.com/some/path" mapping=servlet <Location "/some/path"> Require valid-user </Location> 注意建議在 Apache httpd 端使用和後端端一樣的 mapping。例如,當在 | |||||||
addressttl | -1 | DNS 解析後端地址快取時間的 TTL(單位:秒)。-1 表示 Apache httpd 重新啟動之前。 |
如果 Proxy 指令綱要從 balancer://
開始(例如:balancer://cluster
),則任何路徑資訊都會被略過,然後會建立一個實際上不會與後端伺服器通訊的虛擬執行緒。取而代之的是,它負責管理數個「實際」的執行緒。在這種情況下,可以將特殊的一組參數新增到這個虛擬執行緒。請參閱
以進一步了解 balancer 的運作方式。mod_proxy_balancer
平衡器參數 |
---|
參數 | 預設值 | 說明 |
---|---|---|
lbmethod | byrequests | 平衡器負載平衡方法。選擇要使用的負載平衡排程方法。byrequests 表示執行加權要求計數;bytraffic 表示執行加權流量位元組計數平衡;而 bybusyness 表示執行待處理要求平衡。預設值為 byrequests 。 |
maxattempts | 比執行緒數量少一個,或在只有單一執行緒時為 1。 | 放棄之前最大的故障復原嘗試次數。 |
nofailover | 關閉 | 如果設定為 On ,當執行緒處於錯誤狀態或已停用時,則會中斷工作階段。如果後端伺服器不支援工作階段複製,請將這個值設定為 On 。 |
stickysession | - | 平衡器工作階段繫結名稱。此值通常設定為類似 JSESSIONID 或 PHPSESSIONID 的值,具體取決於支援工作階段的後端應用程式伺服器。如果後端應用程式伺服器對 cookie 和 url 編碼的 ID 使用不同的名稱(例如 servlet 容器),請使用 | 將它們分開。第一個部分用於 cookie,第二個部分用於路徑。在 Apache HTTP Server 2.4.4 及更新版本中可用。 |
stickysessionsep | "." | 設定會話 cookie 中的分隔符號。有些後端應用程式伺服器不會使用「.」作為符號。例如,Oracle Weblogic 伺服器使用「!」作為分隔符號。使用此選項可以設定正確的符號。「關閉」設定表示不使用任何符號。 |
scolonpathdelim | 關閉 | 若設為「開啟」,分號字元「;」將被用作額外的暫存工作階段路徑分隔符號/分隔項。這主要用於模擬處理諸如 JSESSIONID=6736bcf34;foo=aabfa 這類路徑時 mod_jk 的行為。 |
timeout | 0 | 以秒為單位的平衡器逾時。若設為逾時,這將是等待一組可用的工作執行緒的最長時間。預設為不等待。 |
failonstatus | - | 單一或以逗號分隔的 HTTP 狀態碼清單。若設為逾時,當後端傳回清單中的任何狀態碼時,這將強制在工作執行緒中加入錯誤狀態。工作執行緒恢復的行為方式與其他工作執行緒錯誤相同。 |
failontimeout | 關閉 | 若設為逾時,在將要求傳送至後端後發生 IO 讀取逾時,這將強制在工作執行緒中加入錯誤狀態。工作執行緒恢復的行為方式與其他工作執行緒錯誤相同。 於 Apache HTTP 伺服器 2.4.5 和更新的版本中使用。 |
nonce | <auto> | balancer-manager 應用程式頁面中使用的保護性 nonce。預設為使用自動決定的基於 UUID 的 nonce,以提供此頁面的進一步保護。若設為逾時,nonce 將設為該值。設定為「None」可停用所有 nonce 檢查。注意除了 nonce 之外, |
growth | 0 | 除了在組態中定義的 BalancerMembers 之外,允許新增至這個平衡器的額外 BalancerMembers 數目。 |
forcerecovery | 開啟 | 若平衡器的所有工作執行緒都處於錯誤狀態,則強制立即復原所有工作執行緒,而不考慮工作執行緒的重試參數。若在不考慮各個工作執行緒的重試參數的情況下,強制復原所有工作執行緒,則已經超載的後端可能會陷入更大的困境。在此情況下,設為「關閉」。 於 Apache HTTP 伺服器 2.4.2 和更新的版本中使用。 |
平衡器設定範例
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10 ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On <Proxy "balancer://mycluster"> BalancerMember "ajp://1.2.3.4:8009" BalancerMember "ajp://1.2.3.5:8009" loadfactor=20 # Less powerful server, don't send as many requests there, BalancerMember "ajp://1.2.3.6:8009" loadfactor=5 </Proxy>
組態備用伺服器有助於確保每組負載平衡器在任何時候都有一定數量的可用工作執行緒
ProxyPass "/" "balancer://sparecluster/" <Proxy balancer://sparecluster> BalancerMember ajp://1.2.3.4:8009 BalancerMember ajp://1.2.3.5:8009 # The servers below are hot spares. For each server above that is unusable # (draining, stopped, unreachable, in error state, etc.), one of these spares # will be used in its place. Two servers will always be available for a request # unless one or more of the spares is also unusable. BalancerMember ajp://1.2.3.6:8009 status=+R BalancerMember ajp://1.2.3.7:8009 status=+R </Proxy>
設定熱備用,僅在負載平衡器組中沒有其他成員(或備用伺服器)可用時使用
ProxyPass "/" "balancer://hotcluster/" <Proxy "balancer://hotcluster"> BalancerMember "ajp://1.2.3.4:8009" loadfactor=1 BalancerMember "ajp://1.2.3.5:8009" loadfactor=2.25 # The server below is on hot standby BalancerMember "ajp://1.2.3.6:8009" status=+H ProxySet lbmethod=bytraffic </Proxy>
其他 ProxyPass 關鍵字
通常,mod_proxy 會將 ProxyPassed URL正規化。但這可能與部分後端不相容,特別是那些使用 PATH_INFO 的後端。可選擇的 nocanon 關鍵字會抑制此行為,並向後端傳遞「未處理」的 URL 路徑。請注意,這個關鍵字可能會影響後端的安全性,因為它移除 proxy 所提供的針對基於 URL 的攻擊的正常限制性保護。
通常,mod_proxy 在產生 SCRIPT_FILENAME 環境變數時會包含查詢字串。可選擇的 noquery 關鍵字(於 httpd 2.4.1 及更新版本中提供)可防止此行為。
選項的interpolate
關鍵字與 ProxyPassInterpolateEnv
相結合,導致 ProxyPass 參照環境變數,使用語法 ${VARNAME}。請注意在這個參照發生時,許多標準的 CGI 派生的環境變數將不存在,因此你可能仍需要訴諸 mod_rewrite
以進行複雜的規則。另請注意,僅透過在指令分析時可用的變數(例如 Define
)來支援 URL 中的 scheme/hostname/port 部分的參照。利用 mod_rewrite
可以動態決定這些欄位。以下範例說明如何使用 mod_rewrite
動態設定 scheme 為 http 或 https
RewriteEngine On RewriteCond "%{HTTPS}" =off RewriteRule "." "-" [E=protocol:http] RewriteCond "%{HTTPS}" =on RewriteRule "." "-" [E=protocol:https] RewriteRule "^/mirror/foo/(.*)" "%{ENV:protocol}://backend.example.com/$1" [P] ProxyPassReverse "/mirror/foo/" "http://backend.example.com/" ProxyPassReverse "/mirror/foo/" "https://backend.example.com/"
自 Apache HTTP Server 2.4.47 以後,通訊協定升級(隧道)可由 mod_proxy_http
利用 ProxyPass
參數 upgrade 來端對端處理。
端對端表示來自客戶端/瀏覽器的 HTTP 升級請求首先由 mod_proxy_http
轉發至原始伺服器,並且只有在原始伺服器接受/啟動升級(HTTP 回應 101 Switching Protocols
)時,連線才有可能升級(並由 mod_proxy_http
建立隧道)。如果原始伺服器以任何其他方式回應,mod_proxy_http
將持續轉發(並強制執行)HTTP 通訊協定,就如同對這個連線一樣。
參閱 WebSocket 升級 (2.4.47 及更新版本) 以取得使用 mod_proxy_http
的設定範例。
對於 Apache HTTP Server 2.4.46 和更早版本(或如果來自 2.4.48 和更新版本的 ProxyWebsocketFallbackToProxyHttp
停用 mod_proxy_http
處理),請參閱 mod_proxy_wstunnel
文件,瞭解如何代理 WebSocket 通訊協定。
說明 | 繼承從主伺服器定義的 ProxyPass 指令 |
---|---|
語法 | ProxyPassInherit On|Off |
預設值 | ProxyPassInherit On |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | ProxyPassInherit 僅可用於 Apache HTTP Server 2.4.5 和更新版本。 |
此指令將導致目前的伺服器/vhost「繼承」在主伺服器中定義的 ProxyPass
指令。如果使用 Balancer Manager 進行動態變更,此舉可能會導致問題和不一致的行為,因此建議在使用此功能時將其停用。
全域伺服器中的設定值定義所有 vhost 的預設值。
停用 ProxyPassInherit 也會停用 BalancerInherit
。
說明 | 在反向代理設定中啟用環境變數參照 |
---|---|
語法 | ProxyPassInterpolateEnv On|Off |
預設值 | ProxyPassInterpolateEnv Off |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 於 httpd 2.2.9 和更新版本中可用 |
此指令,與 interpolate
引數一起用於 ProxyPass
、ProxyPassReverse
、ProxyPassReverseCookieDomain
和 ProxyPassReverseCookiePath
,讓反向代理伺服器可以使用環境變數進行動態配置,而這些變數可以由另一個模組設定,例如 mod_rewrite
。它會影響 ProxyPass
、ProxyPassReverse
、ProxyPassReverseCookieDomain
和 ProxyPassReverseCookiePath
指令,如果設定 interpolate
選項,會讓這些指令替換組態指令中字串 ${varname}
為環境變數 varname
的值。
ProxyPass
的程式/主機名稱/連接埠部分可能包含變數,但僅限於在解析指令時可用的變數(例如,使用 Define
)。對於所有其他使用案例,請考慮改用 mod_rewrite
。
除非有需要,否則請保持停用狀態!為 ProxyPass
新增變數可能會導致使用預設 mod_proxy 配置的執行緒(不允許任何微調,例如連線重複使用等...)。
說明 | 使用正規表示式將遠端伺服器對應至本機伺服器 URL 空間 |
---|---|
語法 | ProxyPassMatch [regex] !|url [key=value [key=value ...]] |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 從 2.4.47 版開始,當 url 參數包含反向參照(見下方註解)時會套用 key=value 參數。 |
此指令相當於 ProxyPass
,但使用正規表示式代替簡單的前置比對。提供的正規表示式會對 url 進行比對,如果比對成功,伺服器會將任何括弧內的比對內容替換至指定的字串中,並將其用為新的 url。
<Directory>
上下文中使用。假設本機伺服器的位址為 http://example.com/
;那麼
ProxyPassMatch "^/(.*\.gif)$" "http://backend.example.com/$1"
會將本機對 http://example.com/foo/bar.gif
的要求在內部轉換為對 http://backend.example.com/foo/bar.gif
的代理要求。
在不希望對子目錄進行反向代理的情況下,!
指令會很有用。
在 <LocationMatch>
區段內使用時,第一個引數會省略,正規表示式會從 <LocationMatch>
取得。
如果你需要更彈性的反向代理組態,請參閱具有 [P]
旗標的 RewriteRule
指令。
當 URL 參數未將任何反向參照用於正規表示式時,原始 URL 會附加到 URL 參數上。
key=value
參數與包含反向參照的 url自 Apache HTTP Server 2.4.47 起,key=value
參數不再在使用有反向引用的 url 的 ProxyPassMatch
中被忽略。但是,為了維持關於後端連線重複使用/保留連線(這些 URL 以前從未重複使用)的既有行為,enablereuse(或 disablereuse)參數在這種情況下預設為 off
(響應為 on
)。明確設定 enablereuse=on
允許重複使用連線,除非有些反向引用屬於 url 的 authority
部分(主機名稱和/或連接埠),此條件會從 Apache HTTP Server 2.4.55 起強制執行,並會在啟動時產生警告,因為這些 URL 本身不可重複使用。
在建構規則的目標 URL 時要小心,考慮允許用戶端影響伺服器將視為代理伺服器的 URL 組的安全性衝擊。確保 URL 的架構和主機名稱部分已修正,或不允許用戶端有不當的影響力。
說明 | 調整反向代理伺服器傳送的 HTTP 回應標頭中的 URL |
---|---|
語法 | ProxyPassReverse [path] url [interpolate] |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
這項指令允許 Apache httpd 調整 HTTP 重新導向回應上的 Location
、Content-Location
和 URI
標頭中的 URL。當使用 Apache httpd 做為反向代理伺服器(或閘道器)時,這非常重要,可以避免因為反向代理伺服器後方的後端伺服器上的 HTTP 重新導向,而繞過反向代理伺服器。
只有特別提到上述的 HTTP 回應標頭會被改寫。Apache httpd 既不會改寫其他的回應標頭,也不會預設改寫 HTML 頁面內的 URL 參照。這表示如果被代理內容包含絕對 URL 參照,他們會繞過代理伺服器。若要改寫 HTML 內容以符合代理伺服器,您必須載入並啟用 mod_proxy_html
。
path 是本機虛擬路徑的名稱;url 是遠端伺服器的部分 URL。這些參數的用法與 ProxyPass
指令相同。
例如,假設本機伺服器有位址 http://example.com/
,那麼
ProxyPass "/mirror/foo/" "http://backend.example.com/" ProxyPassReverse "/mirror/foo/" "http://backend.example.com/" ProxyPassReverseCookieDomain "backend.example.com" "public.example.com" ProxyPassReverseCookiePath "/" "/mirror/foo/"
不只會將 http://example.com/mirror/foo/bar
的區域要求,內部轉換成對 http://backend.example.com/bar
的代理要求(這正是 ProxyPass
指令在此擔任的功能)。它還會處理伺服器 backend.example.com
在將 http://backend.example.com/bar
重新導向到 http://backend.example.com/quux
時發送的重新導向。Apache httpd 會將此調整為 http://example.com/mirror/foo/quux
,然後再將 HTTP 重新導向回應傳送給用戶端。請注意,用於建構 URL 的主機名稱,是根據 UseCanonicalName
指令的設定來選擇的。
請注意,此 ProxyPassReverse
指令也可以與 mod_rewrite
的代理功能 (RewriteRule ... [P]
) 聯合使用,因為它不依賴於對應的 ProxyPass
指令。
選用的 interpolate
關鍵字和 ProxyPassInterpolateEnv
搭配使用時,可插入使用 ${VARNAME} 格式指定的环境變數。請注意,一個 URL 的 scheme 部份不支援插入。
當在 <Location>
區段內使用時,會省略第一個引數,本機目錄會從 <Location>
取得。在 <LocationMatch>
區段內也會發生相同情況,但可能會無法如預期般運作,因為 ProxyPassReverse 會照字面解釋 regexp 為路徑;如有需要,可在區段外,或是獨立的 <Location>
區段內指定 ProxyPassReverse。
此指令不支援 <Directory>
或 <Files>
區段。
說明 | 調整來自反向代理伺服器的 Set-Cookie 標頭內的 Domain 字串 |
---|---|
語法 | ProxyPassReverseCookieDomain 內部網域名稱 公開網域名稱 [interpolate] |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
用法基本上類似於 ProxyPassReverse
,但它並非改寫 URL 標頭,而是改寫 Set-Cookie
標頭內的 domain
字串。
說明 | 調整來自反向代理伺服器的 Set-Cookie 標頭內的 Path 字串 |
---|---|
語法 | ProxyPassReverseCookiePath 內部路徑 公開路徑 [interpolate] |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
與 ProxyPassReverse
指令配合使用,適用於反向代理中,後端網址路徑對應到公開路徑的情況。此指令會改寫 Set-Cookie
標頭中的 path
字串。如果 cookie 路徑開頭與 internal-path 相符,cookie 路徑就會替換為 public-path。
使用 ProxyPassReverse
的範例中,指令
ProxyPassReverseCookiePath "/" "/mirror/foo/"
會將後端路徑為 /
(或 /example
,任何路徑都可以)的 cookie 改寫為 /mirror/foo/
。
說明 | 使用傳入 Host HTTP 要求標頭進行代理要求 |
---|---|
語法 | ProxyPreserveHost 開啟|關閉 |
預設值 | ProxyPreserveHost 關閉 |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 可在 2.3.3 和後續版本的目錄內容中使用。 |
如果啟用此選項,會將傳入要求中的 Host:
列傳遞給受代理的主機,而非傳遞在 ProxyPass
列指定的主機名稱。
此選項通常應設為 關閉
。它多半適用於特殊設定,例如代理大量基於名稱的虛擬主機,後端伺服器需要評估原始 Host 標頭。
說明 | 代理 HTTP 和 FTP 連線的網路緩衝區大小 |
---|---|
語法 | ProxyReceiveBufferSize bytes |
預設值 | ProxyReceiveBufferSize 0 |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
ProxyReceiveBufferSize
指令指定代理 HTTP 和 FTP 連線的明確(TCP/IP)網路緩衝區大小,以提高傳輸量。它必須大於 512
或是設為 0
,表示應使用系統的預設緩衝區大小。
ProxyReceiveBufferSize 2048
說明 | 處理特定要求的遠端代理伺服器 |
---|---|
語法 | ProxyRemote match remote-server [username:password] |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 第三個引數(選擇性)僅可在 httpd 2.4.59 及更新版本中使用。 |
這會定義此代理伺服器的遠端代理伺服器。match 可能是遠端伺服器支援的 URL 範本名稱,或是應使用遠端伺服器的部分 URL,或是 *
表示伺服器應聯絡所有要求。 remote-server 是遠端伺服器的部分 URL。語法
remote-server = scheme://hostname[:port]
scheme 實際上就是應使用來與遠端伺服器溝通的通訊協定;此模組僅支援 http
和 https
。使用 https
時,會使用 HTTP CONNECT 方法傳送要求到遠端代理伺服器。
ProxyRemote "http://goodguys.example.com/" "http://mirrorguys.example.com:8000" ProxyRemote "*" "http://cleverproxy.localdomain" ProxyRemote "ftp" "http://ftpproxy.mydomain:8080"
在最後一個範例中,代理伺服器會將 FTP 要求封裝成另一個 HTTP 代理伺服器要求,然後轉送至可以處理這些要求的另一個代理伺服器。
這個選項也支援反向代理設定;線上伺服器可以內嵌在 virtualhost URL 空間中,即使該伺服器被另一個轉發代理伺服器所隱藏。
可以提供一個選用的第三個引數 username:password,用於定義傳遞給已設定遠端代理伺服器時的基本認證資格。資格將會永遠傳送,不會先等待遠端代理伺服器傳送基本認證質詢。如果使用這個引數,Proxy-Chain-Auth 環境變數將沒有效果。
說明 | 用來處理與正規表示式相符要求的遠端代理伺服器 |
---|---|
語法 | ProxyRemoteMatch regex remote-server [username:password] |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 第三個引數(選擇性)僅可在 httpd 2.4.59 及更新版本中使用。 |
ProxyRemoteMatch
指令和 ProxyRemote
指令相同,不同之處在於第一個引數是請求 URL 的 正規表示式 相符。
說明 | 啟用順向(標準)代理伺服器要求 |
---|---|
語法 | ProxyRequests On|Off |
預設值 | ProxyRequests Off |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
這能允許或禁止 Apache httpd 當成順向代理伺服器運作。(將 ProxyRequests 設定為 Off
並不會停用 ProxyPass
指令。)
在典型的反向代理伺服器或閘道設定中,這個選項應該設定為 Off
。
若要取得代理 HTTP 或 FTP 網站的功能,伺服器中還需要 mod_proxy_http
或 mod_proxy_ftp
(或兩者兼具)。
若要取得代理 HTTPS 網站的功能(順向),伺服器需要啟用 mod_proxy_connect
。
在 確保伺服器安全 前請勿啟用與 ProxyRequests
搭配使用的代理功能。開放的代理伺服器對您的網路和整個網際網路都非常危險。
說明 | 設定各種 Proxy 平衡器或成員參數 |
---|---|
語法 | ProxySet url key=value [key=value ...] |
環境 | 伺服器設定、虛擬主機、目錄 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | ProxySet 僅在 Apache HTTP Server 2.2 和更新版本中可用。 |
這個指令用於當成替用方法,來設定 Proxy 平衡器和工作人員所提供的任何參數,這些參數通常會透過 ProxyPass
指令來設定。如果在 <Proxy balancer url|worker url>
容器指令內使用,則不需要 url 引數。當成副作用,會建立相對應的平衡器或工作人員。當通過 RewriteRule
而不是 ProxyPass
指令來進行反向代理伺服器時,這會很有用。
<Proxy "balancer://hotcluster"> BalancerMember "http://www2.example.com:8080" loadfactor=1 BalancerMember "http://www3.example.com:8080" loadfactor=2 ProxySet lbmethod=bytraffic </Proxy>
<Proxy "http://backend"> ProxySet keepalive=On </Proxy>
ProxySet "balancer://foo" lbmethod=bytraffic timeout=15
ProxySet "ajp://backend:7001" timeout=15
請注意,相同的參數金鑰可能有不同的意義,端看是否套用在平衡器或工作人員上,如同上述兩個範例所顯示的逾時。
說明 | 設定傳出的代理伺服器連線的本地 IP 位址 |
---|---|
語法 | ProxySourceAddress address |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 可於 2.3.9 及後續版本使用 |
此指令允許設定特定的本地位址在連線到後端伺服器時綁定。
說明 | 在 mod_status 中顯示 Proxy LoadBalancer 狀態 |
---|---|
語法 | ProxyStatus Off|On|Full |
預設值 | ProxyStatus Off |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
相容性 | 可於 2.2 及後續版本使用 |
此指令決定是否透過 mod_status
伺服器狀態頁面顯示代理程式負載平衡器狀態資料。
Full 等同於 On
說明 | 代理請求的網路逾時 |
---|---|
語法 | ProxyTimeout seconds |
預設值 | 值為 |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
此指令允許使用者在代理程式請求上指定逾時。當您有一個緩慢/有漏洞且會當掉的應用程式伺服器時,這很有用,您可以選擇僅傳回逾時並優雅地失敗,而不用等待伺服器回應花費大量時間。
說明 | 對代理請求的 Via HTTP 回應標頭提供資訊 |
---|---|
語法 | ProxyVia On|Off|Full|Block |
預設值 | ProxyVia Off |
環境 | 伺服器組態、虛擬主機 |
狀態 | 擴充功能 |
模組 | mod_proxy |
此指令控制代理程式使用 Via:
HTTP 標頭。其預期用途是控制一串代理伺服器連線中的代理請求流程。請參閱 RFC 2616 (HTTP/1.1) 之第 14.45 段以了解 Via:
標頭行的說明。
Off
(預設值),則不會執行特殊處理。如果請求或回應包含 Via:
標頭,則會不變地傳遞。On
,則每個請求和回應都會為目前主機新增 Via:
標頭行。Full
,則每個產生的 Via:
標頭行都會另外顯示 Apache httpd 伺服器版本,作為 Via:
註解欄位。Block
,則每個代理請求的所有 Via:
標頭行都會移除。不會產生新的 Via:
標頭。