<-
Apache > HTTP 伺服器 > 文件 > 版本 2.4 > 如何操作/教學

反向代理指南

可用語言:  en  |  fr 

除了作為「基本」的網路伺服器,提供靜態和動態內容給最終使用者之外,Apache httpd(以及大多數其他網路伺服器)也能充當反向代理伺服器,也稱為「閘道」伺服器。

在這種場景中,httpd 本身不會產生或儲存資料,而會從一個或數個後端伺服器取得內容,這些伺服器正常來說並未直接連接至外部網路。當 httpd 從客戶端收到要求時,要求本身會透過「代理」傳送給這些後端伺服器,後端伺服器接著處理要求,產生內容,然後將此內容傳回 httpd,最後 httpd 再針對客戶端產生實際的 HTTP 回應。

對於這種實作有很多原因,但通常的依據是安全性、高可用性、負載平衡和集中式驗證/授權。在這些實作中,後端基礎架構(實際處理要求的那些伺服器)的配置、設計和結構必須與外部隔離並受到保護,至關重要;對於客戶端而言,反向代理伺服器就是唯一內容來源。

常見實作如下

reverse-proxy-arch

Support Apache!

另請參閱

top

反向代理

top

單純的反向代理

ProxyPass 指令指定將接收要求配對至後端伺服器(或伺服器叢集,稱為「平衡器」群組)。最簡單的範例將所有要求("/")代理至單一後端

ProxyPass "/"  "http://www.example.com/"

為確保 Location: 標頭由後端產生後會修改為指向反向代理伺服器,而不是它自己,通常需要 ProxyPassReverse 指令。

ProxyPass "/"  "http://www.example.com/"
ProxyPassReverse "/"  "http://www.example.com/"

只能代理特定的 URI,如本範例所示

ProxyPass "/images"  "http://www.example.com/"
ProxyPassReverse "/images"  "http://www.example.com/"

在上述,任何從 /images 路徑起始的請求將會代理到已指定的後端,否則會在本地處理。

top

叢集和負載平衡器

上述指令非常有用,但仍有一些缺點,如果(單一)後端節點當機或負載過重,則代理這些請求不會帶來實際優勢。需要的是定義一組或多組後端伺服器,它們可以處理此類請求,而反向代理伺服器則可以在它們之間進行負載平衡和故障切換。此類群組有時候稱為叢集,但 Apache httpd 的術語是負載平衡器。定義負載平衡器時會利用 <Proxy>BalancerMember 指令,如所示

<Proxy balancer://myset>
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080
    ProxySet lbmethod=bytraffic
</Proxy>

ProxyPass "/images/"  "balancer://myset/"
ProxyPassReverse "/images/"  "balancer://myset/"

balancer:// 架構會告知 httpd 我們正建立名稱為 myset 的平衡器組。其中包含 2 台後端伺服器,由 httpd 稱為 BalancerMembers。在本範例中,任何對 /images 的請求都會代理到 2 個後端之一。ProxySet 指令會指定 myset Balancer 使用根據 I/O 位元組執行平衡的負載平衡演算法。

提示

BalancerMembers 有時也會稱為工作端

top

負載平衡器和負載平衡器成員設定

您可以透過 ProxyPass 中定義的各種參數調整負載平衡器和工作端的許多設定細節。例如,假設我們想要 http://www3.example.com:8080 處理 3 倍流量,且逾時時間為 1 秒,我們會如下調整設定

<Proxy balancer://myset>
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    ProxySet lbmethod=bytraffic
</Proxy>

ProxyPass "/images"  "balancer://myset/"
ProxyPassReverse "/images"  "balancer://myset/"
top

故障切換

您還可以微調各種故障切換情境,詳細說明在這種情況下應該使用哪些工作端,甚至哪些平衡器。例如,下列設定會實作三個故障切換案例

  1. http://spare1.example.com:8080http://spare2.example.com:8080 僅在 http://www2.example.com:8080http://www3.example.com:8080(一個或兩個)其中一個或兩個站點無法使用時才會傳送流量。(一個備用站點將用來取代同一平衡器組中一個無法使用的成員。)
  2. http://hstandby.example.com:8080 僅在平衡器組 0 中所有其他工作端都無法使用時才會傳送流量。
  3. 如果所有負載平衡器組 0 的工作端、備用端和備援都無法使用,才會讓負載平衡器組 1 的工作端 http://bkup1.example.com:8080http://bkup2.example.com:8080 開始運作。

因此,每個負載平衡器組可以有一個或多個熱備用端和熱備援。

<Proxy balancer://myset>
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    BalancerMember http://spare1.example.com:8080 status=+R
    BalancerMember http://spare2.example.com:8080 status=+R
    BalancerMember http://hstandby.example.com:8080 status=+H
    BalancerMember http://bkup1.example.com:8080 lbset=1
    BalancerMember http://bkup2.example.com:8080 lbset=1
    ProxySet lbmethod=byrequests
</Proxy>

ProxyPass "/images/"  "balancer://myset/"
ProxyPassReverse "/images/"  "balancer://myset/"

對於故障轉移,可用備份用來替換同一負載平衡器組中無法使用的執行器。如果某個工作負載正在執行中、已停止或處於錯誤/失敗狀態,則表示該工作負載無法使用。如果負載平衡器組中的所有工作負載和備份均不可用,則會使用熱備援。始終按從最低到最高的順序嘗試負載平衡器組(及其各自的可用備份和備援)。

top

平衡器管理員

Apache httpd 反向代理最獨特且最實用的功能之一是嵌入式 *balancer-manager* 應用程式。類似於 mod_status,*balancer-manager* 顯示目前使用中的已啟用平衡器和工作負載的目前運作設定和狀態。然而,它不僅顯示這些參數,還允許動態、執行時間、即時地重新設定幾乎所有參數,包括將新的 *BalancerMembers*(工作負載)加入現有的平衡器。若要啟用這些功能,您需要在組態中加入以下內容:

<Location "/balancer-manager">
    SetHandler balancer-manager
    Require host localhost
</Location>

警告

保護您的伺服器 之前,請不要啟用 *balancer-manager*。特別是,請確定對 URL 的存取受到嚴格限制。

當在該 URL 存取反向代理伺服器時(例如:http://rproxy.example.com/balancer-manager/,您將看到類似於以下內容的頁面:

balancer-manager page

這個表單允許 DevOps 管理員調整各種參數、將工作負載設為離線、變更負載平衡方法,以及加入新的工作負載。例如,點選平衡器本身,您會取得以下頁面:

balancer-manager page

而點選某個工作負載,則會顯示這個頁面:

balancer-manager page

若要讓這些變更持續執行反向代理,請確定已啟用 BalancerPersist

top

動態健康檢查

在 httpd 將請求代理到工作負載之前,它可以使用 ProxyPass 為工作負載設定 ping 參數,來 *「測試」* 該工作負載是否可用。通常以一種動態的 *非資料傳輸* 方式來檢查工作負載的健康狀況會比較實用。這種方式在 Apache httpd 中是由 mod_proxy_hcheck 模組達成。

top

平衡器成員狀態旗標

在 *balancer-manager* 中會顯示工作負載的目前狀態或 *狀態*,並且可以設定/重設這些狀態。這些狀態的意義如下所示:

旗標字串說明
 Ok工作負載可用
 Init工作負載已初始化完成
DDis工作負載已停用,且不會接受任何請求;將自動重新嘗試。
SStop工作負載已管理上停止;不會接受請求,且不會自動重新嘗試。
IIgn工作負載處於忽略錯誤模式,而且會始終視為可用。
RSpar工作人員是熱備份。對於一個給定的 lbset 中任何不可用的工作人員 (正在耗盡、已停止、在錯誤中等等),將會使用具有相同 lbset 的可用熱備份取代。熱備份能助於確保一定數量的員工持續可以被負載平衡器使用。
HStby工作人員處於熱備用模式,只有在平衡器集合中沒有其他合適的工作人員或備份可用時才使用。
EErr工作人員處於錯誤狀態,通常是因爲在請求前檢查失敗;請求不會代理給此工作人員,但會根據工作人員的重試設定進行重試。
NDrn工作人員處於耗盡模式,只會接受預定給自己的現有持續會話並忽略所有其他請求。
CHcFl工作人員已在動態健康檢查中失敗,在隨後的健康檢查通過之前將不會使用。

可用語言:  en  |  fr 

top

留言

聲明
此處並非問與答部分。在此處放置的評論應指向改善文件或伺服器的建議,如果內容已實現或被認為無效/偏離主題,也可能會被我們的管理員移除。關於如何管理 Apache HTTP 伺服器方面的疑難雜症應發佈至我們在 Libera.chat 上的 IRC 頻道 #httpd,或傳送至我們的 郵件列表