HAProxy 部署与配置详细笔记
一、实验环境规划
| 编号 | 主机 | IP 地址 | 部署软件 | 操作系统 | 角色 |
|---|---|---|---|---|---|
| 1 | lb01 | 192.168.72.100 | HAProxy | RedHat 9.7 | 负载均衡器 |
| 2 | web1 | 192.168.72.10 | Nginx | RedHat 9.7 | 后端 Web 服务器 1 |
| 3 | web2 | 192.168.72.20 | Nginx | RedHat 9.7 | 后端 Web 服务器 2 |
二、Web 节点(web1/web2)部署
2.1 系统初始化脚本(init_sys.sh)
脚本功能:设置主机名、关闭 SELinux / 防火墙、配置静态 IP,需以 root 权限运行。
#!/bin/bash
# useage: sudo ./init_sys.sh <hostname> <ip_address> [gateway] [dns]
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "此脚本必须以root权限运行"
exit 1
fi
}
usage() {
echo "用法: $0 <hostname> <ip_address> [gateway] [dns_servers]"
echo ""
echo "参数说明:"
echo " hostname 要设置的主机名"
echo " ip_address 要设置的静态IP地址 (如: 192.168.72.100)"
echo " gateway 网关地址 (如: 192.168.72.2)"
echo " dns_servers DNS服务器,逗号分隔 (可选,默认: 8.8.8.8,223.5.5.5)"
echo ""
echo "示例:"
echo " $0 myserver 192.168.72.100 192.168.72.2 8.8.8.8,223.5.5.5"
echo " $0 webserver 10.0.0.50"
exit 1
}
get_interface() {
# 尝试获取第一个活动的非环回接口
local interface=$(ip route | grep default | head -1 | awk '{print $5}' 2>/dev/null)
if [[ -z "$interface" ]]; then
# 如果没有默认路由,获取第一个非环回接口
interface=$(ip link show | grep -v lo | grep 'state UP' | head -1 | awk -F': ' '{print $2}')
fi
if [[ -z "$interface" ]]; then
log_error "无法自动检测网络接口"
read -p "请输入网络接口名称 (如: eth0, ens160): " interface
fi
echo "$interface"
}
set_hostname() {
local hostname=$1
log_info "正在设置主机名为: $hostname"
/usr/bin/hostnamectl set-hostname $hostname
log_info "主机名设置完成"
}
close_selinux_firewalld() {
log_info "关闭selinux"
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
log_info "关闭防火墙"
/usr/bin/systemctl disable --now firewalld
}
set_static_ip() {
local interface=$(get_interface)
local ip=$1
local gateway=${2:-"192.168.72.2"}
local dns=${3:-"223.5.5.5,8.8.8.8"}
log_info "正在为接口 $interface 配置静态IP: $ip"
nmcli c modify $interface ipv4.method manual ipv4.addresses $ip/24 ipv4.gateway $gateway ipv4.dns $dns connection.autoconnect yes
nmcli c up $interface
}
main() {
if [[ $# -lt 2 ]]; then
usage
fi
check_root
set_hostname "$1"
close_selinux_firewalld
set_static_ip "$2" "$3" "$4"
}
main "$@"
脚本代码逐行解释
注意:在修改ip时,以上nmcli c modify 在接收到ip格式不规范时会主动报错,重新执行脚本就行,如果是使用先删除原本网卡在重新连接网卡的办法,输入不规范ip依旧会执行然后虚拟机会丢失ip,因为网卡被删除,所以这种写法还要加一个ip规范检测的函数。
#!/bin/bash # 声明脚本解释器为bash
# useage: sudo ./init_sys.sh <hostname> <ip_address> [gateway] [dns]
# 脚本使用说明注释,提示参数格式
# 定义颜色常量,用于日志输出格式化
RED='\033[0;31m' # 红色(错误日志)
GREEN='\033[0;32m' # 绿色(信息日志)
YELLOW='\033[1;33m' # 黄色(警告日志)
NC='\033[0m' # 重置颜色(恢复默认终端样式)
# 定义日志输出函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1" # 输出绿色[INFO]前缀的信息日志
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1" # 输出黄色[WARN]前缀的警告日志
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1" # 输出红色[ERROR]前缀的错误日志
}
# 检查是否为root权限运行
check_root() {
if [[ $EUID -ne 0 ]]; then # EUID为0表示root用户
log_error "此脚本必须以root权限运行"
exit 1 # 非root则退出脚本,返回错误码1
fi
}
# 脚本使用说明函数(参数不足时调用)
usage() {
echo "用法: $0 <hostname> <ip_address> [gateway] [dns_servers]" # 输出用法格式
echo ""
echo "参数说明:"
echo " hostname 要设置的主机名"
echo " ip_address 要设置的静态IP地址 (如: 192.168.72.100)"
echo " gateway 网关地址 (如: 192.168.72.2)"
echo " dns_servers DNS服务器,逗号分隔 (可选,默认: 8.8.8.8,223.5.5.5)"
echo ""
echo "示例:"
echo " $0 myserver 192.168.72.100 192.168.72.2 8.8.8.8,223.5.5.5"
echo " $0 webserver 10.0.0.50"
exit 1 # 输出用法后退出脚本
}
# 自动检测网络接口函数
get_interface() {
# 第一步:尝试从默认路由获取活动接口(优先有外网访问的接口)
local interface=$(ip route | grep default | head -1 | awk '{print $5}' 2>/dev/null)
# ip route:查看路由表;grep default:过滤默认路由;head -1:取第一条;awk '{print $5}':提取接口名;2>/dev/null:屏蔽错误输出
if [[ -z "$interface" ]]; then # 如果未获取到默认路由接口
# 第二步:获取第一个非环回且UP状态的接口
interface=$(ip link show | grep -v lo | grep 'state UP' | head -1 | awk -F': ' '{print $2}')
# ip link show:查看所有网络接口;grep -v lo:排除环回接口;grep 'state UP':过滤启动的接口;awk -F': ' '{print $2}':按冒号分割提取接口名
fi
if [[ -z "$interface" ]]; then # 仍未获取到接口时手动输入
log_error "无法自动检测网络接口"
read -p "请输入网络接口名称 (如: eth0, ens160): " interface
fi
echo "$interface" # 输出最终获取的接口名
}
# 设置主机名函数
set_hostname() {
local hostname=$1 # 接收第一个参数作为主机名
log_info "正在设置主机名为: $hostname"
/usr/bin/hostnamectl set-hostname $hostname # 永久设置主机名(重启生效)
log_info "主机名设置完成"
}
# 关闭SELinux和防火墙函数
close_selinux_firewalld() {
log_info "关闭selinux"
setenforce 0 # 临时关闭SELinux(当前会话生效)
sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
# 永久修改SELinux配置:将enforcing(强制)改为permissive(宽容模式),需重启生效
log_info "关闭防火墙"
/usr/bin/systemctl disable --now firewalld
# disable:禁止开机自启;--now:立即停止防火墙服务
}
# 配置静态IP函数
set_static_ip() {
local interface=$(get_interface) # 获取网络接口名
local ip=$1 # 静态IP地址(必传参数)
local gateway=${2:-"192.168.72.2"} # 网关(默认192.168.72.2)
local dns=${3:-"223.5.5.5,8.8.8.8"} # DNS服务器(默认阿里+谷歌DNS)
log_info "正在为接口 $interface 配置静态IP: $ip"
# 使用nmcli配置静态IP(NetworkManager工具)
nmcli c modify $interface \
ipv4.method manual \ # IP获取方式改为手动(静态)
ipv4.addresses $ip/24 \ # 设置IP和子网掩码(/24=255.255.255.0)
ipv4.gateway $gateway \ # 设置网关
ipv4.dns $dns \ # 设置DNS服务器
connection.autoconnect yes # 开启自动连接
nmcli c up $interface # 重启网络连接使配置生效
}
# 脚本主函数(逻辑入口)
main() {
if [[ $# -lt 2 ]]; then # 检查参数数量,至少需要主机名和IP两个参数
usage # 参数不足则调用用法说明函数
fi
check_root # 检查root权限
set_hostname "$1" # 调用设置主机名函数(第一个参数)
close_selinux_firewalld # 关闭SELinux和防火墙
set_static_ip "$2" "$3" "$4" # 配置静态IP(IP、网关、DNS参数)
}
main "$@" # 执行主函数,传递所有命令行参数
脚本执行方式
# web1节点执行示例(需root权限)
sudo ./init_sys.sh web1 192.168.72.10 192.168.72.2 223.5.5.5,8.8.8.8
# web2节点执行示例
sudo ./init_sys.sh web2 192.168.72.20 192.168.72.2 223.5.5.5,8.8.8.8
2.2 安装并配置 Nginx
1. 安装 Nginx
[root@web1 ~]# dnf install nginx -y
# dnf:RedHat 9默认包管理器;install nginx:安装nginx包;-y:自动确认所有提示
2. 修改 Nginx 欢迎页
[root@web1 ~]# echo "$(hostname) $(hostname -I)" > /usr/share/nginx/html/index.html
# $(hostname):获取当前主机名;$(hostname -I):获取主机IP地址;>:覆盖写入Nginx默认首页
# 效果:访问首页时显示"web1 192.168.72.10"(web2节点显示"web2 192.168.72.20")
3. 创建健康检测页面
[root@web1 ~]# echo "health" > /usr/share/nginx/html/test.html
# 创建test.html文件,内容为"health",用于HAProxy检测后端节点是否存活
4. 启动 Nginx 服务
[root@web1 ~]# systemctl start nginx
# systemctl start:启动服务;nginx:目标服务名
5. 验证 Nginx 访问
[root@web1 ~]# curl localhost
# curl:模拟HTTP请求;localhost:本地回环地址,测试Nginx本地访问
# 输出:web1 192.168.72.10
[root@web1 ~]# curl 192.168.72.10
# 测试通过IP地址访问Nginx,验证网络可达性
# 输出:web1 192.168.72.10
三、HAProxy 节点(lb01)部署
3.1 系统初始化
执行与 Web 节点相同的初始化脚本,设置主机名和静态 IP:
sudo ./init_sys.sh lb01 192.168.72.100 192.168.72.2 223.5.5.5,8.8.8.8
3.2 安装 HAProxy
[root@lb01 ~]# dnf install haproxy -y
# 安装HAProxy包,-y自动确认
3.3 验证 HAProxy 版本
[root@lb01 ~]# haproxy -v
# -v:查看HAProxy版本信息
# 输出示例:
# HAProxy version 2.8.14-c23fe91 2025/01/29 - https://haproxy.org/
# Status: long-term supported branch - will stop receiving fixes around Q2 2028.
# Known bugs: http://www.haproxy.org/bugs/bugs-2.8.14.html
# Running on: Linux 5.14.0-611.5.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Oct 17 14:16:35 EDT 2025 x86_64
3.4 查看 HAProxy 配置文件路径
[root@lb01 ~]# rpm -qc haproxy
# rpm -qc:查询已安装包的配置文件列表
# 输出:
# /etc/haproxy/haproxy.cfg # 核心配置文件(重点修改)
# /etc/logrotate.d/haproxy # 日志轮转配置(切割日志文件)
# /etc/sysconfig/haproxy # 启动选项配置(如启动参数、环境变量)
3.5 备份并修改 HAProxy 核心配置
1. 备份原有配置文件
[root@lb01 ~]# cp /etc/haproxy/haproxy.cfg{,.bak}
# 等价于cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
# {,.bak}:Shell通配符,快速创建备份文件
2. HAProxy 配置文件(haproxy.cfg)逐行解释
# 全局配置段:定义HAProxy全局运行参数(进程级、系统级)
global
log 127.0.0.1 local2
# 日志配置:将日志发送到本地127.0.0.1的syslog服务local2设施(需配合rsyslog)
# 作用:记录HAProxy运行日志、访问日志等
chroot /var/lib/haproxy
# 切换根目录到/var/lib/haproxy,增强安全性(限制进程访问范围)
pidfile /var/run/haproxy.pid
# 指定HAProxy进程PID文件路径,用于管理进程(如停止、重启)
maxconn 4000
# 全局最大并发连接数(所有前端+后端的总连接上限)
user haproxy
group haproxy
# 指定HAProxy运行的用户和组(权限隔离,避免root权限风险)
daemon
# 以守护进程模式运行(后台运行,脱离终端)
stats socket /var/lib/haproxy/stats
# 开启统计套接字,用于本地管理(如通过socat查询状态、动态调整配置)
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
# SSL加密套件配置:使用系统默认配置(兼容系统级SSL策略)
# 默认配置段:定义前端/后端的默认参数(可被前端/后端覆盖)
defaults
mode http
# 运行模式:http(解析HTTP协议,支持七层负载均衡)
# 可选:tcp(四层转发,不解析应用层协议)、health(仅健康检测)
log global
# 日志配置:继承global段的日志设置
option httplog
# 启用HTTP日志格式:记录完整的HTTP请求信息(如请求方法、URL、状态码)
option dontlognull
# 不记录空连接日志(如客户端连接后无请求就断开,减少日志冗余)
option http-server-close
# 关闭服务器端的HTTP连接:每次请求后关闭后端服务器连接,避免长连接占用资源
option forwardfor except 127.0.0.0/8
# 启用X-Forwarded-For头:将客户端真实IP传递给后端服务器
# except 127.0.0.0/8:本地回环地址不添加该头(避免后端获取到127.0.0.1)
option redispatch
# 重分发机制:当后端服务器不可用时,将请求重新分发到其他可用服务器
retries 3
# 后端服务器连接重试次数:连接失败时重试3次,仍失败则标记为不可用
timeout http-request 10s
# HTTP请求超时时间:客户端发送请求的时间超过10s则断开连接
timeout queue 1m
# 队列超时时间:请求在HAProxy队列中等待超过1分钟则拒绝
timeout connect 10s
# 后端服务器连接超时时间:HAProxy连接后端服务器超过10s则失败
timeout client 1m
# 客户端连接超时时间:客户端与HAProxy的连接空闲超过1分钟则断开
timeout server 1m
# 服务器连接超时时间:HAProxy与后端服务器的连接空闲超过1分钟则断开
timeout http-keep-alive 10s
# HTTP长连接超时时间:Keep-Alive连接空闲超过10s则断开
timeout check 10s
# 健康检测超时时间:健康检测请求超过10s则判定为失败
maxconn 3000
# 每进程最大并发连接数(默认配置段的连接上限,可被前端覆盖)
# 前端配置段:定义接收客户端请求的入口
frontend main
bind *:80
# 监听地址和端口:*:80表示监听所有网卡的80端口(HTTP默认端口)
# acl url_static path_beg -i /static /images /javascript /stylesheets
#定义第一个 ACL 规则 ------ 当用户请求的 URL 以/static、/images等路径开头时,标记为url_static(静态资源请求)。
# acl url_static path_end -i .jpg .gif .png .css .js
#扩展url_static规则 ------ 即使 URL 不是以指定路径开头,但只要是图片 / 样式 / 脚本文件,也标记为url_static(静态资源请求)。
# use_backend static if url_static
#如果请求被标记为url_static(静态资源),则将请求转发到名为static的后端集群处理(而非默认的业务后端)。
default_backend webcluster
# 默认后端集群:所有匹配该前端的请求转发到webcluster后端
# 后端配置段:定义后端服务器集群和负载均衡策略
backend webcluster
balance roundrobin
# 负载均衡算法:roundrobin(轮询),按顺序分发请求到后端服务器
# 可选算法:static-rr(静态轮询)、leastconn(最少连接)、source(源IP哈希)等
option httpchk GET /test.html
# 启用HTTP健康检测:发送GET请求到/test.html,根据响应判断节点是否存活
# 检测逻辑:返回2xx/3xx状态码则判定为健康,否则为异常
server web1 192.168.72.10:80 check inter 2000 rise 2 fall 2 weight 2
# 定义后端服务器1:
# web1:服务器别名;192.168.72.10:80:IP和端口;
# check:启用健康检测;inter 2000:检测间隔2000ms(2秒);
# rise 2:连续2次检测成功则标记为可用;fall 2:连续2次失败则标记为不可用;
# weight 2:权重为2(轮询时被选中的概率是web2的2倍)
server web2 192.168.72.20:80 check inter 2000 rise 2 fall 2 weight 1
# 定义后端服务器2:权重为1,其余参数同web1
原本默认内容为
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
# 监控页面配置段:定义HAProxy状态监控页面
listen admin_status
bind *:9129
# 监听9129端口,用于访问监控页面
stats refresh 30s
# 监控页面自动刷新间隔:30秒
stats uri /admin
# 监控页面访问路径:http://IP:9129/admin
stats auth admin:admin123
# 监控页面认证:用户名admin,密码admin123(防止未授权访问)
stats hide-version
# 隐藏HAProxy版本信息(避免版本泄露导致安全风险)
stats admin if TRUE
# 启用监控页面的管理功能:允许通过页面手动启用/禁用后端服务器(if TRUE表示始终启用)
3.6 启动 HAProxy 服务
[root@lb01 ~]# systemctl start haproxy
# 启动HAProxy服务
# 可选:systemctl enable haproxy # 设置开机自启
3.7 访问 HAProxy 监控页面
通过浏览器访问:http://192.168.72.100:9129/admin输入用户名admin、密码admin123,即可查看:
- 后端服务器状态(在线 / 离线)
- 连接数、请求数统计
- 负载均衡分发情况
- 可手动调整后端服务器状态(启用 / 禁用)

详细介绍:
一、从页面能获取的核心信息(按板块拆解)
1. 顶部「General process information」(HAProxy 进程全局信息)
| 字段 / 标识 | 含义(结合截图数据) | 运维价值 |
|---|---|---|
pid = 1864 |
HAProxy 进程 ID 是 1864 | 定位 / 管理 HAProxy 进程(如kill -9 1864重启) |
uptime = 0d02m13s |
HAProxy 已运行 2 分 13 秒 | 确认服务是否刚启动 / 是否稳定运行 |
maxconn = 4000 |
全局最大并发连接数(配置文件里的global maxconn) |
评估连接数是否达上限,判断是否需要扩容 |
current conns = 2 |
当前活跃连接数 | 实时监控负载压力(数值高说明访问量大) |
Running tasks: 0/20; idle = 100% |
工作线程空闲率 100% | 说明当前无请求压力,服务资源充足 |
| 颜色图例(active UP/backup DOWN 等) | 服务器状态含义:- 绿色 = 正常(UP)- 黄色 = 正在下线- 红色 = 故障(DOWN)- 灰色 = 未检测 | 快速识别后端节点健康状态 |
2. 「main」前端(Frontend)板块
main是你配置里的前端入口(监听 80 端口),核心数据:
Status: OPEN:前端监听端口正常开启(80 端口可接收请求);Sessions Total = 0:暂无客户端请求接入;- 所有错误(Errors)、拒绝(Denied)数值为 0:前端无异常。
3. 「webcluster」后端(Backend)板块(核心!)
这是你配置的 Web 节点集群(web1+web2),每列关键信息:
| 字段 | 截图数据(web1 为例) | 含义 |
|---|---|---|
Status |
UP | 节点健康状态(UP = 正常,DOWN = 故障) |
LastChk |
L7OK/200 in 0ms | 最后一次健康检测结果:- L7OK = 七层 HTTP 检测正常- 200 = 返回状态码 200- 0ms = 检测耗时 |
Wght |
2/2 | 权重(配置里 web1 权重 2),分子 = 当前生效权重,分母 = 配置权重 |
Act |
Y | Y = 节点启用(可接收请求),N = 禁用 |
Chk |
0 | 健康检测失败次数(0 = 无失败) |
Dwn |
0 | 节点下线次数(0 = 从未下线) |
核心结论:web1、web2 均正常在线,权重分别为 2/1(和你配置一致),无健康检测失败,集群状态良好。
4. 「admin_status」板块(监控页面自身)
Frontend Status: OPEN:监控页面(9129 端口)正常可访问;Bytes In/Out:监控页面的出入流量(7898/138563 字节);Sessions Cur = 2:当前有 2 个连接访问监控页面(就是你自己的访问)。
二、这个页面能执行的操作(运维核心功能)
1. 后端节点的「状态管理」(最常用)
截图里webcluster板块左侧有复选框,勾选节点后,下拉框选择操作 + 点击「Apply」即可执行:
一、节点状态管理(Set state to...)
| 选项 | 含义与作用 | 适用场景 |
|---|---|---|
| Set state to READY | 恢复节点为正常可用状态,HAProxy 恢复向其分发流量,健康检查正常执行。 | 节点维护完成后,重新加入负载均衡集群。 |
| Set state to DRAIN | 优雅排水模式:停止接收新请求,等待已存在的长连接 / 会话处理完成后再下线。 | 平滑下线节点(如版本升级、重启服务),避免强制中断用户请求。 |
| Set state to MAINT | 维护模式:节点标记为不可用,HAProxy 停止分发流量,健康检查仍会执行(状态显示为 MAINT)。 | 节点需要长期维护(如硬件更换、系统升级),明确标识为 "不可用"。 |
二、健康检查管理(Health: ...)
| 选项 | 含义与作用 | 适用场景 |
|---|---|---|
| Health: disable checks | 临时关闭对节点的健康检查,HAProxy 不再主动探测节点存活状态。 | 排查健康检查误报、或节点已知正常但检查脚本异常时。 |
| Health: enable checks | 重新启用健康检查,恢复对节点的存活探测。 | 故障排查完成后,恢复正常监控流程。 |
| Health: force UP | 强制标记节点为 UP,忽略健康检查结果,HAProxy 继续向其分发流量。 | 健康检查脚本临时故障,但节点实际正常,需紧急恢复流量。 |
| Health: force NOLB | 强制标记为 UP,但不参与负载均衡 (仅处理已存在会话,不接收新请求),等价于 DRAIN 状态。 |
优雅下线节点,让旧请求处理完毕。 |
| Health: force DOWN | 强制标记节点为 DOWN,HAProxy 立即停止分发流量,即使健康检查显示正常。 | 节点出现未知问题,需紧急隔离,避免影响业务。 |
三、Agent 检查管理(Agent: ...)
| 选项 | 含义与作用 | 适用场景 |
|---|---|---|
| Agent: disable checks | 关闭 Agent 健康检查,不再接收节点 agent 上报的状态。 | 临时屏蔽 Agent 检查的干扰,或调试 agent 进程。 |
| Agent: enable checks | 重新启用 Agent 健康检查,恢复接收节点 agent 上报的状态。 | 故障排查完成后,恢复 Agent 监控。 |
| Agent: force UP | 强制将 Agent 状态标记为 UP,忽略 agent 实际上报结果。 | Agent 进程故障,但节点本身服务正常。 |
| Agent: force DOWN | 强制将 Agent 状态标记为 DOWN,HAProxy 会根据该状态隔离节点。 | 需通过 Agent 状态快速隔离节点。 |
补充说明
Agent 检查是一种更灵活的健康检测方式,通常部署在后端节点上,可返回更丰富的状态(如负载、磁盘空间、服务内部状态等),HAProxy 会根据 agent 上报的结果决定是否分发流量。
四、会话管理
| 选项 | 含义与作用 | 适用场景 |
|---|---|---|
| Kill Sessions | 强制终止节点上所有活跃连接 / 会话,立即断开所有用户请求。 | 节点出现严重问题,需立即切断流量,不等待会话自然结束。 |
2. 页面显示控制(右上角 Display option)
Hide DOWN servers:隐藏故障节点,只看正常节点;Disable refresh:关闭页面自动刷新(默认 30 秒刷新,截图里你配置了stats refresh 30s);Refresh now:手动刷新数据(实时看最新状态);CSV/JSON export:导出统计数据(用于离线分析 / 监控告警)。
3. 快速定位故障
- 若某节点
Status=DOWN,看LastChk字段:比如显示L7ERR/404= 健康检测页面 404,L4CON= 端口连接失败; - 若
Errors列数值非 0,排查节点网络 / 服务(如 Nginx 是否挂了)。
三、总结(核心价值)
| 核心信息 | 核心操作 |
|---|---|
| 1. HAProxy 进程是否正常运行2. 前端监听端口是否开启3. 后端 web1/web2 节点健康状态、权重、检测结果4. 实时连接数 / 流量 / 错误数(评估负载) | 1. 一键禁用 / 启用后端节点(维护必备)2. 优雅下线节点(避免业务中断)3. 导出数据 / 刷新状态(运维分析)4. 快速定位节点故障原因 |
四、核心知识点总结
- 系统初始化:通过脚本标准化配置,减少手动操作错误,重点是静态 IP、SELinux / 防火墙关闭(测试环境)。
- Nginx 配置:自定义首页用于区分后端节点,健康检测页面为 HAProxy 提供存活判断依据。
- HAProxy 核心配置 :
- 全局段:进程级参数(用户、最大连接、日志);
- 默认段:通用超时、连接参数;
- 前端段:请求入口(监听端口、默认后端);
- 后端段:负载均衡算法、健康检测、服务器权重;
- 监控段:可视化状态管理,便于运维排查问题。
- 健康检测:HTTP 级检测(GET /test.html)比 TCP 检测更精准,能识别应用层故障。
- 权重调整:通过 weight 参数控制请求分发比例(web1 权重 2,web2 权重 1,web1 接收 2/3 请求)。