除了作為“基本”Web伺服器,並為最終用戶提供靜態和動態內容之外,Apache httpd(以及大多數其他Web伺服器)也可以充當反向代理伺服器,也稱為“網關” “伺服器。
在這種情況下,httpd本身不生成或託管數據,而是由一個或多個後端伺服器獲取內容,後端伺服器通常沒有直接連接到外部網路。當httpd收到來自客戶端的請求時,請求本身被代理到這些後端伺服器其中一個,這個後端伺服器然後處理請求,生成內容然後將此內容發送回httpd,httpd然後生成實際的HTTP回應回客戶端。
這種實現有很多原因,但通常典型的原因是安全性,高可用性,負載平衡和集中式身份驗證/授權。在這些實現中,後端基礎設施(實際處理請求的那些伺服器)的佈局,設計和架構是絕緣的並且受到外部保護是至關重要的;就客戶而言,反向代理伺服器是所有內容的唯一來源。
典型的實現如下:
1. 簡單的反向代理
ProxyPass
指令指定傳入請求到後端伺服器(或稱為Balancer
組的伺服器群集)的映射。最簡單的示例將所有請求(/
)代理到單個後端伺服器:
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
路徑開頭的請求都被代理到指定的後端,否則它將在本地處理。
2. 集群和平衡器
如上所述,儘管它仍然存在缺陷,即(單個)後端節點應該關閉或變得負載很重,代理這些請求不會提供真正的優勢。所需要的是能夠定義一組或一組後端伺服器,它們可以處理這些請求,並且反向代理可以在它們之間進行負載平衡和故障轉移。這個組有時被稱為集群,但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:// scheme
告訴httpd我們正在創建一個名為myset
的平衡器集。它包括2個後端伺服器,httpd稱之為BalancerMembers
。在這種情況下,對/images
的任何請求都將代理到2個後端其中一個。ProxySet
指令指定myset Balancer
使用負載平衡演算法,該演算法根據I/O位元組進行平衡。
3. Balancer和BalancerMember配置
可以通過ProxyPass
中定義的各種參數調整平衡器和工作人員的大量配置詳細資訊。例如,假設希望http://www3.example.com:8080
處理3x超時為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/"
3. 故障轉移
還可以微調各種故障轉移方案,詳細說明在這種情況下應該訪問哪些 worker 甚至哪些平衡器。例如,以下設置實現了三種故障轉移情況:
http://spare1.example.com:8080
和http://spare2.example.com:8080
僅在http://www2.example.com:8080
或http:// www3
中的一個或兩個中發送流量。example.com:8080
不可用。一個備用將用於替換同一平衡器組中的一個不可用成員。http://hstandby.example.com:8080
僅在平衡器組0
中的所有其他 worker 不可用時才發送流量。- 如果所有負載均衡器組0 worker,備件和備用資料庫都不可用,那麼只有來自平衡器組1的
http://bkup1.example.com:8080
和http://bkup2.example.com:8080
worker 才會被輪轉。
因此,可以為每個負載平衡器組設置一個或多個熱備件和熱備件。
<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/"
對於故障轉移,熱備件用作同一負載均衡器組中不可用工作的替代品。如果worker正在耗盡,停止或處於錯誤/失敗狀態,則該worker被視為無法使用。如果負載均衡器集中的所有worker和備件都不可用,則使用熱備用。負載均衡器組(及其各自的熱備件和備用組件)始終按從低到高的順序進行嘗試。
4. 均衡器管理器
Apache httpd的反向代理最獨特和最有用的功能之一是嵌入式均衡器管理器應用程式。與mod_status
類似,balancer-manager
顯示當前正在使用的已啟用均衡器和工作器的當前工作配置和狀態。但是,它不僅顯示這些參數,還允許動態,運行時,幾乎所有這些參數的動態重新配置,包括向現有均衡器添加新的BalancerMembers
(worker)。要啟用這些功能,需要在配置中添加以下內容:
<Location "/balancer-manager">
SetHandler balancer-manager
Require host localhost
</Location>
當在該URL訪問反向代理伺服器時(例如:http://rproxy.example.com/balancer-manager/
,將看到類似於以下內容的頁面:
此表單允許devops
管理員調整各種參數,使worker脫機,更改負載均衡方法並添加新工作。例如,單擊均衡器本身,將看到以下頁面:
點擊worker,顯示此頁面: