haproxy安装以及haproxy+nginx简单案例详解

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. 快速定位节点故障原因

四、核心知识点总结

  1. 系统初始化:通过脚本标准化配置,减少手动操作错误,重点是静态 IP、SELinux / 防火墙关闭(测试环境)。
  2. Nginx 配置:自定义首页用于区分后端节点,健康检测页面为 HAProxy 提供存活判断依据。
  3. HAProxy 核心配置
    • 全局段:进程级参数(用户、最大连接、日志);
    • 默认段:通用超时、连接参数;
    • 前端段:请求入口(监听端口、默认后端);
    • 后端段:负载均衡算法、健康检测、服务器权重;
    • 监控段:可视化状态管理,便于运维排查问题。
  4. 健康检测:HTTP 级检测(GET /test.html)比 TCP 检测更精准,能识别应用层故障。
  5. 权重调整:通过 weight 参数控制请求分发比例(web1 权重 2,web2 权重 1,web1 接收 2/3 请求)。
相关推荐
YYYing.1 小时前
【Linux/C++多线程篇(一) 】多线程编程入门:从核心概念到常用函数详解
linux·开发语言·c++·笔记·ubuntu
badhope1 小时前
OpenClaw卸载命令全解析
java·linux·人工智能·python·sql·数据挖掘·策略模式
黄昏晓x1 小时前
Linux----进程通信
linux·运维·服务器
暴力求解1 小时前
Linux---动静态库的制作和使用
linux·运维·服务器
摇滚侠2 小时前
虚拟机部署龙虾 OpenClaw,VMware 安装 Linux CentOS 虚拟机操作系统,部署 Docker,部署 OpenClaw
linux·docker·centos
qiuyuyiyang2 小时前
Nginx 反向代理之upstream模块以及完整配置反向代理示例
git·nginx·github
EnCi Zheng2 小时前
L1C-VMware创建CentOS虚拟机完全指南 [特殊字符]
linux·运维·centos
物联网软硬件开发-轨物科技2 小时前
光伏电站智能运维:让每一度电都不被浪费
运维·能源·光照贴图·iot
AC赳赳老秦2 小时前
智能协同新纪元:DeepSeek驱动的跨岗位、跨工具多智能体实操体系展望(2026)
大数据·运维·人工智能·深度学习·机器学习·ai-native·deepseek