首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Apache 實作 Web Server 負載均衡(反向代理)配置詳解

     編輯:PHP 相關知識

利用 Apache mod_proxy_balancer 可快速建立反向代理負載均衡叢集,將流量分發至多台後端應用伺服器。本文說明模組載入、負載演算法配置、Session 持久化(Sticky Session)與健康檢查進階設定,適用於無 Session 共享或已有共享存儲的場景。

架構圖解

用戶請求 → Apache (負載均衡器, 192.168.1.10) → 後端叢集
                                    ├─ Server B (192.168.1.20:80)
                                    └─ Server C (192.168.1.30:80)

一、啟用必要模組

編輯 httpd.conf,取消註解(或新增)以下行:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
# 負載演算法模組(至少啟用一個)
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so  # 請求計數(預設)
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so    # 流量加權
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so  # 忙碌度
# 可選:健康檢查
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so

二、基礎負載均衡配置(不考慮 Session)

在 httpd.conf 或獨立 conf/extra/proxy-balancer.conf 中加入:

<Proxy balancer://mycluster>
    # 後端節點定義
    BalancerMember https://192.168.1.20:80 loadfactor=1
    BalancerMember https://192.168.1.30:80 loadfactor=1
    # 負載演算法:byrequests(預設)、bytraffic、bybusyness
    ProxySet lbmethod=byrequests
</Proxy>

# 代理路徑:將所有請求轉發至叢集
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/

# 可選:保留原始 Host Header,後端需設定 UseCanonicalName Off
ProxyPreserveHost On

關鍵指令說明:

  • BalancerMember:定義後端節點,loadfactor 權重(預設 1),數值越大分得請求越多。
  • ProxySet lbmethod=...:指定演算法。
    • byrequests:輪詢分發,適合同質節點。
    • bytraffic:依據傳輸位元組數加權,適合頻寬異質節點。
    • bybusyness:分發給當前活躍連線最少的節點,適合長連線/慢請求場景。
  • ProxyPass / balancer://mycluster/:根路徑所有流量進入叢集。若只代理子路徑,改為 ProxyPass /app/ balancer://mycluster/。
  • ProxyPassReverse:重寫後端回應中的 Location/URI Header,確保重導向正確指向代理位址。

三、進階:Session 持久化

若後端未共享 Session(如檔案型 Session),需啟用 Sticky Session,讓同一用戶固定落在同一節點。

方法 A:Cookie 插入(推薦,無需後端配合)

<Proxy balancer://mycluster>
    BalancerMember https://192.168.1.20:80 route=node1
    BalancerMember https://192.168.1.30:80 route=node2
    ProxySet lbmethod=byrequests stickysession=ROUTEID
</Proxy>

# Apache 會自動設定/讀取 Cookie ROUTEID=node1,實現粘性
# 後端應用無需修改

方法 B:後端設定路由標識(JSESSIONID、PHPSESSID 等)

<Proxy balancer://mycluster>
    BalancerMember https://192.168.1.20:80 route=node1
    BalancerMember https://192.168.1.30:80 route=node2
    ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid scolonpathdelim=On
</Proxy>

scolonpathdelim=On 支援 URL 重寫模式(;jsessionid=xxx)。

四、健康檢查與故障轉移

Apache 2.4.21+ 支援 mod_proxy_hcheck 主動健康檢查:

<Proxy balancer://mycluster>
    BalancerMember https://192.168.1.20:80 route=node1 hcmethod=GET hcuri=/healthcheck hcinterval=10 hcfails=3 hcpasses=2
    BalancerMember https://192.168.1.30:80 route=node2 hcmethod=GET hcuri=/healthcheck hcinterval=10 hcfails=3 hcpasses=2
    ProxySet lbmethod=byrequests
</Proxy>
  • hcmethod:檢查方法(GET/HEAD/OPTIONS)
  • hcuri:健康檢查端點(後端需實作回傳 2xx)
  • hcinterval:檢查間隔(秒)
  • hcfails:連續失敗幾次標記 DOWN
  • hcpasses:恢復需連續成功幾次

五、狀態監控頁面

<Location /balancer-manager>
    SetHandler balancer-manager
    Require host 192.168.1.0/24  # 僅允許內網存取
</Location>

瀏覽 https://lb-host/balancer-manager 可即時查看節點狀態、流量分佈、手動啟停節點。

六、完整範例配置檔

# /etc/apache2/sites-available/loadbalancer.conf
<VirtualHost *:80>
    ServerName lb.example.com

    # 模組已在主配置載入,這裡只寫 Proxy 規則
    <Proxy balancer://appcluster>
        BalancerMember https://10.0.1.10:8080 route=app1 loadfactor=2
        BalancerMember https://10.0.1.11:8080 route=app2 loadfactor=1
        BalancerMember https://10.0.1.12:8080 route=app3 loadfactor=1 status=+H  # 熱備
        ProxySet lbmethod=bybusyness stickysession=ROUTEID
    </Proxy>

    ProxyPass / balancer://appcluster/
    ProxyPassReverse / balancer://appcluster/
    ProxyPreserveHost On

    # 健康檢查(需後端提供 /health 回傳 200)
    <Proxy balancer://appcluster>
        BalancerMember https://10.0.1.10:8080 hcmethod=GET hcuri=/health hcinterval=5
        BalancerMember https://10.0.1.11:8080 hcmethod=GET hcuri=/health hcinterval=5
        BalancerMember https://10.0.1.12:8080 hcmethod=GET hcuri=/health hcinterval=5
    </Proxy>

    # 監控頁面
    <Location /balancer-manager>
        SetHandler balancer-manager
        Require ip 10.0.0.0/8
    </Location>

    ErrorLog ${APACHE_LOG_DIR}/lb-error.log
    CustomLog ${APACHE_LOG_DIR}/lb-access.log combined
</VirtualHost>

七、效能調優建議

  1. 啟用 Keep-Alive:KeepAlive On、MaxKeepAliveRequests 100、KeepAliveTimeout 5,減少代理與後端建連開銷。
  2. 調整 Proxy 緩衝:ProxyIOBufferSize 8192、ProxyBufferSize 8192,大檔案上傳/下載可適當調大。
  3. 連線池複用:ProxySet connectiontimeout=5 timeout=30,避免長連線佔用 worker。
  4. 壓縮傳輸:啟用 mod_deflate 壓縮代理回應,節省頻寬。
  5. 靜態資源分離:Nginx/CDN 處理靜態檔,Apache 僅代理動態請求,大幅降低負載。

八、常見問題排查

現象原因解決
502 Bad Gateway後端不可達、連線超時、後端回應 Header 格式錯誤檢查後端日誌、增加 timeout、確認後端回應符合 HTTP 規範
Session 丟失未啟用 Sticky Session、Cookie 域名/路徑不匹配配置 stickysession、檢查 Cookie 設定、建議改用 Redis 共享 Session
負載不均演算法不適、loadfactor 設定錯誤、長連線佔用改用 bybusyness、調整 loadfactor、啟用健康檢查
重導向循環ProxyPassReverse 缺失、後端產生絕對路徑重導向加上 ProxyPassReverse、後端使用相對路徑重導向

Apache 負載均衡功能強大且成熟,配合健康檢查、Session 持久化與監控介面,足以支撐中大型應用叢集。生產環境建議前置 Nginx 做靜態分流與 SSL 卸載,Apache 專注動態應用代理,發揮各自優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved