目錄
一、案例分析
1.案例概述
2.案例前置知識點
2.1 HTTP請求
2.2 負載均衡常用調度算法
?2.3常見的Web群集調度器
3.案例環境
3.1本案例環境
?二、案例實施
1.搭建兩臺web服務器
?2.安裝Haproxy
?3.haproxy服務器配置
修改haproxy的配置文件
?4.測試web群集
5.haproxy的日志
6.haproxy的參數優化
總結
一、案例分析
1.案例概述
????????Haproxy 是目前比較流行的一種群集調度工具,同類群集調度工具有很多如 LVS 和 Nginx。相比較而言,LVS 性能最好,但是搭建相對復雜;Nginx 的upstream 模塊支持群集功能,但是對群集節點健康檢查功能不強,高并發性能沒有 Haproxy 好。Haproxy 官方網站是 http://www.haproxy.org/。
????????本案例介紹使用 Haproxy 及 Nginx 搭建一套 Web 群集。
2.案例前置知識點
2.1 HTTP請求
????????通過 URL 訪問網站使用的協議是 HTTP 協議,此類請求一般稱為 HTTP 請求。HTTP 請求的方式分為GET方式和 POST 方式。當使用瀏覽器訪問某一個URL,會根據請求 URL 返回狀態碼,通常正常的狀態碼為 2xx、3xx(如 200、301),如果出現異常會返回 4xx、5xx(如 400、500)。
????????例如,訪問 http://www.test.com/a.php?Id=123,就是一個 GET 請求,如果訪問正常,會從服務器的日志中獲取 200狀態碼。假如此請求使用 POST 方式,那么傳遞給 a.php 的 Id 參數依舊是 123,但是瀏覽器的 URL 將不會顯示后面的 Id=123 字樣,因此表單類或者有用戶名、密碼等內容提交時建議使用POST 方式。不管使用哪種方式,最終 a.php 獲取的值是一樣的。
2.2 負載均衡常用調度算法
????????LVS、Haproxy、Nginx 最常用的調度算法有三種,如下所述。
- RR(Round Robin)。RR 算法是最簡單最常用的一種算法,即輪詢調度。例如,有三個節點 A、B、C,第一個用戶訪問會被指派到節點 A,第二個用戶訪問會被指派到節點 B,第三個用戶訪問會被指派到節點C,第四個用戶訪問繼續指派到節點 A,輪詢分配訪問請求實現負載均衡效果。此算法還有一種加權輪詢,即根據每個節點的權重輪詢分配訪問請求。
- LC(Least Connections)。LC 算法即最小連接數算法,根據后端的節點連接數大
小動態分配前端請求。例如,有三個節點 A、B、C,各節點的連接數分別為 A:4、B:5、C:
6,此時如果有第一個用戶連接請求,會被指派到 A上,連接數變為 A:5、B:5、C:6;第二個用戶請求會繼續分配到 A 上,連接數變為 A:6、B∶5、C:6:再有新的請求會分配給 B,每次將新的請求指派給連接數最小的客戶端。由于實際情況下 A、B、C的連接數會動態釋放,很難會出現一樣連接數的情況,因此此算法相比較 rr 算法有很大改進,是目前用到比較多的一種算法。 - SH(Source Hashing)。SH 即基于來源訪問調度算法,此算法用于一些有Session 會話記錄在服務器端的場景,可以基于來源的 IP、Cookie 等做群集調度。例如,使用基于源 IP 的群集調度算法,有三個節點 A、B、C,第一個用戶第一次訪問被指派到了 A,第二個用戶第一次訪問被指派到了 B,當第一個用戶第二次訪問時會被繼續指派到 A,第二個用戶第二次訪問時依舊會被指派到B,只要負載均衡調度器不重啟,第一個用戶訪問都會被指派到 A,第二個用戶訪問都會被指派到 B,實現群集的調度。此調度算法好處是實現會話保持,但某些IP訪問量非常大時會引起負載不均衡,部分節點訪問量超大,影響業務使用。
?2.3常見的Web群集調度器
????????目前,常見的 Web 群集調度器分為軟件和硬件。軟件通常使用開源的 LVS、Haproxy、 Nginx,硬件一般使用比較多的是 F5。也有很多人使用國內的一些產品,如梭子魚、綠盟等。
3.案例環境
3.1本案例環境
本案例使用三臺服務器模擬搭建一套 Web 群集,具體的拓撲如圖所示。案例環境如表所示
主機 | 操作系統 | IP 地址 | 應用 |
---|---|---|---|
nginx1 | openEuler 24.03 | 192.168.10.101 | apache |
nginx2 | openEuler 24.03 | 192.168.10.102 | apache |
haproxy | openEuler 24.03 | 192.168.10.103 | haproxy |
?二、案例實施
1.搭建兩臺web服務器
?為了方便實驗,網站沒有配置域名,直接使用IP地址。在客戶端訪問http://192.168.10.102/test.html 測試
?2.安裝Haproxy
?3.haproxy服務器配置
修改haproxy的配置文件
Haproxy 配置項介紹:
Haproxy 配置文件通常分為三個部分,即 global、defaults 和 listen。
global 為全局配置,defaults 為默認配置,listen 為應用組件配置。
- ?global部分-全局配置
globallog 127.0.0.1 local2 # 日志輸出到本地127.0.0.1的syslog的local2設施chroot /var/lib/haproxy # 改變根目錄到/var/lib/haproxy,增強安全性pidfile /var/run/haproxy.pid # 指定pid文件位置user haproxy # 以haproxy用戶身份運行group haproxy # 以haproxy組身份運行daemon # 以守護進程方式運行maxconn 4000 # 最大連接數4000
- ?defaults 部分 - 默認參數
?defaults 配置項配置默認參數,一般會被應用組件繼承,如果在應用組件中沒有特別聲明,將按照默認配置參數設置。
defaultsmode http # 默認模式為HTTP(七層代理)log global # 繼承global部分的日志配置option httplog # 啟用HTTP日志格式option dontlognull # 不記錄空連接日志retries 3 # 失敗后重試3次timeout http-request 5s # HTTP請求超時時間5秒timeout queue 1m # 請求在隊列中的最長等待時間1分鐘timeout connect 5s # 連接后端服務器的超時時間5秒timeout client 1m # 客戶端不活動超時時間1分鐘timeout server 1m # 服務器端不活動超時時間1分鐘timeout http-keep-alive 5s # HTTP keep-alive超時時間5秒timeout check 5s # 健康檢查超時時間5秒maxconn 3000 # 默認最大連接數3000
- ?listen 部分 - 定義前端和后端
listen myweb # 定義一個名為myweb的監聽服務(同時包含前端和后端)bind 0.0.0.0:80 # 監聽所有IP的80端口option httpchk GET /index.html # 使用HTTP GET /index.html進行健康檢查balance roundrobin # 使用輪詢(round-robin)負載均衡算法server inst1 192.168.10.102:80 check inter 2000 fall 3 # 后端服務器1,IP:192.168.10.102:80,啟用健康檢查,檢查間隔2秒,3次失敗標記為不可用server inst2 192.168.10.103:80 check inter 2000 fall █ # 后端服務器2,IP:192.168.10.103:80,啟用健康檢查,檢查間隔2秒,█處應為失敗次數(如3)
?4.測試web群集
????????通過上面的步驟,已經搭建完成 Haproxy 的 Web 群集,接下來需要驗證群集是否工作正常。一個群集一般需要具備兩個特性,第一個是高性能,第二個是高可用。
- 測試高性能
在客戶端訪問網站顯示信息?:
- ?測試高可用
?現在將192.168.10.102的Nginx服務停用,在客戶端使用瀏 覽器打開 http://192.168.10.103/test.html,瀏覽器顯示信息仍然更之前一樣。
從中可以看出,當一臺節點故障,不會影響群集的使用,這樣就滿足了群集的高可用性。也可以將 192.168.10.102的 Nginx 服務恢復,再將192.168.10.103?的 Nginx 服務停用,測試高可用性。
5.haproxy的日志
????????Haproxy 的日志默認輸出到系統的 syslog 中,查看起來不是非常方便,為了更好地管理 Haproxy 的日志,在生產環境中一般單獨定義出來,定義的方法如下所述。?
- 修改 haproxy 配置文件,將原有的配置更改為以下配置:
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg globallog /dev/log local0 info # 修改log配置,使用local0設備記錄info級別日志#chroot /var/lib/haproxy # 注釋掉chroot項(取消chroot限制)
- 配置 Rsyslog 服務
[root@localhost ~]# vim /etc/rsyslog.d/99-haproxy.conf # 捕獲local0設備的日志,寫入/var/log/haproxy.log local0.* /var/log/haproxy.log
- 創建日志文件并設置權限
[root@localhost ~]# touch /var/log/haproxy.log [root@localhost ~]# chmod 640 /var/log/haproxy.log [root@localhost ~]# chown root:adm /var/log/haproxy.log
- 重啟Rsyslog和 HAProxy 服務
[root@localhost ~]# systemctl restart rsyslog [root@localhost ~]# systemctl restart haproxy
- 測試日志信息。
?在客戶端訪問 http://192.168.10.103/test.html 后,可以使用 tail -f/var/log/haproxy.log 即時査看 Haproxy 的訪問請求日志信息。
[root@localhost ~]# tail -f /var/log/haproxy.log
Apr 11 22:06:20 localhost happyxy[2701]: 192.168.10.1:54483 [11/Apr/2025:22:06:20.941] webcluster webcluster/inst2 0/0/0/1/1 200 221 -- --- 2/2/0/0/0 0/0 "GET /test.html HTTP/1.1"
Apr 11 22:06:20 localhost happyxy[2701]: 192.168.10.1:54483 [11/Apr/2025:22:06:20.981] webcluster webcluster/inst1 0/0/0/1/1 404 3603 -- --- 2/2/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"
6.haproxy的參數優化
關于 Haproxy 的參數優化,以下列舉了幾個關鍵的參數,并對各參數的生產環境的優化 建議做了說明,如表下表所示。
分類 | 參數 | 說明 | 優化建議 | 注意事項 |
---|---|---|---|---|
全局參數 | maxconn | 最大并發連接數 | - 推薦值:10240 - 根據服務器內存調整(每連接約占用10-20KB內存) | defaults段的值必須 ≤ global段的值 |
daemon | 守護進程模式 | 生產環境必須啟用 | 非守護進程模式僅用于調試 | |
nbproc | 工作進程數 | 等于CPU核數(如16核)或2倍(如32核) | 每個進程獨立處理連接,需配合maxconn分配 | |
重試策略 | retries | 節點健康檢查重試次數 | - 高并發集群:2-3次 - 小型集群:5-6次 | 過多重試會增加故障檢測延遲 |
HTTP優化 | option http-server-close | 主動關閉后端HTTP連接 | 生產環境建議啟用 | 可減少服務端連接堆積,但會增加TCP握手開銷 |
timeout http-keep-alive | 長連接保持時間 | - 動態內容:10s - 靜態資源:30-60s | 需與應用特性匹配 | |
timeout http-request | HTTP請求超時 | 5-10s(敏感業務可延長至15s) | 過短會導致慢請求失敗 | |
timeout client | 客戶端超時 | - 常規:1min - 高并發:30s | 影響文件上傳等長耗時操作 | |
高級優化 | timeout connect | 后端連接超時 | 5-10s(跨機房部署可延長) | 需大于網絡延遲 |
timeout server | 后端響應超時 | 根據應用響應時間調整(建議≥平均響應時間的3倍) | 過短會導致正常響應被中斷 |
總結
HAProxy作為一款高性能且功能強大的開源負載均衡與代理服務器軟件,在運維領域發揮著至關重要的作用。它憑借高效的請求轉發機制、靈活的負載均衡算法(如輪詢、最少連接、源地址哈希等),能夠智能地將客戶端請求分配到后端多臺服務器,有效提升系統整體性能與可用性;支持TCP和HTTP(S)等多種協議,適配各類應用場景,無論是 Web 服務、數據庫代理還是 API網關等都能輕松應對;具備完善的健康檢查功能,可實時監測后端服務器狀態,自動隔離故障節
點,確保服務連續性;同時,其豐富的配置選項與動態重載能力,讓運維人員能夠根據業務需求靈活調整策略,且無需中斷服務。在實際運維工作中,熟練掌握HAProxy 的部署、配置、監控與優化技巧,對于構建穩定、高效、可擴展的系統架構具有不可忽視的意義。