HAProxy的安装和配置详解

一、haproxy 简介

  HAProxy 是法国人Willy Tarreau开发的一个开源软件,是一款应对客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡器。其功能是用来提供基于cookie的持久性, 基于内容的交换,过载保护的高级流量管制,自动故障切换,以正则表达式为基础的标题控制运行时间,基于Web的报表,高级日志记录以帮助排除故障的应用或网络及其他功能。
  HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

官方网站:https://www.haproxy.com/

1、LVS、Haproxy、Nginx区别

  1. LVS基于Linux操作系统实现软负载均衡,而Haproxy和Nginx是基于第三方应用实现的软负载均衡
  2. LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而实现Haproxy和Nginx都可以实现4层和7层技术,Haproxy可提供TCP和Http应用的负载均衡综合解决方案
  3. LVS因为工作在ISO模型的第四层,其状态监测功能单一,而Haproxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态监测方式
  4. Haproxy功能强大,但整体性能低于4层模式的LVS负载均衡
  5. Nginx主要用于web服务器或缓存服务器
  6. Haproxy也是支持虚拟主机的
  7. Haproxy支持8种负载均衡器策略
  8. Haproxy的优点能补充nginx的一些缺点,比如支持Session的保持,Cookie的引导,同时支持通过获取指定url来检测后端服务器的状态
  9. Haproxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲Haproxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的
  10. Haproxy支持TCP协议的负载均衡转发

一图总结对比
分别从Nginx、LVS和HAProxy 3种负载均衡软件的优缺点、适用性和量级等角度进行详细的对比
在这里插入图片描述

2、HAProxy特点和优点:

  1. 支持原声SSL,同时支持客户端和服务器的SSL.
  2. 支持IPv6和UNIX套字节(sockets)
  3. 支持HTTP Keep-Alive
  4. 支持HTTP/1.1压缩,节省宽带
  5. 支持优化健康检测机制(SSL、scripted TCP、check agent…)
  6. 支持7层负载均衡。
  7. 可靠性和稳定性非常好。
  8. 并发连接 40000-50000个,单位时间处理最大请求 20000个,最大数据处理10Gbps.
  9. 支持8种负载均衡算法,同时支持session保持。
  10. 支持虚拟主机。
  11. 支持连接拒绝、全透明代理。
  12. 拥有服务器状态监控页面。
  13. 支持ACL。

3、HAProxy保持会话的三种解决方法

HAProxy为了让同一客户端访问服务器可以保持会话。有三种解决方法:客户端IP、Cookie以及Session。

  1. 通过 客户端IP 进行Hash计算并保存,以此确保当相同IP访问代理服务器可以转发给固定的真实服务器。
  2. 依靠真实服务器发送客户端的 Cookie信息 进行会话保持。
  3. 将保存真实服务器的 Session 以及服务器标识 ,实现会话保持。(HAProxy只要求后端服务器能够在网络联通,也没有像LVS那样繁琐的ARP配置)

4、HAProxy的balance 8种负载均衡算法:

  1. roundrobin :基于权重轮循。
  2. static-rr: 基于权重轮循。静态算法,运行时改变无法生效
  3. source : 基于请求源IP的算法。对请求的源IP进行hash运算,然后将结果与后端服务器的权重总数想除后转发至某台匹配服务器。使同一IP客户端请求始终被转发到某特定的后端服务器。
  4. leastconn :最小连接。(适合数据库负载均衡,不适合会话短的环境)
  5. uri :对部分或整体URI进行hash运算,再与服务器的总权重想除,最后转发到匹配后端。
  6. uri_param :根据URL路径中参数进行转发,保证在后端服务器数量不变的情况下,同一用户请求分发到同一机器。
  7. 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

  1. 查看系统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
    
  2. 下载 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 13 14:05 ius-release-el7.rpm
    
  3. 安装 epel-release yum -y install epel-release

  4. 安装 ius-release-el7.rpm rpm -Uvh ius-release*rpm

  5. 安装 haproxy 2.2版 yum install haproxy22

  6. 启动 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源。

  1. 配置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
    
  2. 清理缓存:yum clean all

  3. 更新缓存:yum makecache fast

  4. 查看版本: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 ~]# 
    
  5. 安装2.2版本:yum install -y haproxy22

  6. 查看已安装的haproxy:yum list installed |grep haproxy

  7. 查看版本:haproxy -v,可以看到版本是2.2.1了

  8. 查看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

解析配置:

  1. 当访问的url中包含web 字段,这会走到192.168.92.101服务器中
  2. 其他默认走到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

猜你喜欢

转载自blog.csdn.net/qq_38055805/article/details/129578853
今日推荐