HAProxy 是法国人Willy Tarreau开发的一个开源软件,是一款应对客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡器。其功能是用来提供基于cookie的持久性, 基于内容的交换,过载保护的高级流量管制,自动故障切换,以正则表达式为基础的标题控制运行时间,基于Web的报表,高级日志记录以帮助排除故障的应用或网络及其他功能。
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
官方网站:https://www.haproxy.com/
一图总结对比
分别从Nginx、LVS和HAProxy 3种负载均衡软件的优缺点、适用性和量级等角度进行详细的对比
HAProxy为了让同一客户端访问服务器可以保持会话。有三种解决方法:客户端IP、Cookie以及Session。
roundrobin
:基于权重轮循。static-rr
: 基于权重轮循。静态算法,运行时改变无法生效source
: 基于请求源IP的算法。对请求的源IP进行hash运算,然后将结果与后端服务器的权重总数想除后转发至某台匹配服务器。使同一IP客户端请求始终被转发到某特定的后端服务器。leastconn
:最小连接。(适合数据库负载均衡,不适合会话短的环境)uri
:对部分或整体URI进行hash运算,再与服务器的总权重想除,最后转发到匹配后端。uri_param
:根据URL路径中参数进行转发,保证在后端服务器数量不变的情况下,同一用户请求分发到同一机器。hdr()
:根据http头转发,如果不存在http头。则使用简单轮循。有两种方式可以安装,tar.gz包和yum的方式 相对于编译部署,通过yum安装更简单便捷
本文将展示在CentOS 7上快速安装HAProxy。
但是坏处是CentOS的yum源中默认的haproxy版本都比较低。
查看我们系统中可安装的haproxy版本,可以看到是1.5.18:
yum list haproxy
[root@localhost ~]# yum list haproxy
已加载插件:fastestmirror
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Determining fastest mirrors
* base: mirrors.bupt.edu.cn
* extras: mirrors.bupt.edu.cn
* updates: mirrors.huaweicloud.com
可安装的软件包
haproxy.x86_64 1.5.18-9.el7_9.1 update
如果我们要安装最新的haproxy怎么办呢?
HAPROXY 官方没有提供rpm相关的包,可以通过第三方仓库的rpm包
从第三方网站下载rpm包:https://pkgs.org/download/haproxy
选择相应的版本 ,我们本次演示在CentOS7.9 上安装比较新的版本 haproxy 2.2
查看系统yum中haproxy的版本:yum info haproxy
CentOS7 上的版本信息 1.5.18 版本还是很老的了,
#CentOS7 上的版本信息 1.5.18 版本还是很老的了,我们在这个CentOS7.9 上演示编译安装最新版本的HAPROXY
[root@localhost ~]# yum info haproxy
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.huaweicloud.com
* extras: mirrors.huaweicloud.com
* updates: mirrors.huaweicloud.com
可安装的软件包
名称 :haproxy
架构 :x86_64
版本 :1.5.18
发布 :9.el7_9.1
大小 :835 k
源 :updates/7/x86_64
简介 : TCP/HTTP proxy and load balancer for high availability environments
网址 :http://www.haproxy.org/
协议 : GPLv2+
描述 : HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high
下载 repo 信息文件 wget https://repo.ius.io/ius-release-el7.rpm
[root@localhost ~]# wget https://repo.ius.io/ius-release-el7.rpm
--2023-03-16 14:35:48-- https://repo.ius.io/ius-release-el7.rpm
正在解析主机 repo.ius.io (repo.ius.io)... 104.85.67.135, 2600:140b:5000:98d::3898, 2600:140b:5000:982::3898
正在连接 repo.ius.io (repo.ius.io)|104.85.67.135|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:8412 (8.2K) [application/x-rpm]
正在保存至: “ius-release-el7.rpm”
100%[================================================================================================================================================>] 8,412 --.-K/s 用时 0s
[root@localhost ~]# ll
-rw-r--r--. 1 root root 8412 1月 3 14:05 ius-release-el7.rpm
安装 epel-release yum -y install epel-release
安装 ius-release-el7.rpm rpm -Uvh ius-release*rpm
安装 haproxy 2.2版 yum install haproxy22
启动 haproxy systemctl start haproxy
# 安装 haproxy 2.2.22版
[root@localhost ~]# yum install haproxy22
# 查看端口监听 看不到有 haproxy 相关的
[root@localhost ~]# ss -tlnp | grep haproxy
# 启动服务,再查看端口监听
[root@localhost ~]# systemctl start haproxy
[root@localhost ~]# ss -tlnp | grep haproxy
LISTEN 0 128 *:5000 *:* users:(("haproxy",pid=1416,fd=7))
# 查看版本
[root@localhost ~]# haproxy -v
HA-Proxy version 2.2.29-c5b927c 2023/02/14 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2025.
Known bugs: http://www.haproxy.org/bugs/bugs-2.2.29.html
Running on: Linux 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64
# 查看生成的文件
[root@localhost ~]# rpm -ql haproxy22
/etc/haproxy #haproxy 主要目录之一
/etc/haproxy/haproxy.cfg #此文件是配置文件,很重要
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy
/usr/bin/halog
/usr/bin/iprange
/usr/lib/systemd/system/haproxy.service #haproxy 启动文件
/usr/sbin/haproxy
/usr/share/doc/haproxy22-2.2.29
/usr/share/doc/haproxy22-2.2.29/51Degrees-device-detection.txt
………
IUS is a yum repository that provides newer versions of select software for RHEL and CentOS.
它为CentOS按RHEL提供最新软件版本的yum源。
配置IUS yum源:vim /etc/yum.repos.d/ius-7.repo
[ius]
name = IUS for Enterprise Linux 7 - $basearch
baseurl = https://repo.ius.io/7/$basearch/
enabled = 1
repo_gpgcheck = 0
gpgcheck = 1
gpgkey = https://repo.ius.io/RPM-GPG-KEY-IUS-7
[ius-debuginfo]
name = IUS for Enterprise Linux 7 - $basearch - Debug
baseurl = https://repo.ius.io/7/$basearch/debug/
enabled = 0
repo_gpgcheck = 0
gpgcheck = 1
gpgkey = https://repo.ius.io/RPM-GPG-KEY-IUS-7
[ius-source]
name = IUS for Enterprise Linux 7 - Source
baseurl = https://repo.ius.io/7/src/
enabled = 0
repo_gpgcheck = 0
gpgcheck = 1
gpgkey = https://repo.ius.io/RPM-GPG-KEY-IUS-7
清理缓存:yum clean all
更新缓存:yum makecache fast
查看版本:yum list|grep haproxy
可以看到base源下面可安装的版本是1.5.18,ius源下面就有很多版本了,最新的2.2也有。
[root@localhost ~]# yum list|grep haproxy
haproxy.x86_64 1.5.18-9.el7_9.1 updates
haproxy18u.x86_64 1.8.30-1.el7.ius ius
haproxy20.x86_64 2.0.30-1.el7.ius ius
haproxy22.x86_64 2.2.29-1.el7.ius ius
pcp-pmda-haproxy.x86_64 4.3.2-13.el7_9 updates
[root@localhost ~]#
安装2.2版本:yum install -y haproxy22
查看已安装的haproxy:yum list installed |grep haproxy
查看版本:haproxy -v
,可以看到版本是2.2.1了
查看haproxy状态:systemctl status haproxy
。
因为我们还没有启动过haproxy,所以现在打印出来的状态是inactive。
haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen
global
: 全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关。default
: 配置默认参数,这些参数可以被用到frontend,backend,Listen组件。frontend
:接收请求的前端虚拟节点,frontend可以指定具体使用后端的backend。backend
: 后端服务集群的配置,真实服务器,一个backend对应一个或者多个实体服务器。listen
: fronted和backend的组合体,比如haproxy实例状态监控部分配置。Haproxy1.3之前的唯一配置方式。配置文件路径 vim /etc/haproxy/haproxy.cfg
全局global配置
global
log 127.0.0.1 local0 info //定义haproxy日志输出设置
log loghost local0 info //定义haproxy日志级别
maxconn 20480 //定义最大连接数
chroot /usr/local/haproxy //chroot运行路径
pidfile /var/run/haproxy.pid //haproxy进程PID文件
user haproxy //运行haproxy用户,可用uid代替
group haproxy //运行haproxy用户组,可用gid代替
daemon //以后台形式运行haproxy
defaults配置
tcp模式
:在此模式下,客户端和服务器端之前将建立一个全双工的连接,不会对七层报文做任何检查,默认为tcp模式,经常用于SSL、SSH、SMTP等应用。http模式
:在此模式下,客户端请求在转发至后端服务器之前将会被深度分板,所有不与RFC格式兼容的请求都会被拒绝。health
:已基本不用了。defaults
mode http //所处理的类别(7层代理http,4层代理tcp)
log global //引入global定义的日志格式
option dontlognull //不记录健康检查日志信息
option httpclose //每次请求完毕后主动关闭http通道,haproxy不支持keep-alive模式
option httplog //日志类别为http日志格式
option forwardfor //如果后端服务器需要获取客户端的真是ip,需要配置的参数,可以从http header中获取客户端的ip
option redispatch
balance roundrobin //设置默认负载均衡方式,轮询方式
timeout connect 10s //默认连接超时时间
timeout client 10s //默认客户端超时时间
timeout server 10s //默认服务器超时时间
timeout check 10s //设置超时检查超时时间
maxconn 60000 //最大连接数
retries 3 //3次连接失败就认为服务器不可用,也可以通过后面设置
frontend配置
frontend http_80_in
bind 0.0.0.0:80 //设置侦听端口,即haproxy提供的web服务端口,和lvs的vip类似
mode http
log global
option httpclose
option httplog
option forwardfor
default_backend webserver //设置请求默认转发的后端服务池
backend配置
用来定义后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器
backend webserver //定义webserver服务器组
mode http
option redispath
option abortonclose
balancer source //负载均衡的方式,源哈希算法
cookie SERVERID //允许插入serverid到cookie中,serverid后面可以定义
option httpdchk GET /test.html //心跳测试
server web1 192.168.92.100:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 maconn 8
listen配置
常常用于状态页面监控,以及后端server检查,是Fronted和backend的组合体。
listen admin_stats //frontend和backend的组合体,监控组的名称,按需自定义名称
bind 0.0.0.0:8189 //侦听端口
stats enable //开启监控
mode http
log global
stats uri /haproxy_stats //监控页面的url访问路径
stats realm Haproxy\ Statistics //监控页面的提示信息
stats auth admin:admin //监控页面的用户和密码
#stats hide-version //隐藏统计页面上的haproxy版本信息
stats admin if TRUE //手工启用/禁用,后端服务器haproxy
stats refresh 30s //每个30秒自动刷新监控页面
访问监控界面:http://192.168.92.110:8189/haproxy_stats
主机名 | ip地址 | 备注 |
---|---|---|
Haproxy | 192.168.92.110 | haproxy |
web服务器 | 192.168.92.100 | web |
web服务器 | 192.168.92.1101 | web |
#实现一个负载均衡
listen webcluster 0.0.0.0:80
option httpchk GET /index.html
balance roundrobin
server inst1 192.168.92.101:80 check inter 2000 fall 3
server inst1 192.168.92.100:80 check inter 2000 fall 3
修改完配置文件后重新启动 Haproxy
systemctl restart haproxy
访问控制列表(ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配),即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。
具体其他使用方法参考:Haproxy的ACL配置及案例
以下常用的URL匹配为实例进行演示,类似于nginx中的location匹配路径
Haproxy中ACL的配置语法及参数:
acl语法:
acl <aclname> <criterion> [flags] [operator] [<value>]
acl 该条acl规则的名称 匹配规范 匹配模式 具体操作符 操作对象类型
frontend http-in
bind 0.0.0.0:80
acl web url_beg /web #配置路基url 定义为web
use_backend admin_web if web #如果满足web条件 走admin_web 服务
default_backend admin_server #默认服务
backend admin_web #定义web服务
mode http
balance roundrobin # Load Balancing algorithm
option httpchk
option forwardfor
server web1 192.168.92.101:80 check inter 2000 fall 3
backend admin_server #定义后端服务
mode http
balance roundrobin # Load Balancing algorithm
option httpchk
option forwardfor
server web2 192.168.92.100:80 check inter 2000 fall 3
解析配置:
修改完配置文件,有可能会报错
haproxy起不来,报错:
Starting proxy admin_stats: cannot bind socket [0.0.0.0:8189]
解决办法
setsebool -P haproxy_connect_any=1
再启动就起来了
systemctl start haproxy
[root@bogon ~]# setsebool -P haproxy_connect_any=1
[root@bogon ~]# systemctl start haproxy
Haproxy 的日志默认输出到系统的 syslog 中,为了更好的管理 Haproxy 的日志,在生产环境中一般单独定义出来。
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
#log 127.0.0.1 local0
#log 127.0.0.1 local1 notice
log /dev/log local0 info
log /dev/log local0 notice
[root@localhost ~]# systemctl restart haproxy
这两行配置放到 global 选项中,主要是将Haproxy的info和notice日志分别记录到不同的日志文件中
为了便于管理,将 Haproxy 相关的配置独立定义到 haproxy.conf
并放到 /etc/rsyslog.d/
下,rsyslog 启动时会自动加载此目录下的所有配置文件。
vim /etc/rsyslog.d/haproxy.conf
[root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogserverity-text == 'info') then -/var/log/haproxy/haproxy-info.log &~
if ($programname == 'haproxy' and $syslogserverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log &~
将 haproxy 的 info 日志记录到 /var/log/haproxy/haproxy-info.log
中 ,
将 notice 日志记录到 /var/log/haproxy/haproxy-notice.log
中 ,
&~
表示当写入到日志文件后,rsyslog 停止处理这个信息,(rainerscript 脚本语言)
[root@localhost ~]# systemctl restart rsyslog
#查看日志文件是否创建成功
[root@localhost ~]# ls -l /var/log/haproxy/haproxy-info.log
[root@localhost ~]# ls -l /var/log/haproxy/haproxy-notice.log