利用 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
在 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=...:指定演算法。
ProxyPass / balancer://mycluster/:根路徑所有流量進入叢集。若只代理子路徑,改為 ProxyPass /app/ balancer://mycluster/。ProxyPassReverse:重寫後端回應中的 Location/URI Header,確保重導向正確指向代理位址。若後端未共享 Session(如檔案型 Session),需啟用 Sticky Session,讓同一用戶固定落在同一節點。
<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,實現粘性
# 後端應用無需修改
<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:連續失敗幾次標記 DOWNhcpasses:恢復需連續成功幾次<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>
KeepAlive On、MaxKeepAliveRequests 100、KeepAliveTimeout 5,減少代理與後端建連開銷。ProxyIOBufferSize 8192、ProxyBufferSize 8192,大檔案上傳/下載可適當調大。ProxySet connectiontimeout=5 timeout=30,避免長連線佔用 worker。mod_deflate 壓縮代理回應,節省頻寬。| 現象 | 原因 | 解決 |
|---|---|---|
| 502 Bad Gateway | 後端不可達、連線超時、後端回應 Header 格式錯誤 | 檢查後端日誌、增加 timeout、確認後端回應符合 HTTP 規範 |
| Session 丟失 | 未啟用 Sticky Session、Cookie 域名/路徑不匹配 | 配置 stickysession、檢查 Cookie 設定、建議改用 Redis 共享 Session |
| 負載不均 | 演算法不適、loadfactor 設定錯誤、長連線佔用 | 改用 bybusyness、調整 loadfactor、啟用健康檢查 |
| 重導向循環 | ProxyPassReverse 缺失、後端產生絕對路徑重導向 | 加上 ProxyPassReverse、後端使用相對路徑重導向 |
Apache 負載均衡功能強大且成熟,配合健康檢查、Session 持久化與監控介面,足以支撐中大型應用叢集。生產環境建議前置 Nginx 做靜態分流與 SSL 卸載,Apache 專注動態應用代理,發揮各自優勢。