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.mzph.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 …