赞
踩
HAProxy 是法国人Willy Tarreau开发的一个开源软件,是一款应对客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡器。其功能是用来提供基于cookie的持久性, 基于内容的交换,过载保护的高级流量管制,自动故障切换,以正则表达式为基础的标题控制运行时间,基于Web的报表,高级日志记录以帮助排除故障的应用或网络及其他功能。
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
一图总结对比
分别从Nginx、LVS和HAProxy 3种负载均衡软件的优缺点、适用性和量级等角度进行详细的对比
HAProxy为了让同一客户端访问服务器可以保持会话。有三种解决方法:客户端IP、Cookie以及Session。
roundrobin
:基于权重轮循。static-rr
: 基于权重轮循。静态算法,运行时改变无法生效source
: 基于请求源IP的算法。对请求的源IP进行hash运算,然后将结果与后端服务器的权重总数想除后转发至某台匹配服务器。使同一IP客户端请求始终被转发到某特定的后端服务器。leastconn
:最小连接。(适合数据库负载均衡,不适合会话短的环境)uri
:对部分或整体URI进行hash运算,再与服务器的总权重想除,最后转发到匹配后端。uri_param
:根据URL路径中参数进行转发,保证在后端服务器数量不变的情况下,同一用户请求分发到同一机器。hdr(<name>)
:根据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
解析配置:
web
字段,这会走到192.168.92.101服务器中修改完配置文件,有可能会报错
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。