
HAProxy的安装和配置详解
HAProxy 是法国人Willy Tarreau开发的一个开源软件,是一款应对客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡器。其功能是用来提供基于cookie的持久性, 基于内容的交换,过载保护的高级流量管制,自动故障切换,以正则表达式为基础的标题控制运行时间,基于Web的报表,高级日志记录以帮助排除故障的应用或网络及其他功能。HAProxy提供高可用性、负载均衡以及基于TC
HAProxy的安装和配置详解
一、haproxy 简介
HAProxy 是法国人Willy Tarreau开发的一个开源软件,是一款应对客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡器。其功能是用来提供基于cookie的持久性, 基于内容的交换,过载保护的高级流量管制,自动故障切换,以正则表达式为基础的标题控制运行时间,基于Web的报表,高级日志记录以帮助排除故障的应用或网络及其他功能。
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
1、LVS、Haproxy、Nginx区别
- LVS基于Linux操作系统实现软负载均衡,而Haproxy和Nginx是基于第三方应用实现的软负载均衡
- LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而实现Haproxy和Nginx都可以实现4层和7层技术,Haproxy可提供TCP和Http应用的负载均衡综合解决方案
- LVS因为工作在ISO模型的第四层,其状态监测功能单一,而Haproxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态监测方式
- Haproxy功能强大,但整体性能低于4层模式的LVS负载均衡
- Nginx主要用于web服务器或缓存服务器
- Haproxy也是支持虚拟主机的
- Haproxy支持8种负载均衡器策略
- Haproxy的优点能补充nginx的一些缺点,比如支持Session的保持,Cookie的引导,同时支持通过获取指定url来检测后端服务器的状态
- Haproxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲Haproxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的
- Haproxy支持TCP协议的负载均衡转发
一图总结对比
分别从Nginx、LVS和HAProxy 3种负载均衡软件的优缺点、适用性和量级等角度进行详细的对比
2、HAProxy特点和优点:
- 支持原声SSL,同时支持客户端和服务器的SSL.
- 支持IPv6和UNIX套字节(sockets)
- 支持HTTP Keep-Alive
- 支持HTTP/1.1压缩,节省宽带
- 支持优化健康检测机制(SSL、scripted TCP、check agent…)
- 支持7层负载均衡。
- 可靠性和稳定性非常好。
- 并发连接 40000-50000个,单位时间处理最大请求 20000个,最大数据处理10Gbps.
- 支持8种负载均衡算法,同时支持session保持。
- 支持虚拟主机。
- 支持连接拒绝、全透明代理。
- 拥有服务器状态监控页面。
- 支持ACL。
3、HAProxy保持会话的三种解决方法
HAProxy为了让同一客户端访问服务器可以保持会话。有三种解决方法:客户端IP、Cookie以及Session。
- 通过 客户端IP 进行Hash计算并保存,以此确保当相同IP访问代理服务器可以转发给固定的真实服务器。
- 依靠真实服务器发送客户端的 Cookie信息 进行会话保持。
- 将保存真实服务器的 Session 以及服务器标识 ,实现会话保持。(HAProxy只要求后端服务器能够在网络联通,也没有像LVS那样繁琐的ARP配置)
4、HAProxy的balance 8种负载均衡算法:
roundrobin
:基于权重轮循。static-rr
: 基于权重轮循。静态算法,运行时改变无法生效source
: 基于请求源IP的算法。对请求的源IP进行hash运算,然后将结果与后端服务器的权重总数想除后转发至某台匹配服务器。使同一IP客户端请求始终被转发到某特定的后端服务器。leastconn
:最小连接。(适合数据库负载均衡,不适合会话短的环境)uri
:对部分或整体URI进行hash运算,再与服务器的总权重想除,最后转发到匹配后端。uri_param
:根据URL路径中参数进行转发,保证在后端服务器数量不变的情况下,同一用户请求分发到同一机器。hdr(<name>)
:根据http头转发,如果不存在http头。则使用简单轮循。
5、HAProxy 主要工作模式
- tcp模式:在客户端和服务器之间将建立一个全双工的连接,且不会对7层的报文做任何处理的简单模式。
通常用于SSL、SSH、SMTP等应用层。 - http模式(一般使用):客户端请求在转发给后端服务器之前会被深度分析,所有不与RFC格式兼容的请求都会被拒绝。
二、HAProxy 安装
有两种方式可以安装,tar.gz包和yum的方式 相对于编译部署,通过yum安装更简单便捷
1.HAProxy版本说明
本文将展示在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怎么办呢?
方法一:rpm包安装过程(推荐)
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安装过程
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 的使用
1.HAProxy 配置文件
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配置
- 用于设置配置默认参数,这些参数可以被用到frontend,backend,listen组件。在此部分中设置的参数值,默认会自动引用到下面的frontend、backend、listen部分中。如果某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了与defaults部分一样的参数,defaults部分参数对应的值自动被覆盖。
- mode http:设置haproxy的运行模式,有三种{http|tcp|health}。注意:如果haproxy中还要使用4层的应用(mode tcp)的话,不建议在此定义haproxy的运行模式。
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是在haproxy 1.3版本以后才引入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了haproxy配置文件的复杂性。forntend可以根据ACL规则直接指定要使用的后端backend。
如:
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
2.实现一个负载均衡
环境准备
主机名 | ip地址 | 备注 |
---|---|---|
Haproxy | 192.168.92.110 | haproxy |
web服务器 | 192.168.92.100 | web |
web服务器 | 192.168.92.1101 | web |
listen 实现一个简单的负载均衡
#实现一个负载均衡
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 处理不同的 URL 请求ACL:
访问控制列表(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
解析配置:
- 当访问的url中包含
web
字段,这会走到192.168.92.101服务器中 - 其他默认走到192.168.92.100服务器中
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
4.日志处理
Haproxy 的日志默认输出到系统的 syslog 中,为了更好的管理 Haproxy 的日志,在生产环境中一般单独定义出来。
1.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日志分别记录到不同的日志文件中
2.修改rsyslog配置
为了便于管理,将 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 脚本语言)
3.重启rsyslog服务,查看日志文件是否创建成功
[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
更多推荐
所有评论(0)