Apache HTTP 伺服器版本 2.4
除了作為「基本」的網路伺服器,提供靜態和動態內容給最終使用者之外,Apache httpd(以及大多數其他網路伺服器)也能充當反向代理伺服器,也稱為「閘道」伺服器。
在這種場景中,httpd 本身不會產生或儲存資料,而會從一個或數個後端伺服器取得內容,這些伺服器正常來說並未直接連接至外部網路。當 httpd 從客戶端收到要求時,要求本身會透過「代理」傳送給這些後端伺服器,後端伺服器接著處理要求,產生內容,然後將此內容傳回 httpd,最後 httpd 再針對客戶端產生實際的 HTTP 回應。
對於這種實作有很多原因,但通常的依據是安全性、高可用性、負載平衡和集中式驗證/授權。在這些實作中,後端基礎架構(實際處理要求的那些伺服器)的配置、設計和結構必須與外部隔離並受到保護,至關重要;對於客戶端而言,反向代理伺服器就是唯一內容來源。
常見實作如下
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
路徑起始的請求將會代理到已指定的後端,否則會在本地處理。
上述指令非常有用,但仍有一些缺點,如果(單一)後端節點當機或負載過重,則代理這些請求不會帶來實際優勢。需要的是定義一組或多組後端伺服器,它們可以處理此類請求,而反向代理伺服器則可以在它們之間進行負載平衡和故障切換。此類群組有時候稱為叢集,但 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 個後端之一。
指令會指定 myset Balancer 使用根據 I/O 位元組執行平衡的負載平衡演算法。ProxySet
BalancerMembers 有時也會稱為工作端。
您可以透過
中定義的各種參數調整負載平衡器和工作端的許多設定細節。例如,假設我們想要 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/"
您還可以微調各種故障切換情境,詳細說明在這種情況下應該使用哪些工作端,甚至哪些平衡器。例如,下列設定會實作三個故障切換案例
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
中所有其他工作端都無法使用時才會傳送流量。0
的工作端、備用端和備援都無法使用,才會讓負載平衡器組 1
的工作端 http://bkup1.example.com:8080
和 http://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/"
對於故障轉移,可用備份用來替換同一負載平衡器組中無法使用的執行器。如果某個工作負載正在執行中、已停止或處於錯誤/失敗狀態,則表示該工作負載無法使用。如果負載平衡器組中的所有工作負載和備份均不可用,則會使用熱備援。始終按從最低到最高的順序嘗試負載平衡器組(及其各自的可用備份和備援)。
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/
,您將看到類似於以下內容的頁面:
這個表單允許 DevOps 管理員調整各種參數、將工作負載設為離線、變更負載平衡方法,以及加入新的工作負載。例如,點選平衡器本身,您會取得以下頁面:
而點選某個工作負載,則會顯示這個頁面:
若要讓這些變更持續執行反向代理,請確定已啟用 BalancerPersist
。
在 httpd 將請求代理到工作負載之前,它可以使用 ProxyPass
為工作負載設定 ping
參數,來 *「測試」* 該工作負載是否可用。通常以一種動態的 *非資料傳輸* 方式來檢查工作負載的健康狀況會比較實用。這種方式在 Apache httpd 中是由 mod_proxy_hcheck
模組達成。
在 *balancer-manager* 中會顯示工作負載的目前狀態或 *狀態*,並且可以設定/重設這些狀態。這些狀態的意義如下所示:
旗標 | 字串 | 說明 |
---|---|---|
Ok | 工作負載可用 | |
Init | 工作負載已初始化完成 | |
D | Dis | 工作負載已停用,且不會接受任何請求;將自動重新嘗試。 |
S | Stop | 工作負載已管理上停止;不會接受請求,且不會自動重新嘗試。 |
I | Ign | 工作負載處於忽略錯誤模式,而且會始終視為可用。 |
R | Spar | 工作人員是熱備份。對於一個給定的 lbset 中任何不可用的工作人員 (正在耗盡、已停止、在錯誤中等等),將會使用具有相同 lbset 的可用熱備份取代。熱備份能助於確保一定數量的員工持續可以被負載平衡器使用。 |
H | Stby | 工作人員處於熱備用模式,只有在平衡器集合中沒有其他合適的工作人員或備份可用時才使用。 |
E | Err | 工作人員處於錯誤狀態,通常是因爲在請求前檢查失敗;請求不會代理給此工作人員,但會根據工作人員的重試 設定進行重試。 |
N | Drn | 工作人員處於耗盡模式,只會接受預定給自己的現有持續會話並忽略所有其他請求。 |
C | HcFl | 工作人員已在動態健康檢查中失敗,在隨後的健康檢查通過之前將不會使用。 |