【linux】HAProxy七層代理

HAPorxy簡介

HAProxy(High Availability Proxy)是一款高性能、開源的負載均衡器與反向代理服務器,主要用于 TCP 和 HTTP 協議的流量分發,廣泛應用于高并發、高可用的網絡架構中

核心特性

超高性能與低資源消耗

????????基于單進程、多線程模型,處理并發連接能力極強,單實例可輕松支撐數萬并發請求

靈活的負載均衡策略

? ? ? ? 支持多種算法如:輪詢、加權輪詢、源地址哈希、最少鏈接

強大的健康檢查與高可用

????????內置多層健康檢查機制(TCP 層、HTTP 層),可定期檢測后端服務器狀態(如端口是否存活、HTTP 響應碼是否正常)

精細化的流量控制與安全防護

????????可設置連接限速、請求限流,防止后端服務器被流量沖擊

????????支持 ACL(訪問控制列表),基于 IP、請求方法、URL 等條件過濾惡意請求(如攔截爬蟲、限制特定 IP 訪問)

????????集成 SSL/TLS 終止功能,可在負載均衡層處理 HTTPS 加密解密,減輕后端服務器負擔

HAProxy的安裝和服務信息

安裝軟件包

dnf install haproxy -y

haproxy基本信息:

軟件安裝包haproxy-2.4.22-3.el9_3.x86_64.rpm
啟動文件/lib/systemd/system/haproxy.service
主配置目錄/etc/haproxy/
主配置文件/etc/haproxy/haproxy.cfg
子配置目錄/etc/haproxy/conf.d

haproxy的基本配置信息

global配置

參數說明:

log??定義全局的syslog服務器;日志服務器需要開啟UDP協議,最多可以定義兩個
chroot??鎖定運行目錄
pidfile? ?指定pid文件
maxconn指定最大連接數
user指定haproxy的運行用戶
group指定haproxy的運行組
daemon指定haproxy以守護進程方式運行

# turn on stats unix socket(在此處可以指定進程數量或者線程數量,多線程和多進程只可以指定一個,不可指定多個

stats socket指定haproxy的套接字文件
nbproc指定haproxy的work進程數量,默認是1個
cpu-map 1 0指定第一個work綁定第一個cpu核心
cpu-map 2 1指定第二個work綁定第二個cpu核心
nbthread 2指定haproxy的線程數量,默認每個進程一個線程

# utilize system-wide crypto-policies

ssl-default-bind-ciphers PROFILE=SYSTEM設置 HAProxy 監聽套接字(即接受客戶端連接的端口)的默認加密套件
ssl-default-server-ciphers PROFILE=SYSTEM設置 HAProxy 與后端服務器建立 SSL/TLS 連接時使用的加密套件

proxies配置

defaults默認配置項,針對以下的frontend、backend和listen生效
frontend前端servername,類似于Nginx的一個虛擬主機 server和LVS服務集 群
backend后端服務器組,類似于nginx的upstream和LVS中的RS服務器
listen將frontend和backend合并在一起配置
defaults配置

mode http

指定 HAProxy 處理HTTP 協議的流量

log global

繼承?global?段定義的日志配置

option httplog

記錄完整的 HTTP 日志

option dontlognull

忽略 “空請求” 或 “無意義請求” 的日志

option http-server-close

主動關閉服務器側的連接

option forwardfor except 127.0.0.0/8

在請求頭中插入?X-Forwarded-For(記錄客戶端真實 IP),但排除 127.0.0.0/8(本地回環地址)

option redispatch

當后端服務器故障時,自動將請求重新分發到其他健康服務器

retries 3

請求失敗時,最多重試3 次
timeout http-request 10s客戶端發送完整 HTTP 請求的超時(10 秒內未發完請求,直接斷開)
timeout queue 1m請求在 HAProxy 隊列中等待的超時(1 分鐘未分配到后端,返回 503)
timeout connect 10sHAProxy 與后端服務器建立連接的超時(10 秒未連接成功,判定后端故障)
timeout client 1m客戶端與 HAProxy 保持連接的超時(1 分鐘無數據交互,斷開客戶端連接)
timeout server 1mHAProxy 與后端服務器保持連接的超時(1 分鐘無數據交互,斷開后端連接)
timeout http-keep-alive 10sHTTP Keep-Alive 連接的空閑超時(10 秒無新請求,關閉連接)
timeout check 10s健康檢查的超時(10 秒未收到后端響應,判定服務器故障)

maxconn 3000

HAProxy 對后端服務器的最大并發連接數限制?


HAProxy算法

所有算法在主配置文件配置/etc/haproxy/haproxy.cfg

vim /etc/haproxy/haproxy.cfg ---編輯配置文件

靜態算法

static-rr---基于權重的輪詢調度

statick-rr?按照預先配置的順序和權重,將客戶端請求依次分配給后端服務器。當所有服務器都被分配一次后,算法會從頭開始循環

配置文件

訪問效果

first

first算法會按照服務器在配置文件中定義的順序,依次檢查每個服務器的狀態,優先選擇第一個可用的服務器,只有當服務器不可用時才會將流量分配至下一個服務器

配置文件內容:

實驗效果:

動態算法

roundrobin

roundrobin是一種經典且常用的動態負載均衡算法,其核心思想是按照順序循環的方式將請求分配到后端服務器,通過均衡分配流量來充分利用集群資源,會實時根據服務器的健康狀態調整分配策略(例如自動排除故障服務器)可利用socat動態調整權重

配置文件:

實驗效果:

leastconn

leastconn是一種基于后端服務器當前連接負載分配請求的動態負載均衡算法,核心思想是將新請求分配給當前活躍連接數最少的服務器,從而實現更精細化的負載均衡

支持權重的運行時調整和慢啟動,即:根據當前連接最少的后端服務器而非權重進行優先調度(新客戶 端連接)? 慢啟動是指當一臺服務器上線被檢測到后 haproxy服務器會少量的分配流量慢慢增大

配置文件:

實驗效果:

其他算法

source

source是一種通過客戶端源 IP 地址實現會話保持的經典策略。其核心邏輯是:對客戶端的源 IP 地址進行哈希計算,將結果映射到后端服務器集群中的某臺服務器,從而確保來自同一源 IP 的請求始終被轉發到同一臺后端服務器

配置文件:

實驗效果:

map-base 取模法

先對source地址進行hash計算,再基于服務器總權重的取模,最終結果決定將此請 求轉發至對應的后端服務器,如:有三臺后端服務器(索引分別0、1、2)若客戶的ip地址哈希值為5,則5%3=2 分配到索引為2的服務器 此方法是靜態的不支持動態調整權重且當有一臺服務器下線時會導致多臺客戶主機被調度的服務器發生改變,會導致會話丟失

一致性hash

一致性哈希算法可以解決map-base取模法的多個會話丟失的問題能夠確保當后端服務器數量發生變化時,只有少量請求會被重新路由,從而提高系統穩定性,其原理是將后端服務器的ip取模制成一個哈希環,再將客戶端的ip取模落在后端服務器哈希環上,客戶端在哈希環上經過逆時針找最近的后端服務器,這樣即使有服務器上線或者下線了也只會有少量的會話丟失

一致性哈希問題:當服務器過少時會導致服務器分布不理想,可通過虛擬節點使其分布均勻

uri

path

基于對用戶請求的URI的左半部分或整個uri做hash,再將hash結果對總權重進行取模后 根據最終結果將請求轉發到后端指定服務器 對/path;params進行哈希 相同的uri訪問同一臺后端服務器

配置文件:

后端服務器需要有對應文件進行測試測試結果:

url_param

url_param對用戶請求的url中的 params 部分中的一個參數key對應的value值作hash計算,并由服務器 總權重相除以后派發至某挑出的服務器,后端搜索同一個數據會被調度到同一個服務器

配置文件

測試結果

hdr取模法

基于請求頭(HTTP header,通過hdr指令獲取 )中的特定信息進行哈希取模運算,從而決定將請求轉發到哪一臺后端服務器

配置文件:

測試效果:

HAProxy的高級功能及配置

基于cookie值的會話保持

基于 Cookie 值的會話保持(也稱為 "粘性會話")是一種常用的負載均衡策略,確保來自同一客戶端的請求始終被路由到同一后端服務器,從而維護會話狀態的一致性。這種機制特別適用于不支持分布式會話的應用程序

配置文件:

測試結果:

HAProxy狀態頁

通過web界面,顯示當前HAProxy的運行狀態

狀態頁配置參數:

stats enable基于默認的參數啟用stats page
stats hide-version將狀態頁中haproxy版本隱藏
stats refresh?設定自動刷新時間間隔,默認不自動刷新
stats uri自定義stats page uri,默認值:/haproxy?stats
stats auth認證時的賬號和密碼,可定義多個用戶,每行指定一個用戶

狀態頁配置文件:

狀態頁內容

狀態頁參數

session rate(每秒的連接會話信息):
cur:每秒的當前會話數量 :
max:每秒新的最大會話數量 
limit:每秒新的會話限制量
sessions(會話信息):
cur:當前會話量
max:最大會話量
limit: 限制會話量
Total:總共會話量 
LBTot:選中一臺服務器所用的總時間 
Last:和服務器的持續連接時間 
Wght:權重
Bytes(流量統計): 
In:網絡的字節輸入總量 
Out:網絡的字節輸出總量 
Dwn:后端服務器連接后都是DOWN的數量
Denied(拒絕統計信息): 
Req:拒絕請求量 
Resp:拒絕回復量
Errors(錯誤統計信息):
Req:錯誤請求量
conn:錯誤鏈接量
Resp:錯誤響應量
Warnings(警告統計信息):
Retr:重新嘗試次數
Redis:再次發送次數
Server(real server信息):
Status:后端機的狀態,包括UP和DOWN
LastChk:持續檢查后端服務器的時間
Act:活動鏈接數量
Bck:備份的服務器數量
Chk:心跳檢測時間
Dwntme:總的downtime時間
Thrtle:server 狀態

IP透傳

四層IP透傳

hapeoxy配置文件:

后端服務器nginx配置文件

實驗效果:

訪問后查看日志

七層IP透傳使用http默認是開啟的

ACL

訪問控制列表ACL,是一種基于包過濾的訪問控制技術,它可以根據設定的條件對經過服務器傳輸的數據包進行過濾(條件匹配)即對接收到的報文進行匹配和過 濾,基于請求報文頭部中的源地址、源端口、目標地址、目標端口、請求方法、URL、文件后綴等信息內容進行匹配并執行進一步操作

ACL匹配規范

hdr_beg(<name>[, <occ>])? ?---匹配請求頭中指定字段值的開頭部分

hdr_end(<name>[, <occ>])??---匹配請求頭中指定字段值的結尾部分

hdr_dom(<name>[, <occ>]) ---域名部分匹配(帶子域名),主要用于 host

hdr_dir(<name>[, <occ>])?---路徑匹配(針對 URI)

hdr_len(<name>[, <occ>]) ---匹配請求頭字段值的長度

hdr_reg(<name>[, <occ>]) ---正則表達式匹配,自定義表達式(regex)模糊匹配

hdr_sub(<name>[, <occ>]) ---子串匹配,即字段值中包含某個子字符串即可

ACL匹配規則? ? ? ??
-i不區分大小寫
-m使用指定的正則表達式匹配方法
-n不做DNS解析
-u禁止acl重名,否則多個同名ACL匹配或關系
ACL操作符

整數比較

???????? eq(等于) ge(大于等于) gt(大于) le(小于等于) lt(小于)

字符比較

exact match完全一致才匹配
substring?match包含子串就匹配
suffix??match?結尾一致才匹配
prefix match開頭一致才匹配
subdir match按?/?分割,任意段匹配
domain match按?.?分割,任意段匹配
ACL示例實驗
基于域名匹配

haproxy配置文件:

實驗效果

基于源IP或子網調度訪問

haproxy配置文件:

實驗效果:

基于源地址的訪問控制

haproxy配置文件:

實驗效果:

基于瀏覽器類型

實驗效果

HAProxy四層負載

針對除HTTP以外的TCP協議應用服務訪問的應用場景

對MySQL四層負載示例:

在后端服務器下載mariadb-server

編輯配置文件(修改數據庫id為了觀察實驗效果)

haproxy配置文件:

實驗結果:

自定義錯誤頁面

可以指定錯誤時跳轉頁面

配置文件內容:

錯誤頁面文件內容將后端服務器關閉模擬錯誤

實驗效果:

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

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

相關文章

Android 的16 KB內存頁設備需要硬件支持嗎,還是只需要手機升級到Android15系統就可以

Android 的16 KB內存頁設備需要硬件支持嗎&#xff0c;還是只需要手機升級到Android15系統就可以&#xff1f; deepseek回答&#xff1a; DeepSeek R1 思考 3 秒 思考過程 好的&#xff0c;用戶現在問的是Android的16 KB內存頁設備是否需要硬件支持&#xff0c;還是只需要升級到…

相機內外參矩陣:從3D世界坐標到2D像素坐標變換

相機內外參矩陣&#xff1a;從3D世界坐標到2D像素坐標變換介紹**1. 內參矩陣&#xff08;Intrinsic Matrix, K&#xff09;****2. 外參矩陣&#xff08;Extrinsic Matrix, [R|t]&#xff09;****3. 完整投影過程&#xff08;世界坐標 → 像素坐標&#xff09;****步驟1&#xf…

哈希指針與數據結構:構建可信數字世界的基石

一、哈希指針的核心原理哈希指針是一種創新型數據結構&#xff0c;融合了傳統指針的定位功能與密碼學哈希的驗證能力&#xff1a;雙重功能&#xff1a;既存儲數據地址&#xff0c;又包含該數據的哈希值&#xff0c;實現數據定位與完整性驗證的統一。抗篡改機制&#xff1a;數據…

java實現一個方法,isTure則程序繼續往下,為false則return的鏈式寫法

以下是實現鏈式條件檢查的Java方法&#xff0c;采用函數式風格設計。代碼包含一個Chainable類&#xff0c;支持連續的check方法和多個終止操作&#xff08;如then, orElse等&#xff09;&#xff0c;滿足在條件為false時中斷鏈式調用并返回默認值的需求&#xff1a;import java…

數據結構學習之堆

本篇我們將學習新的數據結構——二叉樹。 作者的個人gitee&#xff1a;樓田莉子 (riko-lou-tian) - Gitee.com 目錄 樹的概念 樹形結構 非樹形結構 樹的相關術語 樹的表示 樹在實際生活上的應用 二叉樹 慢二叉樹 完全二叉樹 二叉樹的儲存結構 二叉樹的存儲結構 順序結構…

【csdn問答社區分析】前端開發熱點問題全解析

前端時間我在csdn問答社區的前端部分"視察”了一圈發現了大家的問題主要集中在以下方面一、框架與組件庫使用問題 Vue相關問題 組件化開發&#xff1a;如avue-crud組件自定義樣式不生效、el-select大數據分頁懶加載、element-plus表格動態列校驗等。功能實現&#xff1a;包…

Pycharm2025 安裝教程 免費分享 沒任何套路

Pycharm 安裝也是很簡單的&#xff0c;簡單過一下流程&#xff0c;如果需要的可以轉存下載到自己電腦上。我用夸克網盤分享了「pycharm2025」&#xff0c;復制鏈接瀏覽器打開轉存后即可下載。鏈接&#xff1a;https://pan.quark.cn/s/4bb74a939332備注&#xff1a;附帶2023-202…

Javaweb————什么是超文本傳輸協議?

&#x1f3cd;?&#x1f3cd;?&#x1f3cd;?引言&#xff1a;什么是協議&#xff1f; 協議是一種約定&#xff0c;規定好一種信息的格式&#xff0c;如果發送方按照這種請求格式發送信息,那么接 收端就要按照這樣的格式解析數據,否則就會出錯&#xff0c;這就是協議 常用協…

UniappDay03

1.熱門推薦-準備工作// 用defineProps獲取頁面參數,query const query defineProps<{type: string }>() const currHot hotMap.find((v) > v.type query.type) // 動態設置標題 uni.setNavigationBarTitle({ title: currHot!.title }) </script>2.獲取熱門推…

基于動態增強的 LLM 置信度方法研究

基于動態增強的 LLM 置信度方法研究 一、引言(Introduction) 大型語言模型(LLM)的性能提升高度依賴于對模型內部表征的精準調控 —— 表征工程通過優化模型中間層隱藏狀態的傳遞規律,能夠在不改變模型參數的前提下顯著提升任務適應性(Wei et al., 2022)。當前主流方法中…

ComfyUI中運行Wan 2.1工作流,電影級視頻,兼容Mac Windows

魔當(LM Downloader)是一個大模型應用下載工具 &#xff0c;目前 魔當 已經支持ComfyUI下載Wan 2.1視頻模型。 魔當下載地址 https://seemts.com/ 先看生成效果 原始圖片&#xff0c;你可以保存到自己電腦上測試 生成視頻&#xff1a; 推薦提示詞&#xff1a; A futurist…

CentOS 7 Linux 用 yum 安裝 Docker,含 Docker 鏡像無法拉取問題(即 docker pull 失敗)的解決方案

CentOS 7 Linux 用 yum 安裝 Docker,含 Docker 鏡像無法拉取問題(即 docker pull 失敗)的解決方案 本文對應的講解視頻鏈接:https://www.bilibili.com/video/BV1C48wzqE6T/ 文章目錄 CentOS 7 Linux 用 yum 安裝 Docker,含 Docker 鏡像無法拉取問題(即 docker pull 失敗…

XML的簡略知識點

文章目錄1. 基本概念2. 基本語法3. 示例4. 相關技術5. 應用場景XML&#xff08;可擴展標記語言&#xff09;是一種用于存儲和傳輸數據的標記語言&#xff0c;核心特點是可擴展性和自我描述性。以下是其核心知識點&#xff1a; 1. 基本概念 用途&#xff1a;主要用于數據的存儲…

RustDesk 完整部署教程:支持 Web 管理后臺和網頁客戶端遠程,保姆級教學來了!

RustDesk API本項目使用 Go 實現了 RustDesk 的 API&#xff0c;并包含了 Web Admin 和 Web 客戶端。RustDesk是一個遠程桌面軟件&#xff0c;提供了自托管的解決方案&#xff0c;官方API是收費的&#xff0c;這次咱們用到的是Github開源的第三方API源碼。?特性PC端API支持 …

??GOFLY LIVE CHAT:Golang製オープンソース?ライブチャットシステム?

以下是為日本技術受眾優化的日語版介紹文章&#xff0c;采用IT行業慣用術語和簡潔表達&#xff1a; ??GOFLY LIVE CHAT&#xff1a;Golang製オープンソース?ライブチャットシステム?? ??現代的なカスタマーサポートのための高性能ソリューション?? GOFLY LIVE CHATは…

ISIS GR實驗案例

一、實驗拓撲路由器R1和R2都為雙主控設備&#xff0c;主用板和備用板間形成備份關系。路由器間通過IS-IS協議實現網絡互連&#xff0c;并提供GR機制。要求當R1通過GR方式重啟IS-IS進程或者進行主備倒換時轉發不中斷。1、基礎配置AR1 system sysname AR1 int g 0/0/0 ip add 10.…

智慧農業病蟲害識別準確率↑32%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析&#xff0c;核心技術參數與架構設計引用自《陌訊技術白皮書》&#xff0c;禁止未經授權的轉載與篡改。一、行業痛點&#xff1a;智慧農業的識別困境智慧農業中&#xff0c;作物病蟲害的精準識別是實現精準植保的核心&#xff0c;但田間復雜環境始終…

# JsSIP 從入門到實戰:構建你的第一個 Web 電話

前言 歡迎來到實時通信&#xff08;Real-Time Communication, RTC&#xff09;的世界&#xff01;如果你是一名 JavaScript 開發者&#xff0c;渴望讓你的 Web 應用擁有語音通話、視頻聊天甚至即時消息的能力&#xff0c;那么你來對地方了。這本書是為你量身打造的指南&#x…

【RHCSA 問答題】第 12 章 安裝和更新軟件包

目錄什么是 RPM&#xff1f;dnf 是什么&#xff0c;它和 rpm 有什么聯系和區別&#xff1f;如何設置禁止直接遠程登錄 root 賬戶&#xff1f;RHEL 中如何做才能啟用對第三方存儲庫的支持&#xff1f;怎么理解 RHEL9 中的應用流(Application Streams)和模塊(Modules)&#xff1f…

GEO優化實戰:如何在DeepSeek、豆包等AI平臺搶占推薦位?

在當今競爭激烈的 AI 領域&#xff0c;GEO 優化在搶占 AI 平臺推薦位上的重要性日益凸顯。各大平臺都在為優質內容和企業爭取更好的展示機會&#xff0c;與此同時&#xff0c;一個現象引發了眾人關注&#xff1a;眾多企業大力推薦天津誠智未來公司&#xff0c;這背后究竟隱藏著…