使用Haporxy搭建Web群集

目錄

一、案例分析

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 地址應用
nginx1openEuler 24.03192.168.10.101apache
nginx2openEuler 24.03192.168.10.102apache
haproxyopenEuler 24.03192.168.10.103haproxy

?二、案例實施

1.搭建兩臺web服務器

?為了方便實驗,網站沒有配置域名,直接使用IP地址。在客戶端訪問http://192.168.10.102/test.html 測試

?2.安裝Haproxy

?3.haproxy服務器配置

修改haproxy的配置文件

Haproxy 配置項介紹:
Haproxy 配置文件通常分為三個部分,即 globaldefaultslisten
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-requestHTTP請求超時5-10s(敏感業務可延長至15s)過短會導致慢請求失敗
timeout client客戶端超時- 常規:1min
- 高并發:30s
影響文件上傳等長耗時操作
高級優化timeout connect后端連接超時5-10s(跨機房部署可延長)需大于網絡延遲
timeout server后端響應超時根據應用響應時間調整(建議≥平均響應時間的3倍)過短會導致正常響應被中斷

總結

HAProxy作為一款高性能且功能強大的開源負載均衡與代理服務器軟件,在運維領域發揮著至關重要的作用。它憑借高效的請求轉發機制、靈活的負載均衡算法(如輪詢、最少連接、源地址哈希等),能夠智能地將客戶端請求分配到后端多臺服務器,有效提升系統整體性能與可用性;支持TCP和HTTP(S)等多種協議,適配各類應用場景,無論是 Web 服務、數據庫代理還是 API網關等都能輕松應對;具備完善的健康檢查功能,可實時監測后端服務器狀態,自動隔離故障節
點,確保服務連續性;同時,其豐富的配置選項與動態重載能力,讓運維人員能夠根據業務需求靈活調整策略,且無需中斷服務。在實際運維工作中,熟練掌握HAProxy 的部署、配置、監控與優化技巧,對于構建穩定、高效、可擴展的系統架構具有不可忽視的意義。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84447.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84447.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pikachu靶場通關筆記38 目錄遍歷(路徑遍歷)

目錄 一、目錄遍歷 二、源碼分析 三、目錄遍歷與文件包含 四、實戰滲透 1、進入靶場 2、目錄遍歷 (1)訪問ace.min.css (2)訪問fileinclude.php 本系列為《pikachu靶場通關筆記》滲透實戰,本文通過對目錄遍歷源…

現代C++:std::string全方位碾壓C字符串

在 C 中引入的 std::string 是對 C 語言中 char* 和 const char* 的一種現代化封裝和增強。它不僅解決了 C 字符串的許多缺陷(如安全性、內存管理、易用性等),還提供了豐富的 API 來簡化字符串操作。本文將從多個維度詳細對比 std::string 與…

20250619周四:Atlassian

今天主要把conference上的A xxx的所有資料大體看了一遍,花了兩個多小時。 公司的這個conference系統,共實就是一個大型的可多人在線編輯的文件系統。差不多所有的資料都共享在上面。這對于多人參與的項目管理,還是相當方便的。 Atlassian最特…

通過CDH安裝Spark的詳細指南

通過CDH安裝Spark的詳細指南 簡介 Cloudera Distribution of Hadoop (CDH) 是一個企業級的大數據平臺,它集成了多個開源組件,包括Hadoop、Spark、Hive等。本文將詳細介紹如何通過CDH安裝和配置Spark。 前提條件 在開始安裝之前,請確保滿足以下條件: 已安裝CDH集群具有管…

GitLab CVE-2025-5121 安全漏洞解決方案

本分分享極狐GitLab 補丁版本 18.0.2, 17.11.4, 17.10.8 的詳細內容。這幾個版本包含重要的缺陷和安全修復代碼,我們強烈建議所有私有化部署用戶應該立即升級到上述的某一個版本。對于極狐GitLab SaaS,技術團隊已經進行了升級,無需用戶采取任…

【八股消消樂】Elasticsearch優化—檢索Labubu

😊你好,我是小航,一個正在變禿、變強的文藝傾年。 🔔本專欄《八股消消樂》旨在記錄個人所背的八股文,包括Java/Go開發、Vue開發、系統架構、大模型開發、具身智能、機器學習、深度學習、力扣算法等相關知識點&#xff…

如何實現基于場景的接口自動化測試用例?

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快 自動化本身是為了提高工作效率,不論選擇何種框架,何種開發語言,我們最終想實現的效果,就是讓大家用最少的代碼&…

FreeRTOS 任務管理學習筆記

FreeRTOS 任務管理學習筆記 引言 本文檔旨在通過在STM32微控制器上使用FreeRTOS來理解和實現任務管理。實驗的重點是創建和管理多個任務、處理任務同步以及通過簡單的硬件接口控制任務狀態。 實驗概述 實驗涉及創建三個任務: LED1_Task: 每300毫秒切換一次LED。…

c++set和pair的使用

set是C中的一種關聯容器,具有以下特點: 存儲唯一元素(不允許重復) 元素自動排序(默認升序) 基于紅黑樹實現(平衡二叉搜索樹) 插入、刪除和查找的時間復雜度為O(log n) 前言 在C…

終端命令行執行具體的方法名測試用例

你可以使用如下命令單獨執行 test_mutation_login_by_email 方法:python3 manage.py test apps.login.test_client.LoginTestCase.test_mutation_login_by_email 注意事項: 路徑 apps.login.test_client 要與你項目實際的 Python 包路徑一致(即 test_client.py 文件所在的包…

20250620在Ubuntu20.04.6下編譯KickPi的K7的Android14系統

【處理SDK】 rootrootrootroot-X99-Turbo:~/Android14$ tar zxvf rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android14$ ll rootrootrootroot-X99-Turbo:~/Android14$ rm rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android1…

碳中和時代的家電革命,從華為智選IAM看科技企業的環保擔當

在"雙碳"戰略與品質消費浪潮的雙重加持下,家電產業正經歷一場前所未有的綠色革命。華為智選與空凈十大品牌IAM的深度協同,不僅構建了智能家電領域的技術新高地,更通過系統性創新持續拓展著行業可持續發展的想象空間。從凈水科技的突…

(C語言)Map數組的實現(數據結構)(鏈表)(指針)

源代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>// 鍵值對節點 typedef struct Node {char* key;int value;struct Node* next; } Node;// Map結構 typedef struct {Node* buckets[100]; // 固定大小的哈希桶&#xff08;…

Logback示例解析

<configuration><!-- 環境變量 --><springProperty scope"context" name"app.name" source"spring.application.name" defaultValue"application"/><!-- 日志存放路徑 --><property name"log.path&qu…

elementui響應式數據類型變更情況

背景。vue2。data中定義的響應數據類型是[]數組。應用在el-select中&#xff08;非multiple情況&#xff09;。當發生響應數據有變更渲染視圖時&#xff0c;發現定義的數組轉換成了字符串。 本身不是問題。但因為疏忽引發了watch監聽formData數據時產生了產生了多次監聽事件。…

人機融合智能 | 人智交互語境下的設計新模態

本章旨在探討技術與設計領域在人智交互語境下的關系及其影響,討論通過傳統設計對人智交互的優化方法。通過回顧大數據和發展趨勢,以 AI技術作為重要的技術推力,我們認為 AI技術將會在未來成為設計領域不可缺少的重要環節,并能夠幫助設計師更加高效、準確地開展設計工作。本章著…

C++設計模式分類(GOF-23種設計模式)

文章目錄 GOF-23 設計模式分類一、從目的分類1. 創建型&#xff08;Creational&#xff09;模式2. 結構型&#xff08;Structural&#xff09;模式3. 行為型&#xff08;Behavioral&#xff09;模式 二、從范圍分類1. 類模式&#xff08;Class Pattern&#xff09;2. 對象模式&…

AbMole| LY294002(M1925)

LY294002是一種廣譜的PI3K抑制劑&#xff0c;對PI3Kα/δ/β的IC50分別為0.5 μM/0.57 μM/0.97 μM。LY294002 也可以抑制 CK2 的活性&#xff0c;IC50 為 98 nM。LY294002 還是一種競爭性 DNA-PK 抑制劑&#xff0c;可逆結合 DNA-PK 的激酶結構域&#xff0c;IC50 為 1.4 μM…

第1章,[標簽 Win32] :第一個 WIn32 程序,MessageBox 函數

專欄導航 上一篇&#xff1a;第1章&#xff0c;[標簽 Win32] &#xff1a;第一個 WIn32 程序&#xff0c;程序入口 回到目錄 下一篇&#xff1a;無 本節前言 本節的學習&#xff0c;需要前兩節的內容作為先修知識。如果還沒有去看本專欄的前兩節&#xff0c;請你先去學習它…

求助帖:學Java開發方向還是網絡安全方向前景好

最近網絡安全被一個培訓機構吹得天花亂墜&#xff0c;雖然他家既有網安又有java和UI&#xff0c;我也是學軟件工程的&#xff08;山西某211&#xff0c;此機構是每年和我們學校合作的校企公司&#xff09;&#xff0c;但那里的老師仍然大力推薦我學網絡安全&#xff08;滲透、代…