<-
Apache > HTTP Server > 文件 > 第 2.4 版 > 模組

Apache 模組 mod_proxy

可用語言:  en  |  fr  |  ja 

說明多重協定的代理/閘道伺服器
狀態擴充功能
模組識別碼proxy_module
原始檔mod_proxy.c

摘要

警告

確保伺服器安全 前請勿啟用與 ProxyRequests 搭配使用的代理功能。開放的代理伺服器對您的網路和整個網際網路都非常危險。

mod_proxy 和相關模組為 Apache HTTP Server 實作一個代理/閘道,支援多種常見協定和負載平衡演算法。第三方模組可以新增對其他協定和負載平衡演算法的支援。

必須載入一組模組到伺服器才能提供必要的功能。這些模組可以在編譯時以靜態方式包含,或透過 LoadModule 指令以動態方式包含。這組模組必須包含下列模組:

此外,其他模組還提供了延伸功能。快取功能由 mod_cache 和相關模組提供。使用 SSL/TLS 協定與遠端伺服器進行連線的能力是由 mod_sslSSLProxy* 指令提供的。您需要載入這些其他模組並進行設定才能利用這些功能。

Support Apache!

主題

指令

錯誤修復檢查表

另請參閱

top

正向代理和反向代理/閘道

Apache HTTP Server 可以設定在 正向反向 代理模式(也稱為 閘道)。

一般 正向代理 是介於用戶端和來源伺服器之間的伺服器。為從來源伺服器取得內容,用戶端會傳送請求至代理伺服器,並指明來源伺服器為目標。然後,代理會要求取得來源伺服器的內容,並傳回給用戶端。必須針對用戶端設定,才能使用正向代理存取其他網站。

通常會將正向代理用於提供網路存取給本機用戶端,而這些用戶端已透過防火牆加以限制。正向代理也可以透過快取(由 mod_cache 提供)來減少網路使用。

使用 ProxyRequests 指令可啟動正向代理。正向代理允許用戶端透過你的伺服器存取任意網站,並隱藏其真實來源,因此,在啟動正向代理之前,一定要 確保你的伺服器安全,這樣,只有授權的用戶端才能存取代理。

反之,反向代理(或 閘道)對用戶端而言就像一般網站伺服器一樣。用戶端不需要做任何設定。用戶端針對反向代理名稱空間中的內容進行一般請求。然後,反向代理會決定要把這些請求傳送至何處,並回傳內容,彷彿反向代理本身就是來源一樣。

通常會將反向代理用於提供網路使用者存取防火牆後方的伺服器。反向代理也可以用於平衡多個後端伺服器的負載,或提供較慢後端伺服器的快取。此外,反向代理也可以用於把多個伺服器單純併入同一 URL 空間。

使用 ProxyPass 指令或 RewriteRule 指令的 [P] 旗標可啟動反向代理。為設定反向代理,不必啟用 ProxyRequests

top

基本範例

下列範例僅供參考,以協助你入門。請閱讀各個指令的說明文件。

此外,如果你想要啟用快取,請參閱 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>

WebSocket Upgrade(2.4.47 及更新版本)

ProxyPass "/some/ws/capable/path/" "http://example.com/some/ws/capable/path/" upgrade=websocket
top

透過處理程式存取

你也可以強制要求作為反向代理請求來處理,透過建立合適的處理程式傳遞。下列範例設定會使用反向代理,將所有 PHP 腳本的請求傳回至指定 FastCGI 伺服器。

反向代理 PHP 腳本

<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 及更新版本中提供。

top

工作人員

該代理伺服器會在物件中管理原始伺服器及其通訊參數的組態,稱之為工作執行緒。內建兩個工作執行緒:預設前向代理伺服器工作執行緒和預設反向代理伺服器工作執行緒。可明確組態其他工作執行緒。

兩個預設工作執行緒具有固定組態,而且當沒有其他工作執行緒符合要求時,就會使用這兩個工作執行緒。它們不會使用 HTTP 保持連線或連線再利用。反之,每次要求都會開啟及關閉與原始伺服器的 TCP 連線。

明確組態的工作執行緒由其 URL 識別。通常使用 ProxyPassProxyPassMatch(用於反向代理時)建立和組態工作執行緒。

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

或另外使用 ProxyProxySet

<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 中指定的通訊協定。可用通訊協定包括 ajpfcgiftphttpscgi

平衡器 worker 是虛擬 worker,它們使用稱為其成員的直接 worker 來實際處理要求。每個平衡器可以有多個成員。當它處理要求時,會根據設定的負載平衡演算法選擇一個成員。

如果其 worker URL 使用 balancer 作為通訊協定範例,則會建立一個平衡器 worker。平衡器 URL 會唯一識別平衡器 worker。使用 BalancerMember 將成員新增到平衡器。

原始網域的 DNS 解析

DNS 解析發生在第一次建立與原始網域的 socket 時。當連線重複使用啟用時,每個後端網域只會在每個子行程中解析一次,然後快取所有後續連線,直到子行程被回收為止。規劃涉及後端網域的 DNS 維護工作時,應考慮這項資訊。請同時查看 ProxyPass 參數,以取得關於連線重複使用的更多詳情。

top

控制對代理伺服器的存取

您可以透過 <Proxy> 控制區塊來控制誰可以存取您的 proxy,如下方範例所示

<Proxy "*">
  Require ip 192.168.0
</Proxy>

更多關於存取控制指令的資訊,請參閱 mod_authz_host

如果您使用前進代理伺服器(使用 ProxyRequests 指令),則嚴格限制存取非常重要。否則,您的伺服器可能會被任何客戶端用於存取任意主機,同時隱藏其真實身分。這對您的網路和整體網際網路來說都很危險。當使用反向代理伺服器(使用 ProxyPass 指令,同時搭配 ProxyRequests Off)時,存取控制不那麼重要,因為客戶端只能連絡您特定設定的主機。

另請參閱 Proxy-Chain-Auth 環境變數。

top

慢速啟動

如果您使用 ProxyBlock 指令,會在啟動期間查詢並快取主機名稱的 IP 位址,以便稍後進行比對測試。這可能需要花費幾秒鐘(或更久時間),具體取決於主機名稱查詢發生的速度。

top

Intranet 代理伺服器

放置在內網的 Apache httpd 代理伺服器需要透過公司的防火牆轉發外部要求(針對這項要求,設定 ProxyRemote 指令將對應的 scheme 轉發至防火牆代理伺服器)。不過,當它在存取內網內的資源時,在存取主機時可以繞過防火牆。 NoProxy 指令對於指定哪些主機屬於內網且應該直接存取是很有用的。

內網中的使用者傾向於從 WWW 要求省略本機網域名稱,因此要求「http://somehost/」而不是 http://somehost.example.com/。一些商業代理伺服器會讓他們順利存取,並簡單提供要求,表示設定了本機網域。當 ProxyDomain 指令被使用,而且伺服器 設定為代理服務 時,Apache httpd 可以傳回重新導向的回應,並將客戶端寄送至正確的、完整的伺服器位址。這是優先的方法,因為使用者的書籤檔案會包含完整的網域主機。

top

通訊協定調整

mod_proxy 將要求傳送至未正確實作 KeepAlive 或 HTTP/1.1 的原始伺服器時,會有兩個 環境變數 可以強制要求使用不具備 KeepAlive 的 HTTP/1.0。這些變數是透過 SetEnv 指令設定的。

這些變數是 force-proxy-request-1.0proxy-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 沒有提早進行評估。

top

請求主體

某些請求方法(例如 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 標頭,但伺服器已設定為濾除接收的請求主體,也可能發生此暫存。

top

反向代理請求標頭

在反向代理模式中運作(例如使用 ProxyPass 指令),mod_proxy_http 會新增多個請求標頭以將資訊傳遞至原始伺服器。這些標頭為:

X-Forwarded-For
客戶端 IP 位址。
X-Forwarded-Host
原始 Host HTTP 請求標頭中由客戶端要求的主機。
X-Forwarded-Server
代理伺服器的主機名稱。

在原始伺服器上使用這些標頭時請小心,因為如果原始請求已包含其中一個標頭,則它們將包含多個值(以逗號分隔)。例如,你可以在原始伺服器的記錄格式字串中使用 %{X-Forwarded-For}i 記錄原始客戶端的 IP 位址,但如果請求經過多個代理伺服器,你可能會取得多個位址。

另請參閱 ProxyPreserveHostProxyVia 指令,用於控制其他請求標頭。

註:如果你需要指定自訂請求標頭,再新增至轉送的請求,請使用 RequestHeader 指令。

top

BalancerGrowth 指令

說明組態後可新增的代理負載平衡器數量
語法BalancerGrowth #
預設值BalancerGrowth 5
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy
相容性BalancerGrowth 僅可於 Apache HTTP 伺服器 2.3.13 及更新版本中使用。

此指令允許在可供應給虛擬主機的代理負載平衡器數量(預先組態的數量以外)中有成長的可能性。僅當至少預先組態了一個代理負載平衡器時,此指令才會生效。

top

BalancerInherit 指令

說明繼承主伺服器的針對 ProxyPass 的代理負載平衡器/工作者
語法BalancerInherit On|Off
預設值BalancerInherit On
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy
相容性BalancerInherit 僅可於 Apache HTTP 伺服器 2.4.5 及更新版本中使用。

此指令將會導致目前的伺服器/vhost「繼承」主伺服器中定義的針對 ProxyPass 的代理負載平衡器和工作者。若使用代理負載平衡器管理程式,此動作可能會造成問題和行為不一致,因此在使用該功能時,應該禁用此指令。

全域伺服器中的設定值定義所有 vhost 的預設值。

top

BalancerMember 指令

說明將成員新增至負載平衡群組
語法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 中移除尾隨斜線。

top

BalancerPersist 指令

說明嘗試讓 Balancer Manager 做出的變更在重新啟動後仍然存在。
語法BalancerPersist On|Off
預設值BalancerPersist Off
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy
相容性BalancerPersist 僅在 Apache HTTP Server 2.4.4 以上的版本中提供。

此指令將讓與平衡器和平衡器成員關聯的共用記憶體儲存在重新啟動後仍然存在。如此一來,這些本機變更就不會在正常的重新啟動/正常狀態過渡期間遺失。

top

NoProxy 指令

說明將直接連線的主機、網域或網路
語法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.168192.168.0.0
子網路 192.168.0.0,暗示網路遮罩為 16 個有效位元 (有時會使用 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 位址。

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.comwww.example.com.(注意結尾的句點)這兩個主機視為相等。

另請參閱

top

<Proxy> 指令

說明套用至代理資源的指令容器
語法<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>

與 Location 設定區段的差異

後端 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>

另請參閱

top

Proxy100Continue 指令

說明將 100-continue 預期值轉發至原始伺服器
語法Proxy100Continue Off|On
預設值Proxy100Continue On
環境伺服器設定、虛擬主機、目錄
狀態擴充功能
模組mod_proxy
相容性在版本 2.4.40 及後續版本中提供

此指令決定代理伺服器是否應將 100-continue Expect:ation 轉發至原始伺服器,進而讓原始伺服器決定何時/是否讀取 HTTP 要求本體,或是在 Off 狀態下,代理伺服器應自行產生 100 Continue 中間回應再轉發請求本體。

效益

此選項僅適用於 HTTP 代理,由 mod_proxy_http 處理。

top

ProxyAddHeaders 指令

說明在 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 處理。

top

ProxyBadHeader 指令

說明決定如何處理回應中的錯誤標頭列
語法ProxyBadHeader IsError|Ignore|StartBody
預設值ProxyBadHeader IsError
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy

如果 mod_proxy 從原始伺服器接收語法無效的回應標頭列(例如不含冒號),ProxyBadHeader 指令會決定 mod_proxy 的行為。可用參數如下

IsError
中止要求並產生 502 (Bad Gateway) 回應。這是預設行為。
Ignore
將錯誤標頭列視為未傳送。
StartBody
在收到第一個錯誤的標頭行時,完成標頭的讀取,並將其餘部分視為主體。這有助於應對會忘記在標頭與主體間插入空行的後端伺服器錯誤。
top

ProxyBlock 指令

說明禁止代理的文字、主機或網域
語法ProxyBlock *|字詞|主機|網域 [字詞|主機|網域] ...
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy

ProxyBlock 指令指定一個以空格分隔的文字、主機和/或網域清單。代理伺服器會封鎖名稱包含符合的文字、主機或網域的 HTTP、HTTPS 和 FTP 文件要求。代理模組也會在啟動時嘗試找出清單項目(可能是主機名稱)的 IP 位址,並將其快取以進行配對測試。這可能會減慢伺服器的啟動時間。

範例

ProxyBlock "news.example.com" "auctions.example.com" "friends.example.com"

請注意,example 也足以與這些網站中的任何一個配對。

主機也會在被 IP 位址參照時配對。

另請注意

ProxyBlock "*"

會封鎖與所有網站的連線。

top

ProxyDomain 指令

說明代理請求的預設網域名稱
語法ProxyDomain 網域
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy

此指令僅適用於內部網路內的 Apache httpd 代理伺服器。ProxyDomain 指令指定 Apache 代理伺服器所屬的預設網域。若遇到一個沒有網域名稱的主機要求,系統會產生一個重新導向回應,並加上已設定的 網域 附加到相同的主機。

範例

ProxyRemote  "*"  "http://firewall.example.com:81"
NoProxy         ".example.com" "192.168.112.0/21"
ProxyDomain     ".example.com"
top

ProxyErrorOverride 指令

說明覆寫代理內容的錯誤頁面
語法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
top

ProxyIOBufferSize 指令

說明確定內部資料傳輸緩衝區的大小
語法ProxyIOBufferSize 位元組
預設值ProxyIOBufferSize 8192
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy

ProxyIOBufferSize 指令調整用於輸入與輸出之間資料暫存區的內部緩衝區大小。大小必須至少為 512

在幾乎所有情況下,都不需要變更該值。

若與 AJP 使用,此指令會設定最大 AJP 封包大小(以位元組為單位)。大於 65536 的值會設為 65536。如果您將其變更為預設值,也必須變更 Tomcat 端上 AJP 連接器的 packetSize 屬性!packetSize 屬性僅在 Tomcat 5.5.20+6.0.2+ 中可用。

通常不需要變更最大封包大小。在傳送憑證或憑證鏈時,已報告預設值有問題。

top

<ProxyMatch> 指令

說明套用於常規表達式匹配的代理資源的指令容器
語法<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>

另請參閱

top

ProxyMaxForwards 指令

說明請求可轉發的代理最大數目
語法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)會提供相符協定的行為,但可能會讓您暴露於迴圈中。

top

ProxyPass 指令

說明將遠端伺服器對應到本機伺服器 URL 空間
語法ProxyPass [路徑] !|網址 [鍵=值 [鍵=值 ...]] [nocanon] [interpolate] [noquery]
環境伺服器設定、虛擬主機、目錄
狀態擴充功能
模組mod_proxy
相容性於 2.4.7 中新增 Unix Domain Socket (UDS) 支援

此指令允許將遠端伺服器對映到本機伺服器的空間中。本機伺服器不會像傳統意義上的代理伺服器那樣作為代理伺服器,而是看起來是遠端伺服器的鏡像。本機伺服器通常稱為反向代理伺服器閘道。‹var›路徑‹/var›是本機虛擬路徑的名稱;‹var›網址‹/var›是遠端伺服器的一部分網址,且不能包含查詢字串。

強烈建議在繼續閱讀本節之前,先檢閱一下工作者的概念。
此指令在 <Directory><If><Files> 容器中不受支援。
當使用 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 指令的順序

所設定的 ProxyPassProxyPassMatch 規則會依照組態的順序檢查。第一個符合的規則勝出。所以通常您要先排序相互衝突的 ProxyPass 規則,從最長的網址開始。否則,較長網址的後續規則會遭到任何使用網址開頭子字串而較早出現的規則隱藏。請注意,有一些與工作者分享有關。

在位置中排序 ProxyPass 指令

僅有一個 ProxyPass 指令可以放置在 Location 區塊內,而且最具體的位置會優先。

排除和「no-proxy」環境變數

排除必須置於一般 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 與後端伺服器之間有防火牆時,應使用此參數,這種情況會導致中斷閒置連線。此標記會告知作業系統在閒置連線上傳送 KEEP_ALIVE 訊息,進而防止防火牆中斷連線。若要啟用 KeepAlive,請將此屬性值設為 On

初次和後續 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_http100-Continue 傳送至後端(僅適用於 HTTP/1.1 - 對非 HTTP/1.1 後端,此屬性無效)。在兩種情況下,參數都是等待回復的秒數延遲時間。新增此功能的目的是避免處理已中斷和過載的後端所帶來的問題。這會在一般操作過程中增加網路流量,可能會造成問題,但如果部分叢集節點中斷或過載,它會降低流量。透過加 ms 字尾,延遲時間也可以使用毫秒為單位來設定。
receivebuffersize 0 調整代理連線的明確 (TCP/IP) 網路緩衝區大小。這讓您可以覆寫特定工作者的 ProxyReceiveBufferSize。它必須至少為 512,或設為 0 以使用系統預設值。
redirect - 工作者的重新導向路由。此值通常會動態設定為安全地從叢集中移除節點。如果已設定,所有沒有工作階段 ID 的請求將會重新導向至路由參數等於此值的 BalancerMember。
retry 60 連線池工作執行緒重試逾時(秒)。如果連線池工作執行緒至後端伺服器處於錯誤狀態,Apache httpd 在逾時到期前不會將任何要求轉送至該伺服器。這能讓維護中的後端伺服器關閉,並在稍後重新上線。值 0 表示永遠重試處於錯誤狀態的工作執行緒,且沒有逾時。
路由 - 當在負載平衡器內部使用時的工作執行緒路由。路由是附加至工作階段識別碼的一個值。
狀態 - 定義此工作執行緒初始狀態的單一字母值。
D:工作執行緒已停用,且不會接受任何要求。
S:工作執行緒在管理上已停止。
I:工作執行緒處於忽略錯誤模式,且永遠被視為可用。
R:工作執行緒是一個熱備份。對於一組負載平衡組 (lbset) 中每個不可用的工作執行緒(排空、停止、出錯等),會使用具有相同 lbset 的可使用熱備份取代它。熱備份有助於確保一組平衡器永遠有特定數量的可用工作執行緒。
H:工作執行緒處於熱備用模式,僅當平衡器組中沒有其他可行工作執行緒或備用時才會使用它。
E:工作執行緒處於錯誤狀態。
N:工作執行緒處於排空模式,且只會接受自己預定的現有固定工作階段,並忽略所有其他要求。
狀態可以透過前置「+」來設定(這是預設值),或透過前置「-」來清除。因此,「S-E」設定會將此工作執行緒設定為已停止,並清除錯誤旗標。
timeout ProxyTimeout Socket 逾時(秒)。Apache httpd 等待後端傳送或接收資料的秒數。
ttl - 非活動連線和關聯連線池條目的存活時間(秒)。一旦達到此限制,就不會再使用連線;它會在稍後某個時間點關閉。
flusher flush

mod_proxy_fdpass 使用的供應商名稱。請參閱此模組的說明文件,以取得更多詳細資訊。

secret - mod_proxy_ajp 使用的秘文值。它必須與 AJP 連線伺服器端設定的秘文相同。
可用於 Apache HTTP Server 2.4.42 及以上版本。
升級 -

HTTP 用戶端或瀏覽器協商時,mod_proxy_httpmod_proxy_wstunnel 接受的協定用於 HTTP 升級機制(依據 RFC 9110 - 升級)。請參閱底下的 協定升級 說明

對應 -

路徑網址 之間的對應類型。這會決定 mod_proxy 在比對 路徑 之前會對所要求的 uri-path 套用哪些正規化和/或(未)解碼作業。如果對應相符,它會提交到 uri-path,這樣使用路徑(像是 <Location>)的所有目錄內容都會使用相同的對應來比對。

mapping=encoded 可以防止對 uri-path 進行%解碼,這樣就可以使用像這樣的設定檔

ProxyPass "/special%3Fsegment" "https://example.com/special%3Fsegment" mapping=encoded
<Location "/special%3Fsegment">
  Require ip 172.17.2.0/24
</Location>

mapping=servlet 參照 Servlet 規格定義的規範化,例如 Apache Tomcat 就是使用這個規範化來處理 Servlet 容器(特別是 mapping 會略過路徑參數)。例如,/some;foo/path 這樣的 uri-path 會對映為 /some/path,因此無論要求的路徑參數是什麼,都會符合以下任何一個規範

ProxyPass "/some/path" "https://servlet.example.com/some/path" mapping=servlet
<Location "/some/path">
  Require valid-user
</Location>

注意

建議在 Apache httpd 端使用和後端端一樣的 mapping。例如,當在 <Location> 區塊中設定路徑的授權,而這些路徑會由 mod_proxy 對映到某些 servlet 容器(例如執行在 Apache Tomcat 上的應用程式),則應使用 mapping=servlet 設定來防止路徑參數等干擾 Apache httpd 要強制的授權。

addressttl -1

DNS 解析後端地址快取時間的 TTL(單位:秒)。-1 表示 Apache httpd 重新啟動之前。

如果 Proxy 指令綱要從 balancer:// 開始(例如:balancer://cluster),則任何路徑資訊都會被略過,然後會建立一個實際上不會與後端伺服器通訊的虛擬執行緒。取而代之的是,它負責管理數個「實際」的執行緒。在這種情況下,可以將特殊的一組參數新增到這個虛擬執行緒。請參閱 mod_proxy_balancer 以進一步了解 balancer 的運作方式。

平衡器參數
參數 預設值 說明
lbmethod byrequests 平衡器負載平衡方法。選擇要使用的負載平衡排程方法。byrequests 表示執行加權要求計數;bytraffic 表示執行加權流量位元組計數平衡;而 bybusyness 表示執行待處理要求平衡。預設值為 byrequests
maxattempts 比執行緒數量少一個,或在只有單一執行緒時為 1。 放棄之前最大的故障復原嘗試次數。
nofailover 關閉 如果設定為 On,當執行緒處於錯誤狀態或已停用時,則會中斷工作階段。如果後端伺服器不支援工作階段複製,請將這個值設定為 On
stickysession - 平衡器工作階段繫結名稱。此值通常設定為類似 JSESSIONIDPHPSESSIONID 的值,具體取決於支援工作階段的後端應用程式伺服器。如果後端應用程式伺服器對 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 之外,balancer-manager 頁面應透過 ACL 進行保護。

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 通訊協定。

top

ProxyPassInherit 指令

說明繼承從主伺服器定義的 ProxyPass 指令
語法ProxyPassInherit On|Off
預設值ProxyPassInherit On
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy
相容性ProxyPassInherit 僅可用於 Apache HTTP Server 2.4.5 和更新版本。

此指令將導致目前的伺服器/vhost「繼承」在主伺服器中定義的 ProxyPass 指令。如果使用 Balancer Manager 進行動態變更,此舉可能會導致問題和不一致的行為,因此建議在使用此功能時將其停用。

全域伺服器中的設定值定義所有 vhost 的預設值。

停用 ProxyPassInherit 也會停用 BalancerInherit

top

ProxyPassInterpolateEnv 指令

說明在反向代理設定中啟用環境變數參照
語法ProxyPassInterpolateEnv On|Off
預設值ProxyPassInterpolateEnv Off
環境伺服器設定、虛擬主機、目錄
狀態擴充功能
模組mod_proxy
相容性於 httpd 2.2.9 和更新版本中可用

此指令,與 interpolate 引數一起用於 ProxyPassProxyPassReverseProxyPassReverseCookieDomainProxyPassReverseCookiePath,讓反向代理伺服器可以使用環境變數進行動態配置,而這些變數可以由另一個模組設定,例如 mod_rewrite。它會影響 ProxyPassProxyPassReverseProxyPassReverseCookieDomainProxyPassReverseCookiePath 指令,如果設定 interpolate 選項,會讓這些指令替換組態指令中字串 ${varname} 為環境變數 varname 的值。

ProxyPass 的程式/主機名稱/連接埠部分可能包含變數,但僅限於在解析指令時可用的變數(例如,使用 Define)。對於所有其他使用案例,請考慮改用 mod_rewrite

效能警告

除非有需要,否則請保持停用狀態!為 ProxyPass 新增變數可能會導致使用預設 mod_proxy 配置的執行緒(不允許任何微調,例如連線重複使用等...)。

top

ProxyPassMatch 指令

說明使用正規表示式將遠端伺服器對應至本機伺服器 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 參數不再在使用有反向引用的 urlProxyPassMatch 中被忽略。但是,為了維持關於後端連線重複使用/保留連線(這些 URL 以前從未重複使用)的既有行為,enablereuse(或 disablereuse)參數在這種情況下預設為 off(響應為 on)。明確設定 enablereuse=on 允許重複使用連線,除非有些反向引用屬於 urlauthority 部分(主機名稱和/或連接埠),此條件會從 Apache HTTP Server 2.4.55 起強制執行,並會在啟動時產生警告,因為這些 URL 本身不可重複使用。

安全性警告

在建構規則的目標 URL 時要小心,考慮允許用戶端影響伺服器將視為代理伺服器的 URL 組的安全性衝擊。確保 URL 的架構和主機名稱部分已修正,或不允許用戶端有不當的影響力。

top

ProxyPassReverse 指令

說明調整反向代理伺服器傳送的 HTTP 回應標頭中的 URL
語法ProxyPassReverse [path] url [interpolate]
環境伺服器設定、虛擬主機、目錄
狀態擴充功能
模組mod_proxy

這項指令允許 Apache httpd 調整 HTTP 重新導向回應上的 LocationContent-LocationURI 標頭中的 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> 區段。

top

ProxyPassReverseCookieDomain 指令

說明調整來自反向代理伺服器的 Set-Cookie 標頭內的 Domain 字串
語法ProxyPassReverseCookieDomain 內部網域名稱 公開網域名稱 [interpolate]
環境伺服器設定、虛擬主機、目錄
狀態擴充功能
模組mod_proxy

用法基本上類似於 ProxyPassReverse,但它並非改寫 URL 標頭,而是改寫 Set-Cookie 標頭內的 domain 字串。

top

ProxyPassReverseCookiePath 指令

說明調整來自反向代理伺服器的 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/

top

ProxyPreserveHost 指令

說明使用傳入 Host HTTP 要求標頭進行代理要求
語法ProxyPreserveHost 開啟|關閉
預設值ProxyPreserveHost 關閉
環境伺服器設定、虛擬主機、目錄
狀態擴充功能
模組mod_proxy
相容性可在 2.3.3 和後續版本的目錄內容中使用。

如果啟用此選項,會將傳入要求中的 Host: 列傳遞給受代理的主機,而非傳遞在 ProxyPass 列指定的主機名稱。

此選項通常應設為 關閉。它多半適用於特殊設定,例如代理大量基於名稱的虛擬主機,後端伺服器需要評估原始 Host 標頭。

top

ProxyReceiveBufferSize 指令

說明代理 HTTP 和 FTP 連線的網路緩衝區大小
語法ProxyReceiveBufferSize bytes
預設值ProxyReceiveBufferSize 0
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy

ProxyReceiveBufferSize 指令指定代理 HTTP 和 FTP 連線的明確(TCP/IP)網路緩衝區大小,以提高傳輸量。它必須大於 512 或是設為 0,表示應使用系統的預設緩衝區大小。

範例

ProxyReceiveBufferSize 2048
top

ProxyRemote 指令

說明處理特定要求的遠端代理伺服器
語法ProxyRemote match remote-server [username:password]
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy
相容性第三個引數(選擇性)僅可在 httpd 2.4.59 及更新版本中使用。

這會定義此代理伺服器的遠端代理伺服器。match 可能是遠端伺服器支援的 URL 範本名稱,或是應使用遠端伺服器的部分 URL,或是 * 表示伺服器應聯絡所有要求。 remote-server 是遠端伺服器的部分 URL。語法

remote-server = scheme://hostname[:port]

scheme 實際上就是應使用來與遠端伺服器溝通的通訊協定;此模組僅支援 httphttps。使用 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 環境變數將沒有效果。

top

ProxyRemoteMatch 指令

說明用來處理與正規表示式相符要求的遠端代理伺服器
語法ProxyRemoteMatch regex remote-server [username:password]
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy
相容性第三個引數(選擇性)僅可在 httpd 2.4.59 及更新版本中使用。

ProxyRemoteMatch 指令和 ProxyRemote 指令相同,不同之處在於第一個引數是請求 URL 的 正規表示式 相符。

top

ProxyRequests 指令

說明啟用順向(標準)代理伺服器要求
語法ProxyRequests On|Off
預設值ProxyRequests Off
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy

這能允許或禁止 Apache httpd 當成順向代理伺服器運作。(將 ProxyRequests 設定為 Off 並不會停用 ProxyPass 指令。)

在典型的反向代理伺服器或閘道設定中,這個選項應該設定為 Off

若要取得代理 HTTP 或 FTP 網站的功能,伺服器中還需要 mod_proxy_httpmod_proxy_ftp(或兩者兼具)。

若要取得代理 HTTPS 網站的功能(順向),伺服器需要啟用 mod_proxy_connect

警告

確保伺服器安全 前請勿啟用與 ProxyRequests 搭配使用的代理功能。開放的代理伺服器對您的網路和整個網際網路都非常危險。

另請參閱

top

ProxySet 指令

說明設定各種 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

警告

請注意,相同的參數金鑰可能有不同的意義,端看是否套用在平衡器或工作人員上,如同上述兩個範例所顯示的逾時。

top

ProxySourceAddress 指令

說明設定傳出的代理伺服器連線的本地 IP 位址
語法ProxySourceAddress address
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy
相容性可於 2.3.9 及後續版本使用

此指令允許設定特定的本地位址在連線到後端伺服器時綁定。

top

ProxyStatus 指令

說明在 mod_status 中顯示 Proxy LoadBalancer 狀態
語法ProxyStatus Off|On|Full
預設值ProxyStatus Off
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy
相容性可於 2.2 及後續版本使用

此指令決定是否透過 mod_status 伺服器狀態頁面顯示代理程式負載平衡器狀態資料。

注意

Full 等同於 On

top

ProxyTimeout 指令

說明代理請求的網路逾時
語法ProxyTimeout seconds
預設值值為 Timeout
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy

此指令允許使用者在代理程式請求上指定逾時。當您有一個緩慢/有漏洞且會當掉的應用程式伺服器時,這很有用,您可以選擇僅傳回逾時並優雅地失敗,而不用等待伺服器回應花費大量時間。

top

ProxyVia 指令

說明對代理請求的 Via HTTP 回應標頭提供資訊
語法ProxyVia On|Off|Full|Block
預設值ProxyVia Off
環境伺服器組態、虛擬主機
狀態擴充功能
模組mod_proxy

此指令控制代理程式使用 Via: HTTP 標頭。其預期用途是控制一串代理伺服器連線中的代理請求流程。請參閱 RFC 2616 (HTTP/1.1) 之第 14.45 段以了解 Via: 標頭行的說明。

可用語言:  en  |  fr  |  ja 

top

註解

注意
這不是問與答區段。放置於此處的留言應朝向改善文件或伺服器的建議,若已被實作或被視為無效/離題,則留言可能會被我們的版主移除。有關如何管理 Apache HTTP Server 的問題應導向我們的 IRC 頻道 (#httpd) (在 Libera.chat) 或傳送至我們的 郵寄清單