Haproxy -- 集群简单实现及全局配置详解

文末附有 HAProxy 核心配置速记+vim进入文件后文件编辑常用快捷键总结表

一. Haproxy简介

1.1 背景

HAProxy 是法国开发者威利塔罗(Willy Tarreau)在 2000 年用 C 语言写的一款开源软件,主打高并发(万级以上)和高性能,既能做 TCP 负载均衡,也能做 HTTP 负载均衡,还支持基于 cookie 的会话保持、自动故障切换、正则表达式和 Web 状态统计等功能,有社区版和企业版两个版本。

1.2 原理

HAProxy 就像一个 "智能流量管家",它站在客户端和后端服务器中间,先接住所有进来的请求,再根据预设的规则(比如轮询、最小连接数,或者看 URL、Cookie 等),把请求转发给最合适的后端服务器去处理,同时还能监控后端服务器的健康状态,发现哪个服务器挂了就自动把流量切到别的服务器上。

1.3 目的

扛住更多并发请求,不让单台服务器被压垮;保证服务不中断,某台服务器出问题也不影响用户使用;让用户访问更稳定、响应更快,体验更好;方便后续扩展,加服务器不用改太多配置。

二.环境设定

2.1 环境流程图

2.2 实验环境

2.3 环境配置

2.3.1创建并开启虚拟机

(注意对应的网卡数量及类型)

注:添加并更改网卡教程

添加

更改

2.3.2 环境配置命令

1.设定网络

在haproxy中

复制代码
[root@haproxy ~]# vmset.sh eth0 192.168.35.100 haproxy
[root@haproxy ~]# vmset.sh eth1 192.168.221.100 haproxy noroute

在webserver1中

复制代码
[root@webserver1 ~]# vmset.sh eth0 192.168.221.10 webserver1 noroute

在webserver2中

复制代码
[root@webserver2 ~]# vmset.sh eth0 192.168.221.20 webserver2 noroute

2.配置内核路由功能

让运行 HAProxy 的服务器具备转发 IP 数据包的能力 ------ 简单说,就是允许服务器把接收到的客户端请求数据包,转发给后端不同网段的真实服务器;同时也能把后端服务器的响应数据包,再转发回客户端。

在haproxy中

复制代码
[root@haproxy ~]# echo net.ipv4.ip_forward=1 > /etc/sysctl.conf
#把开启内核 IP 转发的配置写入系统永久配置文件,确保服务器重启后依然生效

[root@haproxy ~]# sysctl -p    
#立即加载 /etc/sysctl.conf 中的内核参数,让 ip_forward=1 无需重启服务器就能生效

3.设定访问业务真实数据

搭建一台可被 HAProxy 调度的后端 HTTP 业务服务器

这组操作的核心是为 HAProxy 负载均衡架构搭建一台可用的后端 Web 业务节点:安装 httpd 服务并创建带专属标识的首页文件,同时启动服务并设置开机自启,既让服务器能提供网页访问服务,也便于验证 HAProxy 的负载均衡调度效果。

在webserver1中

复制代码
[root@webserver1 ~]# dnf install httpd -y
#安装 Apache HTTP 服务
[root@webserver1 ~]# echo webserver1 - 192.168.221.10 > /var/www/html/index.html
#创建 Web 服务的默认首页文件
[root@webserver1 ~]# systemctl enable --now httpd
#立即启动 httpd 服务,并设置开机自启

在webserver2中

复制代码
[root@webserver2 ~]# dnf install httpd -y
#安装 Apache HTTP 服务
[root@webserver2 ~]# echo webserver2 - 192.168.221.20 > /var/www/html/index.html
#创建 Web 服务的默认首页文件
[root@webserver2 ~]# systemctl enable --now httpd
#立即启动 httpd 服务,并设置开机自启

4.验证环境

在haproxy中

复制代码
[root@haproxy ~]# curl 192.168.221.10
webserver1 - 192.168.221.10
[root@haproxy ~]# curl 192.168.221.20
webserver2 - 192.168.221.20

三. Haproxy的安装及配置参数

3.1 安装

在haproxy中

复制代码
[root@haproxy ~]# dnf install haproxy -y
#通过系统包管理器安装 HAProxy 软件,这是搭建负载均衡服务的基础前提
[root@haproxy ~]# systemctl enable --now haproxy

3.2 harpoxy的参数详解实验

Haproxy的配置文件haproxy.cfg由两大部分组成,分别是:

global:全局配置段

(这是 HAProxy 配置里最顶层的部分,用来设置整个 HAProxy 进程生效的全局参数,所有代理相关的配置都会继承这里的基础设置。)

· 进程及安全配置相关的参数 (主要控制 HAProxy 进程的运行方式和安全相关设置)

· 性能调整相关参数 (用于优化 HAProxy 的运行性能)

· Debug参数 (用于调试和排查问题)
proxies:代理配置段

(这是 HAProxy 配置里专门负责代理相关逻辑 的部分,用来定义如何接收请求、转发请求到后端服务器。)

· defaults:为 frontend, ...

(defaults 段是默认配置段 ,用来给下面的 frontendbackend 等提供统一的默认参数,避免重复配置。)

· frontend:前端,相当于 nginx

(frontend 是前端入口,负责监听客户端的请求(比如监听某个端口),并根据规则把请求转发到对应的后端,作用类似 Nginx 的 "前端监听 + 路由分发")

· backend:后端,相当于 nginx

(backend 是后端服务池,定义了一组真实的后端服务器,以及负载均衡、健康检查等规则,类似 Nginx 里的 upstream 后端服务器组。)

· listen:同时拥有前端和后端配置

(listen 是一种简化写法,把 frontend 和 backend 合并在一个配置块里,既定义监听端口,又直接指定后端服务器,适合简单的一对一代理场景。)

3.2.1 实现最基本的负载

前后端分开设定和用listen方式书写负载均衡这两种方法,功能完全等价,只是用listen方式写法更简洁

1.前后端分开设定

在haproxy中

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
(注:为了不影响效果,可选择将源文件中目前不需要的配置信息注释掉
快速注释方法在文末)
frontend webcluster   #定义前端配置块,frontend负责接收客户端请求,名字叫webcluster(可自定义)
    bind            *:80           #监听服务器所有网卡的80端口
    mode            http           #工作模式为HTTP模式
    use_backend     webserver-80   #将接收到的请求转发到名为webserver-80的后端集群

backend webserver-80               #定义后端的配置块,名字要和前端的use_backend对应
    server web1 192.168.221.10:80 check inter 3s fall 3 rise 5
    server web2 192.168.221.20:80 check inter 3s fall 3 rise 5
     #指定了两台后端 Web 服务器(IP 是 192.168.221.10(20)),HAProxy 会默认用轮询方式,把请求交替发给 web1 和 web2,实现负载均衡。
[root@haproxy ~]# systemctl restart haproxy.service

测试:

复制代码
[root@haproxy ~]# curl 192.168.35.100
webserver1 - 192.168.221.10
[root@haproxy ~]# curl 192.168.35.100
webserver2 - 192.168.221.20

2.用listen方式书写负载均衡

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster           # 定义一个listen配置块,名称为webcluster
    bind            *:80    # 监听服务器所有网卡的80端口
    mode            http    # 工作模式为HTTP模式
    server web1 192.168.221.10:80 check inter 3s fall 3 rise 5
    server web2 192.168.221.20:80 check inter 3s fall 3 rise 5
     #定义两台后端 Web 服务器(web1、web2);开启健康检查,每 3 秒检测一次,连续 3 次失败则剔除,连续 5 次成功则恢复。
[root@haproxy ~]# systemctl restart haproxy.service

测试:

3.2.2 log 127.0.0.1 local2

指定把日志发送到哪里

实验中指定日志发送到192.168.221.10(webserver1)

1.在192.168.0.10 开启接受日志的端口

复制代码
[root@webserver1 ~]# vim /etc/rsyslog.conf #打开 rsyslog 服务的核心配置文件

module(load="imudp") # needs to be done just once
#开启rsyslog 的 "UDP 输入模块",作用是让 rsyslog 具备通过 UDP 协议接收日志的能力
input(type="imudp" port="514")
#定义rsyslog的日志输入源为UDP模块,监听 UDP 514 端口(514 是 syslog 协议的默认端口)

[root@webserver1 ~]# systemctl restart rsyslog.service

2..测试接受日志端口是否开启

复制代码
[root@webserver1 ~]# netstat -antlupe | grep rsyslog
  1. 在haproxy主机中设定日志发送信息

    [root@haproxy haproxy]# vim haproxy.cfg
    log 192.168.221.10 local2
    [root@haproxy haproxy]# systemctl restart haproxy.service

  1. 验证

新开一个shell中

在webserver1中

复制代码
[root@webserver1 ~]# cat /var/log/messages

注:做完实验后将log 更改回去

3.2.3 实现haproxy的多进程

  1. 默认haproxy是单进程,现在改为多进程

    [root@haproxy haproxy]# vim /etc/haproxy/haproxy.cfg
    maxconn 10000 #选择性更改最大并发量为多少
    user haproxy
    group haproxy
    daemon

    # turn on stats unix socket

    复制代码
     stats socket /var/lib/haproxy/stats
     nbproc      2        #设定进程数量为2个

    [root@haproxy haproxy]# systemctl restart haproxy.service
    [root@haproxy haproxy]# pstree | grep haproxy
    |-haproxy---2*[haproxy]

验证

  1. 多进程cpu绑定

为 HAProxy 开启多进程模式,并将不同进程绑定到指定 CPU 核心,提升性能和资源利用效率

注:每个进程独占一个核心,最大化利用多核 CPU 的算力,尤其适合高并发的负载均衡场景

复制代码
[root@haproxy haproxy]# vim /etc/haproxy/haproxy.cfg

    nbproc      2
    cpu-map     1 0  
#将 HAProxy 的第 1 个进程绑定到服务器的第 0 号 CPU 核心(CPU 核心编号从 0 开始)
    cpu-map     2 1

[root@haproxy haproxy]# systemctl restart haproxy.service

3.为不同进程准备不同套接字

复制代码
[root@haproxy ~]# systemctl stop haproxy.service
[root@haproxy ~]# rm -fr /var/lib/haproxy/stats
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

    stats socket /var/lib/haproxy/haproxy1  mode 600 level admin process 1
    stats socket /var/lib/haproxy/haporxy2  mode 660 level admin process 1
#  stats socket /var/lib/haproxy/haproxy1   定义统计套接字的文件路径,
   mode 600 设置套接字文件的权限:- 600:仅文件所有者(haproxy 用户)可读写;
   level admin 设置套接字的操作权限级别为 "管理员"
   process 1 指定该套接字仅关联 HAProxy 的第 1 个进程

[root@haproxy ~]# systemctl restart haproxy.service

效果:

3.2.4 haproxy实现多线程

注意多线程不能和多进程同时启用

1.查看当前haproxy的进程信息

复制代码
[root@haproxy ~]# pstree -p | grep haproxy  #查看 HAProxy 进程树
           |-haproxy(32313)-+-haproxy(32315)
           |                `-haproxy(32316)

#输出含义
32313 是管理进程,只做管控不处理业务;
32315/32316 是业务进程,专门处理请求转发,数量由nbproc 2决定。



[root@haproxy ~]# cat /proc/32315/status  | grep Threads  #查看指定进程的线程数
Threads:        1

2.启用多线程

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

	#nbproc     2
    #cpu-map    1 0
    #cpu-map    2 1
    nbthread    2
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
    #stats socket /var/lib/haproxy/haproxy1  mode 600 level admin process 1
    #stats socket /var/lib/haproxy/haporxy2  mode 660 level admin process 1
[root@haproxy ~]# systemctl restart haproxy.service

3.效果

复制代码
[root@haproxy ~]#  pstree -p | grep haproxy
           |-haproxy(32333)---haproxy(32335)---{haproxy}(32336)
[root@haproxy ~]# cat /proc/32335/status  | grep Threads

四. 常见问题

Q1:如何设定vim中tab键的空格个数?

解决方法:

在对应主机中,进入 vim ~/.vimrc这个文件,输入set ts=4 ai 即为设定vim中tab键的空格个数为4个

Q2:如何将文件中的内容进行注释或删除?

解决方法:

以文件/etc/haproxy/haproxy.cfg为例,通过命令"vim /etc/haproxy/haproxy.cfg"进入文件之后,

逐行注释(单行)

普通模式 下:

  • 光标移到要注释的行,按 I(大写 i)进入行首插入模式
  • 输入 #,按 Esc 退出
  • 重复操作可注释多行,或用 . 重复上一次操作
  1. 批量选中区域注释

  2. Ctrl + v 进入 可视块模式(Visual Block)

  3. 用上下方向键选中要注释的多行的行首

  4. I(大写 i)进入行首插入模式

  5. 输入 #

  6. Esc,选中的所有行首都会自动加上 #


二、全部注释(整个文件)

  1. gg 跳转到文件首行
  2. Ctrl + v 进入可视块模式
  3. G(大写 g)选中从首行到末行的所有行首
  4. I → 输入 # → 按 Esc整个文件所有行都会被加上 # 注释

三、部分删除注释(逐行或选中区域)

  1. 单行删除注释

普通模式下,光标移到 # 所在位置,按 x 删除单个 #

  1. 批量删除注释

  2. Ctrl + v 进入可视块模式

  3. 选中所有行首的 # 字符(确保只选中 #

  4. d,即可一次性删除选中区域内的所有 #

小技巧:如果 # 前面有空格,可先按 0 跳行首,再按 l 右移到 # 位置,再用可视块选中

四、全部删除注释(整个文件)

  1. gg 跳转到首行
  2. Ctrl + v 进入可视块模式
  3. G 选中所有行首的 #
  4. d 删除所有选中的 #

Q3:假设有多台haproxy主机,如何将所有主机的日志都集中在同一haproxy主机中?

五. 结论

HAProxy 就像餐厅里的 "智能领位员":

  • 背景:这家餐厅生意太好,单靠一个服务员(单台服务器)忙不过来,于是请了个专业领位(HAProxy)来帮忙。
  • 原理:客人来了,领位先问清楚想吃什么、几个人,再根据各个包间(后端服务器)的空闲情况,把客人安排到最合适的包间,要是某个包间的厨师请假了(服务器故障),领位就再也不把客人往那儿带。
  • 目的:让客人不用等太久,也不会因为某个包间忙不过来而吃不上饭,餐厅也能轻松接待更多客人。
  • 实际效果:不管是周末高峰还是平时,客人都能快速入座,体验一直很稳定,餐厅也能放心地多开几个包间(扩展服务器),不用怕客人找不到位置。

附录

HAProxy 核心配置速记

全局配置(global)- 基础环境

复制代码
global
    log /dev/log  local0  # 日志输出位置
    maxconn 10240         # 最大并发连接数
    user haproxy          # 运行用户
    group haproxy         # 运行用户组
    daemon                # 后台运行
    nbthread 4            # 工作线程数(建议等于CPU核心数)

默认配置(defaults)- 通用规则(继承给后端 / 前端)

复制代码
defaults
    log     global        # 继承global的日志配置
    mode    http          # 模式:http(七层)/tcp(四层)
    option  httplog       # 记录HTTP详细日志
    option  dontlognull   # 不记录空连接日志
    retries 3             # 后端服务器重试次数
    timeout connect 5s    # 连接后端服务器超时时间
    timeout client 30s    # 客户端连接超时时间
    timeout server 30s    # 后端服务器响应超时时间
    maxconn 2048          # 该配置组最大并发

后端服务器池(backend)- 定义真实服务节点

复制代码
backend web_server  # 后端池名称(前端需关联)
    mode http        # 匹配七层/四层模式
    balance roundrobin  # 调度算法:轮询(常用)
    # 调度算法可选:leastconn(最小连接)、source(源IP哈希-会话粘滞)
    server node1 192.168.221.10:80 check inter 2s rise 2 fall 3  # 节点1+健康检查
    server node2 192.168.221.20:80 check inter 2s rise 2 fall 3  # 节点2+健康检查
    # check:开启健康检查;inter:检查间隔;rise:恢复上线次数;fall:故障下线次数

前端监听(frontend)- 接收客户端请求并转发

复制代码
frontend web_listen
    bind 192.168.221.200:80  # 监听VIP+端口(对外提供服务的地址)
    mode http                # 匹配七层/四层模式
    default_backend web_server  # 转发到指定后端池(核心关联)

快捷整合配置(frontend+backend 合并:listen)

适合简单场景,替代单独的 frontend+backend,更简洁

复制代码
listen web_service
    bind 192.168.221.200:80
    mode http
    balance roundrobin
    server node1 192.168.221.10:80 check
    server node2 192.168.221.20:80 check
    timeout connect 5s

核心常用配置 - 按需添加

1.会话粘滞(source 哈希):同一客户端固定转发到同一后端

复制代码
balance source  # 替换backend中的roundrobin

2.四层 TCP 转发(如 443 / 数据库):仅需修改 mode 为 tcp

复制代码
mode tcp  # global/default/frontend/backend 统一改为tcp,关闭httplog

3.健康检查关闭 :后端节点后去掉check即可

4.节点权重:给性能好的节点分配更多流量(weight 默认 1)

复制代码
server node1 192.168.221.10:80 check weight 2  # 权重2,占比更高

配置后必执行命令

复制代码
haproxy -c -f /etc/haproxy/haproxy.cfg  # 检查配置语法(核心,先检查再重启)
systemctl restart haproxy  # 重启生效
systemctl enable haproxy   # 开机自启
ss -tnl | grep 80          # 验证监听端口是否开启

常用快捷键总结表

相关推荐
BingoGo1 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack1 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982072 天前
PHP 扩展——从入门到理解
php
鹏仔先生3 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
LDR0063 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术3 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园3 天前
C++20 Modules 模块详解
java·开发语言·spring
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务