翻譯自:https://httpd.apache.org/docs/2.4/en/howto/reverse_PRoxy.html
除了充當”basic”服務器向用戶提供靜態及動態的內容之外,Apache服務器跟大多數服務器一樣,能夠提供反向代理服務方案,也被稱為”gateway”服務器
在這樣的場景中,httpd自己不生成或托管數據,而是從一個或多個后端服務器(通常沒有直接與外部網絡連接)獲取內容。當httpd從客戶端接收一個請求,這個請求自身被代理到其中一個后端服務器,這個后端服務器處理請求,生成內容并把內容發送至httpd,然后httpd生成實際的HTTP響應到客戶端。
這樣實現有眾多的原因,但是典型的原因是為了安全、高可用、負載均衡和集中認證授權。在反向代理中,關鍵在于布局、設計和建設后端基礎設施(即實際處理請求的服務器)使得其對外界隔離和保護。對于客戶端而言,反向代理服務器是唯一的內容來源。
典型的實現如下:
有關Modules
mod_proxymod_proxy_balancermod_proxy_hcheck有關指令
ProxyPassBalancerMemberProxyPass指定傳入的映射到后端服務器或一個負載均衡的服務器集群。例如將所有請求(“/”)代理到一個后端服務器:
ProxyPass "/" "http://www.example.com/"為了代理和代理的位置:來自后端生成的頭部被更改到指向反向代理,而不是指向自身,ProxyPassReverse是最常用的指令:
ProxyPass "/" "http://www.example.com/"ProxyPassReverse "/" "http://www.example.com/"之后確定的URIs能夠被代理,如下例:
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我們正在創建一個名為< 方案名 >的均衡集。集合包括2個后端服務器,httpd命名為BalancerMembers。在本案例中,任何來自于/images的請求將被代理到2個后端中的一個,ProxySet指定該均衡器使用一個給予I/O的負載均衡算法
你可以通過ProxyPass中定義的各種參數調整均衡器和工作程序的大量配置信息。例如,假設我們想要 http://www3.example.com:8080 處理3倍流量并且超時為1s,我們可以調整配置如下:
<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/"你也可以微調各種故障轉移方案,可以詳細說明在這個方案中,那個均衡器成員甚至是均衡器應該被訪問。例如,以下實現的2個故障轉移方案:1、如果其他所有在集合中的均衡器成員不工作,http://hstandby.example.com:8080 是唯一的流量接收服務器;2、如果該工作程序本身失效,http://bkup1.example.com:8080 和 http://bkup2.example.com:8080 這2個均衡器成員進行輪換
<Proxy balancer://myset> BalancerMember http://www2.example.com:8080 BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1 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/"這個故障轉移設置的魔法在于 http://hstandby.example.com:8080 帶有+H 狀態標志,這使得該服務器處于 熱備 模式。設置2個bkup# 服務器的組為 #1 負載均衡集合(默認集合為0);一旦故障轉移,熱備將在第一時間啟用,當所有常規的均衡器成員不可用時,負載均衡器將嘗試最小的集合(#0,#1,#2…)
Apache httpd的逆向代理最獨特和有用的特性之一是嵌入式平衡器管理器(balancer-manager)應用程序。與mod_status類似,balancer-manager展示當前啟用的均衡器和均衡器成員正工作中的配置和狀態。但是,他不僅顯示這些參數,還允許大多數參數的動態,運行時,即時重新配置,包括添加新的均衡器成員(BalancerMembers)到一個存在的均衡器中。開啟這個功能,需要添加以下代碼到配置中:
<Location "/balancer-manager"> SetHandler balancer-manager Require host localhost</Location>在反向代理服務器訪問url(http://rproxy.example.com/balancer-manager/)你將看到如下頁面
這種形式允許開發管理員調整各種參數,關閉均衡器成員,修改負載均衡模式以及添加新的均衡器成員。例如,點擊均衡器本身,你講看到如下頁面
單擊一個均衡器成員,顯示如下頁面
要使更改持續,需重啟反向代理,并確保BalancerPersist可用
在httpd將請求代理給均衡器成員之前,可以通過使用ProxyPass設置該均衡器成員的ping參數來測試該均衡器成員是否可用。通常,以動態的方式檢查均衡器成員的健康狀態是很有益處的。通過mod_proxy_hcheck實現
在均衡器管理中,顯示當前均衡器成員的狀態并且可以set/reset。這些狀態的含義如下:
新聞熱點
疑難解答