Ubuntu 安裝 HAProxy

HAProxy 是什么

HAProxy(High Availability Proxy) 是一個 高性能、高可用的 TCP 和 HTTP 負載均衡器與代理服務器。

HAProxy 的特點

特性說明
支持協議HTTP、HTTPS、TCP
高性能使用 C 語言編寫,性能極高
高可用與 Keepalived 配合可實現主備
健康檢查實時檢查后端服務器是否存活
連接控制支持并發限制、超時設置、連接數控制等
日志與監控提供詳細日志,便于排錯和監控

HAProxy vs Nginx 區別

對比項HAProxyNginx
核心定位專業負載均衡器Web服務器 + 反向代理
支持協議TCP、HTTP、HTTPS(L4 + L7)HTTP、HTTPS、郵件協議(L7)
處理靜態內容不支持支持(可直接做 Web Server)
性能表現高并發、大連接場景更強中等并發性能良好
健康檢查能力強,支持高級健康檢查支持基本健康檢查
配置復雜度專注負載均衡,配置清晰功能豐富,配置復雜多變
狀態監控界面內置強大狀態統計頁有但功能簡單
模塊機制無法動態加載模塊支持動態模塊
主流應用金融、電商、大型高可用架構Web服務、CDN、輕量負載均衡

HAProxy vs Nginx 使用場景

使用場景推薦方案原因說明
Web 網站負載均衡 + 靜態資源服務Nginx能代理、緩存、壓縮、處理靜態資源,適合前端站點
僅 TCP(如 MySQL、Redis)負載均衡HAProxy支持四層負載均衡,Nginx 無法代理純 TCP 連接
高并發反向代理(如 API 網關)HAProxy并發能力更強,適合海量 API 請求分發
高可用集群 + 主備 VIP 浮動HAProxy + Keepalived主從切換快,專用于高可用負載均衡
Kubernetes Ingress 網關Nginx社區插件多,原生支持 Ingress Controller
企業 Web 服務 + 頁面緩存優化Nginx支持 gzip、緩存、rewrite,適合前端
純粹做 Layer 7 負載均衡器(無文件處理)HAProxy更穩定、日志更清晰、健康檢查更強
小型應用或快速上線部署Nginx簡單易部署,配置靈活
帶狀態的健康檢查需求(如根據返回內容判活)HAProxy可配置返回碼、內容、腳本等高級判活規則

安裝 HAProxy

sudo apt-get update
sudo apt-get install -y haproxy

HAProxy 常用命令

查看?HAProxy 版本:haproxy -v

啟動 HAProxy:sudo systemctl start haproxy

停止 HAProxy:sudo systemctl stop haproxy

重啟 HAProxy:sudo systemctl restart haproxy

重新加載配置(不中斷連接):sudo systemctl reload haproxy

查看狀態:sudo systemctl status haproxy

開啟開機自啟動:sudo systemctl enable haproxy

禁用開機自啟動:sudo systemctl disable haproxy

檢查配置文件是否有語法錯誤:haproxy -c -f /etc/haproxy/haproxy.cfg

查看系統日志(包含 haproxy 日志):journalctl -u haproxy


查看所有運行狀態(需配置 stats socket):echo "show stat" | socat stdio /var/run/haproxy.sock

查看當前連接:echo "show info" | socat stdio /var/run/haproxy.sock

查看所有后端狀態:echo "show backend" | socat stdio /var/run/haproxy.sock

暫停某個后端服務器(server_name 為配置中的名稱):echo "disable server backend_name/server_name" | socat stdio /var/run/haproxy.sock

啟用某個后端服務器(server_name 為配置中的名稱):echo "enable server backend_name/server_name" | socat stdio /var/run/haproxy.sock


HAProxy 配置文件詳解

默認文件位置

sudo vim /etc/haproxy/haproxy.cfg

global:全局配置,影響整個 HAProxy 實例

global# 日志輸出地址,可設為 UNIX socket 或 IP:portlog /dev/log local0# 設置日志到遠程服務器# log 192.168.1.100:514 local0# 更改根目錄,提高安全性(只允許訪問該目錄)chroot /var/lib/haproxy# 指定 PID 文件路徑pidfile /var/run/haproxy.pid# 全局最大連接數(上限),限制資源使用maxconn 4096# 指定運行用戶user haproxy# 指定運行用戶組group haproxy# 讓 HAProxy 以守護進程方式運行(后臺)daemon# 啟用 stats socket 用于控制臺管理stats socket /var/run/haproxy.sock mode 600 level admin# 啟動進程數,一般為 1,(多核 CPU 可用,但需小心狀態同步)nbproc 1# 每個進程的線程數(多線程支持,需 HAProxy 2.0+),需結合 thread 關鍵字使用。nbthread 4 # 當前節點的名稱(用于 peers 同步)node haproxy-node-1

注意:

  • nbproc 的值大于 1 且不配置 peers:多進程不共享內存,stick-table 不同步,容易出錯
  • 不配置 stats socket:運行時不便調試和狀態查看
  • 不配置 log:失去調試能力,難以追蹤問題

defaults:默認配置,會被 frontend/backend/listen 使用

# 這些參數會被所有 frontend、backend 和 listen 塊自動繼承(除非這些塊中顯式覆蓋)
defaults# 工作模式:http、tcpmode http# 使用 global 中的日志設置log global# 使用專為 HTTP 設計的日志格式,tcplog: TCP 日志格式option httplog# 不記錄無數據連接日志option dontlognull# 連接后端超時時間timeout connect 5s# 客戶端空閑超時timeout client  50s# 服務端響應超時時間timeout server  50s# 請求頭超時 10 秒timeout http-request 10s# keep-alive 超時timeout http-keep-alive 10s# 最大并發連接數maxconn 2000 # 自動重試其他服務器option redispatch  # 重試次數retries 3# default-server [參數1] [參數n],為所有 backend server 統一指定默認屬性# inter 3s:每 3 秒進行一次健康檢查;rise 2:連續 2 次檢查通過視為“恢復”;fall 3:連續 3 次檢查失敗視為“宕機”;maxconn 100:單個服務器最多接受 100 個連接default-server inter 3s rise 2 fall 3 maxconn 100# default-bind [參數1] [參數n],指令為所有 frontend 或 listen 塊中未顯式定義 bind 的地方,統一設置綁定行為的默認參數# ssl:開啟 SSL 支持; crt /path/to/cert.pem:指定默認證書路徑; alpn h2,http/1.1:支持 HTTP/2 和 HTTP/1.1; ipv4 / ipv6:限定只綁定 IPv4 或 IPv6; transparent:用于 TPROXY 透明代理場景; defer-accept:延遲連接處理直到數據可讀,提高效率。default-bind ssl crt /etc/ssl/private/haproxy.pem alpn h2,http/1.1

注意:

  • 忘寫 mode:容易導致行為異常(默認是 TCP)
  • 忽略超時參數:會導致連接懸掛或資源被耗盡
  • 使用 HTTP 卻沒有 option httplog:日志中缺失請求詳情
  • 不加 timeout http-request:防止慢速 HTTP 攻擊時不生效
  • 不了解繼承機制:容易在 frontend 或 backend 中重復配置

frontend:前端,接收客戶端請求

frontend 塊用于定義 接收客戶端請求的入口,可以指定監聽的 IP、端口、協議,并將請求轉發到某個后端(backend)或做更復雜的路由處理,匹配請求(基于 URL、Host、IP、Header、方法等)。frontend = “入口”,backend = “出口(服務端池)”

# http_front:是 frontend 的自定義名稱
frontend http_front## 監聽所有 IP 上的端口/地址,如 *:80bind *:80## 監聽 443 端口,使用 SSL 證書 /etc/ssl/private/haproxy.pem# bind *:443 ssl crt /etc/ssl/private/haproxy.pem## 指定工作模式為 HTTP,選項有 HTTP|TCPmode http## 默認轉發到后端名為 http_back 的服務器池default_backend http_back## 訪問控制規則,支持多種判斷(如路徑、頭部、IP)acl is_static path_end .jpg .png .css .js## 根據 ACL 條件使用不同后端use_backend static_back if is_static

注意:

  • 忘寫 mode http:會使 HTTP 規則無法生效,表現異常
  • 多個 bind 不同端口未區分流量:建議使用 ACL 區分請求類型
  • 忽略 http-request 控制:限流、重定向、拒絕請求功能缺失
  • 日志無記錄的話:確保配置了 log global 和 option httplog

backend:后端,定義服務器組和轉發策略

backend 是用來定義 后端服務器池 的模塊,負責處理前端 (frontend) 或中間路由轉發過來的請求。你可以在 backend 中指定多個真實服務節點(server),并配置負載均衡方式、健康檢查等參數。

# http_back:是 backend 的自定義名稱
backend http_back## 負載均衡策略,選項如下:# roundrobin:輪詢,默認方式,平均分配請求。適用于大多數場景。# leastconn:優先分配給當前連接數最少的服務器。適合長連接(如數據庫、API)場景。# source:根據客戶端 IP 哈希,保持同一客戶端請求固定落到一臺服務器(會話保持)。# uri [option]:根據請求 URI 哈希,常用于靜態資源緩存場景。# url_param <param>:根據 URL 中指定的參數值做哈希。例如 ?id=123 中的 id。# hdr(<name>):根據指定 HTTP 頭做哈希,如:hdr(User-Agent)。# rdp-cookie <cookie_name>:僅用于 TCP 模式 + RDP 協議,根據 RDP cookie 實現持久會話。# random [draws N]:隨機選擇一臺服務器(可選多次抽樣,選最優)# first(僅限 backup 服務器):優先選擇第一臺健康的服務器balance roundrobin## 健康檢查路徑option httpchk GET /health## 健康檢查響應狀態碼要求http-check expect status 200## 給所有 server 設置默認參數# default-server [參數1] [參數n]## 定義服務器,格式:<name> <IP>:<port> [check] [backup]# check:開啟健康檢查# backup:作為備用服務器# weight:權重# resolvers:使用 DNS 解析器,mydns:解析器的名字server web1 192.168.1.10:80 weight 3 checkserver web2 192.168.1.11:80 weight 1 check backup resolvers mydns## 	修改請求頭、添加路由規則等。# http-request# tcp-request## 配合 frontend 實現會話保持(IP、cookie等)# stick-table## 會話保持策略# cookie## 連接超時時間# timeout connect## 服務響應超時時間# timeout server

注意:

  • 會話丟失的話:使用 cookie 或 stick-table 保持 session
  • 后端負載不均:優化 balance 策略(如 leastconn)
  • 連接超時:設置合理的 timeout server 和 timeout connect
  • 后端節點不健康:檢查 option httpchk 是否配置正確
  • 不支持 HTTPS 后端的話:加上 ssl verify none 讓 HAProxy 與后端走 TLS

listen:同時定義 frontend 和 backend 的組合配置(簡寫方式)

listen 是一個組合塊,將 frontend(接收請求)和 backend(轉發處理)合并在一起,適合簡單場景或 TCP 代理場景,比如 MySQL、Redis、FTP、SMTP 等服務的負載均衡。

# admin_stats:是 listen 的自定義名稱
listen admin_stats# 監聽端口或地址,如 *:80bind *:8080# 工作模式:http、tcpmode http## 最大連接數maxconn 1000## 啟用日志記錄(需配置 syslog)log global## 啟用的日志格式,httplog|tcplogoption tcplog## 負載均衡算法balance roundrobin## 啟用基于 Cookie 的會話保持cookie SRV insert indirect	## 粘性表(用于限流、IP 綁定)stick-table## 根據某字段粘性會話stick on src## 啟用狀態頁面stats enable## 設置訪問路徑stats uri /haproxy?stats## 設定登錄提示標題	stats realm Haproxy\ Stats## 設置訪問認證stats auth admin:admin## 刷新頻率stats refresh 10s

注意:

  • 復雜路由邏輯:用 frontend + backend 更清晰
  • 日志無輸出:添加 log global 和 option httplog
  • 會話粘性失敗:檢查 cookie 名稱、參數一致性
  • 無監控界面:添加 stats 相關配置

peers:多節點之間的同步(如 stick-table)

peers 是 HAProxy 中用于配置多實例之間的狀態同步的模塊,常用于多個 HAProxy 節點之間同步 stick-table(會話表) 數據,從而實現集群中“共享狀態”。如:源 IP 的請求頻率(防護 DDOS、限流),用戶會話保持,自定義統計(登錄失敗次數等)。

stick-table 是 HAProxy 用來在運行時追蹤客戶端狀態的數據結構(例如追蹤 IP 的連接數、請求數、失敗數等)。這對于防止 DDoS、暴力破解、限流、會話保持非常有用。

# group_name 同步組名(多個節點使用相同組名以便互相同步)
peers <group_name># <本機名> 必須與當前 HAProxy 啟動時的 -L <name> 參數一致(或 global 中的 node <name>)peer <本機名> <本機IP>:<端口>peer <其他節點名> <其他IP>:<端口>

注意:

  • 所有節點都必須有相同的 peers 配置(節點名字可不同)?? ?
  • peer 名稱必須唯一且不能是當前機器的名稱?? ?
  • 每臺機器的 bind 地址和 peer 中配置的 IP 要匹配?? ?
  • peers 同步是雙向的,每臺都要監聽端口?? ?
  • 用于高可用部署(主-主同步),不適用于主-備場景?? ?
  • stick-table 配置中的 peers <name> 不能漏掉

resolvers:自定義 DNS 解析器

resolvers 用于配置 DNS 解析器,使 HAProxy 能動態解析和刷新服務器的 IP 地址。默認情況下,HAProxy 啟動時只解析一次 DNS,如果沒有配置 resolvers,域名解析不會動態更新。
這對于以下場景尤其重要:

  • 后端服務器 IP 可能變動(比如后端是 Kubernetes Pod、云主機、容器)
  • 使用主機名作為后端地址(如 server web1 app.example.com:80)
# 自定義一個resolvers 名稱,名稱可在 server 行中引用
resolvers mydns# 設置 DNS 服務器nameserver dns1 8.8.8.8:53nameserver dns2 8.8.4.4:53# 解析重試次數resolve_retries 3# 重試超時時間timeout retry 1s# 超時時間timeout resolve 1s# 解析結果緩存多久hold valid 10s## 對 NXDOMAIN 響應的緩存時間hold nx 30s## 其它響應(如 SERVFAIL)的緩存時間hold other 30s	## 拒絕響應的緩存時間hold refused 30s	## 超時響應的緩存時間hold timeout 30s## DNS 響應最大數據包(默認 512)accepted_payload_size 8192	## 使用 /etc/resolv.conf 中的配置(僅 Linux)parse-resolv-conf 

?注意:

  • 必須指定 resolvers 才能解析主機名(否則啟動報錯)?? ?
  • 建議設置合理的 hold valid,避免頻繁解析?? ?
  • 使用多個 nameserver 做冗余,提升穩定性?? ?
  • 支持 SRV 和 A/AAAA 查詢(需設置 init-addr 參數)

userlist:用戶認證列表

userlist 用于定義用戶名和密碼列表,它相當于一個“認證數據庫”,本地內置用戶名+密碼信息,HAProxy 直接驗證請求。主要用于:

  • HTTP Basic 認證(常見于管理頁面、監控接口保護)
  • 配合 acl 使用,實現訪問控制
  • 可用于結合 stats 頁面進行訪問限制
userlist <名稱>user <用戶名1> password <明文密碼>user <用戶名2> insecure-password <明文密碼>user <用戶名3> encrypted-password <加密后的密碼(推薦使用 bcrypt)>

注意:

  • 不支持動態用戶加載,必須在啟動時寫死?? ?
  • 密碼推薦使用加密格式(SHA-256/512 或 bcrypt)?? ?
  • userlist 只在 HAProxy 本地生效,不能對接 LDAP 或外部認證?? ?
  • 支持多個 userlist,可按需引用

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

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

相關文章

Mysql--基礎知識點--91.2--processlist

在 MySQL 中&#xff0c;SHOW PROCESSLIST 是一個常用命令&#xff0c;用于查看當前數據庫服務器上所有正在運行的線程&#xff08;進程&#xff09;信息。以下是關鍵點說明&#xff1a; 1. 命令用法 SHOW FULL PROCESSLIST;輸出字段&#xff1a; 列名含義Id線程唯一標識符&am…

Git標簽刪除腳本解析與實踐:輕松管理本地與遠程標簽

Git 標簽刪除腳本解析與實踐:輕松管理本地與遠程標簽 在 Git 版本控制系統中,標簽常用于標記重要的版本節點,方便追溯和管理項目的不同階段。隨著項目的推進,一些舊標簽可能不再需要,此時就需要對它們進行清理。本文將通過一個完整的腳本,詳細介紹如何刪除本地和遠程的 …

K8S - Harbor 鏡像倉庫部署與 GitLab CI 集成實戰

引言 在 Kubernetes 環境中&#xff0c;容器鏡像的存儲與管理至關重要。企業級鏡像倉庫&#xff08;如 Harbor&#xff09;為團隊提供了安全、穩定、可擴展的鏡像管理解決方案。 一、Harbor 安裝與配置 Harbor 是由 VMware 開源的企業級云原生鏡像倉庫&#xff0c;它不僅支持…

2025年best好用的3dsmax插件和腳本

copitor 可以從一個3dsmax場景里將物體直接復制到另一個場景中 Move to surface 這個插件可以將一些物體放到一個平面上 instancer 實體器&#xff0c;舉例&#xff1a;場景中有若干獨立的光源&#xff0c;不是實體對象&#xff0c;我們可以使用instancer將他變成實體。 paste …

Python爬蟲實戰:研究nodejs aes加密

1. 引言 1.1 研究背景與意義 在當今數字化時代,Web 數據的價值日益凸顯。通過爬蟲技術獲取公開數據并進行分析,能夠為企業決策、學術研究等提供有力支持。然而,為了保護數據安全和隱私,許多網站采用了加密技術對數據進行保護,其中 AES 加密是一種常見且安全的加密算法。…

LGDRL:基于大型語言模型的深度強化學習在自動駕駛決策中的應用

《Large Language Model guided Deep Reinforcement Learning for Decision Making in Autonomous Driving》2024年12月發表&#xff0c;來自北理工的論文。 深度強化學習&#xff08;DRL&#xff09;在自動駕駛決策方面顯示出巨大的潛力。然而&#xff0c;由于DRL的學習效率低…

TDEngine 與 Grafana

目錄 實踐目錄 Grafana 參考文檔 實踐目錄 10.60.100.194&#xff1a;/home/dualven/tdengine Grafana systemctl status grafana-server http://10.60.100.194:3000/ 這個端口與mydoor的new server服務沖突 &#xff08;同時只開一個&#xff09; 參考文檔 運行監…

Edge瀏覽器打開PDF文件顯示空白(每次需要等上一會)

概述 部分pdf文件用edge瀏覽器打開顯示空白&#xff0c;需要等一會才能顯示出來&#xff0c;這很讓人難以接受&#xff0c;用其他瀏覽器和pdf閱讀器打開是正常的&#xff0c;該怎么操作解決&#xff0c;卸載重裝&#xff0c;修復&#xff0c;重置瀏覽器等都無效。 解決辦法 可…

uniapp小程序輪播圖高度自適應優化詳解

在微信小程序開發過程中&#xff0c;輪播圖組件(swiper)是常用的UI元素&#xff0c;但在實際應用中經常遇到高度不匹配導致的空白問題。本文詳細記錄了一次輪播圖高度優化的完整過程&#xff0c;特別是針對固定寬高比圖片的精確適配方案。 問題背景 在開發"零工市場&quo…

Android第三次面試總結之網絡篇補充

一、網絡模型&#xff1a;OSI 七層 vs TCP/IP 四層&#xff08;必考點&#xff09; 1. 分層模型對比 OSI 七層模型TCP/IP 四層模型核心功能Android 相關場景應用層&#xff08;7 層&#xff09;應用層定義數據格式&#xff08;HTTP/HTTPS/FTP/API&#xff09;OkHttp/Retrofit…

postgresql主從集群一鍵搭建腳本分享

腳本1&#xff1a; cat pg_ms_install.sh #!/bin/bash # 基礎環境配置&#xff08;保持不變&#xff09; setenforce 0 >/dev/null 2>&1 || true sed -i "s/SELINUXenforcing/SELINUXdisabled/" /etc/selinux/config systemctl stop firewalld >/dev/n…

LWIP的ICMP協議

ICMP協議簡介 ICMP協議是一個網絡層協議 背景&#xff1a;如果丟包了&#xff0c;IP協議并不能通知傳輸層是否丟包以及丟包的原因。因此我們需要ICMP協議來完成這樣的功能 為什么需要ICMP協議 1&#xff0c;IP 協議本身不提供差錯報告和差錯控制機制來保證數據報遞交的有效…

具身智能機器人開源陪跑計劃(機器人實戰落地)

Who&#xff1a;我們是誰&#xff1f; 主理人背景 華南理工大學碩士畢業&#xff0c;10年機器人研發經驗&#xff0c;5年“互聯網機器人”創業經歷 累計牽頭落地的機器人30多款&#xff0c;累計授權專利80余項&#xff0c;累計論文發表10余篇。 技術履歷 C#、Sql server、SPSS…

Dify 配置網絡爬蟲為知識庫數據來源 (以Jina Reader為例) - 隨筆

API獲取 進入官網獲取免費的API密鑰 官網鏈接&#xff1a;https://jina.ai/reader/ 點擊“<> API”按鈕 點擊復制文本框中的API Key&#xff1a; 進入Dify的知識庫頁面 → 選擇“同步自Web站點” → 選擇“Jina Reader” → 點擊“配置”按鈕 選擇數據來源為Jina …

基于網絡爬蟲+Spark+Hadoop等大數據和SpringBoot技術實現的的汽車行業大數據分析與可視化平臺系統(源碼+論文+PPT+部署文檔教程等)

博主介紹&#xff1a;CSDN畢設輔導第一人、全網粉絲50W,csdn特邀作者、博客專家、騰訊云社區合作講師、CSDN新星計劃導師、Java領域優質創作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和學生畢業項目實戰,高校老師/講師/同行前輩交流? 技術范圍…

React學習路線圖-Gemini版

前端開發學習路線圖 (針對編程新手&#xff0c;主攻 React 框架) 總原則&#xff1a;先打好地基&#xff0c;再蓋樓。 無論學習哪個框架&#xff0c;扎實的 HTML、CSS 和 JavaScript 基礎是成功的關鍵。React 是基于 JavaScript 構建的&#xff0c;所以深入理解 JS 至關重要。…

空間計算:開啟人機交互新紀元的下一代技術范式

引言 當蘋果CEO蒂姆庫克在2023年WWDC大會上宣布Apple Vision Pro將引領“空間計算時代”時&#xff0c;這一宣言不僅標志著技術范式的迭代&#xff0c;更預示著一場融合虛實世界的革命已悄然來臨。 空間計算&#xff08;Spatial Computing&#xff09;作為連接物理世界與數字…

大語言模型訓練的兩個階段

先說結論&#xff1a;第一階段在云平臺訓練至收斂 第二階段本地GPU微調 一、階段劃分的核心邏輯 階段目標資源特點典型耗時占比成本敏感度預訓練獲取通用表征能力需要大規模分布式計算70-90%高&#xff08;追求每美元算力&#xff09;微調適配特定任務需要領域數據安全/低延遲…

【AI News | 20250512】每日AI進展

AI Repos 1、UI-TARS UI-TARS-1.5 是字節跳動開源的多模態智能體&#xff0c;基于強大的視覺語言模型構建&#xff0c;通過強化學習實現高級推理&#xff0c;顯著提升了在虛擬世界中執行多樣化任務的能力和適應性。相較前期模型&#xff0c;1.5 版本在 OSWorld、Windows Agent…

[git]如何關聯本地分支和遠程分支

主題 本文總結如何關聯git本地分支和遠程分支的相關知識點。 詳情 查看本地分支 git branch 查看遠程分支 git branch -r 查看所有分支(本地遠程) git branch -a 查看本地分支及其關聯的遠程分支(如有) git branch -vv 關聯本地分支到遠程分支&#xff1a; git branch …