Apache反向代理


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

在這種情況下,httpd本身不生成或託管資料,而是由一個或多個後端伺服器獲取內容,後端伺服器通常沒有直接連線到外部網路。當httpd收到來自用戶端的請求時,請求本身被代理到這些後端伺服器其中一個,這個後端伺服器然後處理請求,生成內容然後將此內容傳送回httpd,httpd然後生成實際的HTTP響應回用戶端。

這種實現有很多原因,但通常典型的原因是安全性,高可用性,負載平衡和集中式身份驗證/授權。在這些實現中,後端基礎設施(實際處理請求的那些伺服器)的布局,設計和架構是絕緣的並且受到外部保護是至關重要的;就客戶而言,反向代理伺服器是所有內容的唯一來源。

典型的實現如下:

Apache反射代理

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:8080http://spare2.example.com:8080僅在http://www2.example.com:8080http:// www3中的一個或兩個中傳送流量。example.com:8080不可用。一個備用將用於替換同一平衡器組中的一個不可用成員。
  • http://hstandby.example.com:8080僅在平衡器組0中的所有其他 worker 不可用時才傳送流量。
  • 如果所有負載均衡器組0 worker,備件和備用資料庫都不可用,那麼只有來自平衡器組1的http://bkup1.example.com:8080http://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,顯示此頁面:

負載均衡