1. HAProxy简介

HAProxy是法国开发者威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件 ,是一款具备高并发(一 万以上)、高性能的TCP和HTTP负载均衡器 , 支持基于cookie的持久性、自动故障切换 ,支持正则表达式及web状态统计 , 目前最新TLS版本为2.0。

HAProxy是一个免费的负载均衡软件 , 可以运行于大部分主流的Linux操作系统上。

HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力 , 具备丰富的功能。HAProxy的社区非常活跃 , 版本更新快速。最关键的是, HAProxy 具备媲美商用负载均衡器的性能和稳定性。

haproxy特别适用于那些负载特别大的web站点 , 这些站点通常又需要会话保持或七层处理。haproxy运行在时下的硬件上 , 完全可以支持数以万计的并发连接 , 并且它的运行模式使得它可以很简单安全的整合进您当前的架构中 , 同时可以保护你的web服务器不被暴露到网络上。

haproxy实现了一种事件驱动、单一进程模型 , 此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制 , 很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space)实现所有这些任务 , 所以没有这些问题。此模型的弊端是 , 在多核系统上 , 这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。

从2013年HAProxy分为社区版和企业版 , 企业版将提供更多的特性和功能以及全天24小时的技术支持等服务。

HAproxy企业版 : https://www.haproxy.com/

HAproxy社区版 : http://www.haproxy.org/

github : https://github.com/haproxy

  • haproxy的优点

    • 免费开源 , 稳定性也是非常好。单haproxy也跑得不错 , 稳定性可以与硬件级的F5相媲美。

    • 根据官方文档 , haproxy可以跑满10Gbps ,这个数值作为软件级负载均衡器是相当惊人的。

    • haproxy支持连接拒绝 : 因为维护一个连接的打开的开销是很低的 , 有时我们很需要限制攻击蠕虫(attack bots) , 也就是说限制它们的连接打开从而限制它们的危害。这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点 , 这个优点也是其它负载均衡器没有的。

    • haproxy支持全透明代理(已具备硬件防火墙的典型特点) : 可以用客户端IP地址或者任何其他地址来连接后端服务器。这个特性仅在Linux 2.4/2.6内核打了tcp proxy补丁后才可以使用。这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。

    • haproxy现多于线上的Mysql集群环境 , 我们常用于它作为MySQL(读)负载均衡。

    • 自带强大的监控服务器状态的页面 , 实际环境中我们结合Nagios进行邮件或短信报警。

    • HAProxy支持虚拟主机 , 许多朋友说它不支持虚拟主机是错误的 , 通过测试我们知道 , HAProxy是支持虚拟主机的。

  • HAProxy功能

    • TCP和HTTP反向代理

    • SSL/TSL服务器

    • 可以针对HTTP请求添加cookie , 进行路由后端服务器

    • 可平衡负载至后端服务器 , 并支持持久连接

    • 支持所有主服务器故障切换至备用服务器

    • 支持专用端口实现监控服务

    • 支持不影响现有连接情况下停止接受新连接请求

    • 可以在双向添加 , 修改或删除HTTP报文首部

    • 响应报文压缩

    • 支持基于pattern实现连接请求的访问控制

    • 通过特定的URI为授权用户提供详细的状态信息

  • 不具备功能

    • 正向代理--squid,nginx

    • 缓存代理--varnish

    • web服务--nginx,tengine, apache, php,tomcat

    • UDP --目前不支持UDP协议, 2.1 版本会支持UDP协议代理

    • 单机性能--LVS

2. HAproxy安装

HAproxy官网默认值提供ubuntu的安装包

haproxy编译参数说明

HAProxy 1.8及1.9版本编译参数:

make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 \
USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy

HAProxy 2.0以上版本编译参数:需要指定lua的安装路径

make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 \
USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/ PREFIX=/usr/local/haproxy

2.1 CentOS安装

2.1.1 yum源安装

默认情况下CentOS本身的yum源中HAproxy版本比较低,如果需要安装。 可以通过ius源安装。IUS(Inline with Upstream Stable) 是一个社区项目 , 它旨在为Linux企业发行版提供可选软件的最新版RPM软件包。

[root@centos7 ~]# cd /etc/yum.repos.d/
[root@centos7 yum.repos.d]# wget https://mirrors.aliyun.com/ius/ius-7.repo

CentOS7安装版本>1.8时,直接安装会报如下错误。需要安装openssl11。因此需要直接安装epel源

image-20220502175134467
[root@centos7 ~]#yum install epel-release
[root@centos7 ~]#yum clean all
[root@centos7 ~]#yum makecache

之后直接安装HAProxy

[root@centos7 ~]# yum install haproxy22

2.1.2 编译安装HAproxy

  1. 准备编译环境, 并下载lua以及haproxy源码包。

    [root@centos7 ~]#yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel readline-devel systemd-devel  
    [root@centos7 ~]#wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
    [root@centos7 ~]#wget https://www.haproxy.org/download/2.5/src/haproxy-2.5.6.tar.gz
  2. 编译lua5.3

    HAProxy支持基于lua实现功能扩展 , lua是一种小巧的脚本语言, 于1993年由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组开发 , 其设计目的是为了嵌入应用程序中 , 从而为应用程序提供灵活的扩展和定制功能。

    由于centos自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求 , 因此需要编译安装较新版本的lua环境 , 然后才能编译安装HAProxy , 过程如下 :

    [root@centos7 ~]#tar -xf  lua-5.3.5.tar.gz -C  /usr/local/src
    [root@centos7 ~]# cd /usr/local/src/lua-5.3.5/
    [root@centos7 lua-5.3.5]# make linux test
    [root@centos7 ~]# /usr/local/src/lua-5.3.5/src/lua -v
    Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
  3. 编译HAProxy

    [root@centos7 ~]# mkdir /usr/local/haproxy
    [root@centos7 ~]# tar -xf haproxy-2.5.6.tar.gz
    [root@centos7 ~]# cd haproxy-2.5.6
    [root@centos7 haproxy-2.5.6]# make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/ PREFIX=/usr/local/haproxy
    #编译时:ARCH 表示硬件架构类型
    #TARGET: 系统类型。linux-glibc表示内核大于kernel 2.6.28的系统
    #USE_PCRE: 使用PCRE
    #USE_OPENSSL: 使用openssl功能
    #USE_ZLIB: 使用压缩功能
    #USE_SYSTEMD: 使用systemd功能
    ​
    [root@centos7 haproxy-2.5.6]#make install PREFIX=/usr/local/haproxy
    [root@centos7 ~]# /usr/local/haproxy/sbin/haproxy -v
    HAProxy version 2.5.6-ba44b43 2022/04/26 - https://haproxy.org/
    Status: stable branch - will stop receiving fixes around Q1 2023.
    Known bugs: http://www.haproxy.org/bugs/bugs-2.5.6.html
    Running on: Linux 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64
    ​
    #编译本身,就生成了这个haproxy命令,可以直接将haproxy命令移动到/usr/sbin
  4. 准备haproxy的systemd启动文件

    [root@centos7 ~]# cat /usr/lib/systemd/system/haproxy.service 
    [Unit]
    Description=HAProxy Load Balancer
    After=network-online.target
    Wants=network-online.target
    ​
    [Service]
    EnvironmentFile=-/etc/sysconfig/haproxy
    Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid"
    ExecStartPre=/usr/local/haproxy/sbin/haproxy -f $CONFIG -c -q $OPTIONS
    ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE $OPTIONS
    ExecReload=/usr/local/haproxy/sbin/haproxy -f $CONFIG -c -q $OPTIONS
    ExecReload=/bin/kill -USR2 $MAINPID
    KillMode=mixed
    SuccessExitStatus=143
    Type=notify
    ​
    [Install]
    WantedBy=multi-user.target

    重新加载daemon

    [root@centos7 ~]#systemctl daemon-reload 

  5. 准备配置文件

    [root@centos7 ~]# useradd -r -s /sbin/nologin haproxy
    [root@centos7 ~]# cat /etc/haproxy/haproxy.cfg 
    global
            maxconn 100000
            chroot /usr/local/haproxy
            #stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
            user haproxy
            group haproxy
            daemon
            #nbproc 2  #需要注意2.5版本以后haproxy就弃用了这个选项
            nbthread 2  
            #cpu-map 1 0
            #cpu-map 2 1
            #cpu-map 3 2
            #cpu-map 4 3
            pidfile /run/haproxy.pid
            log 127.0.0.1 local3 info
     
    defaults
            option http-keep-alive
            option  forwardfor
            maxconn 100000
            mode http
            timeout connect 300000ms
            timeout client  300000ms
            timeout server  300000ms
     
    listen stats
            mode http
            bind 0.0.0.0:9999
            stats enable
            log global
            stats uri     /haproxy-status
            stats auth    haadmin:q1w2e3r4ys
     
    listen  web_port
            bind 0.0.0.0:80
            mode http
            log global
            server web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5
    ​
  6. 本机准备http环境,

    #下载httpd,将监听端口修改为8080并启动httpd
    [root@centos7 ~]#yum install httpd
    [root@centos7 ~]# vim /etc/httpd/conf/httpd.conf 
    Listen 0.0.0.0:8080
    ​
    [root@centos7 ~]#systemctl start httpd
  7. 启动haproxy,并用页面访问,访问用户名密码为:haadmin/q1w2e3r4ys

    [root@centos7 ~]# systemctl start haproxy
    [root@centos7 ~]# systemctl status  haproxy
    ● haproxy.service - HAProxy Load Balancer
       Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabled)
       Active: active (running) since Mon 2022-05-02 20:56:47 CST; 46min ago
      Process: 9399 ExecStartPre=/usr/local/haproxy/sbin/haproxy -f $CONFIG -c -q $OPTIONS (code=exited, status=0/SUCCESS)
     Main PID: 9401 (haproxy)
       CGroup: /system.slice/haproxy.service
               ├─9401 /usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
               └─9404 /usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
    ​
    May 02 20:56:47 centos7 systemd[1]: Starting HAProxy Load Balancer...
    May 02 20:56:47 centos7 haproxy[9401]: [NOTICE]   (9401) : New worker (9404) forked
    May 02 20:56:47 centos7 haproxy[9401]: [NOTICE]   (9401) : Loading success.
    May 02 20:56:47 centos7 systemd[1]: Started HAProxy Load Balancer.
    image-20220502214450111

2.2 Ubuntu安装

2.2.1 apt源安装

HAproxy官网默认提供Debian/Ubuntu的安装包。直接访问页面:https://www.haporxy.org。点击如下图即可。

image-20220502153454515

之后选择系统版本以及对应haproxy版本。之后按照提示命令即可

image-20220502162517283
root@ubuntu:~# apt update
root@ubuntu:~# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=21.10
DISTRIB_CODENAME=impish
DISTRIB_DESCRIPTION="Ubuntu 21.10"
root@ubuntu:~# apt-cache madison haproxy
   haproxy | 2.2.9-2ubuntu2.1 | http://mirrors.aliyun.com/ubuntu impish-security/main amd64 Packages
   haproxy | 2.2.9-2ubuntu2.1 | http://mirrors.aliyun.com/ubuntu impish-updates/main amd64 Packages
   haproxy | 2.2.9-2ubuntu2 | http://mirrors.aliyun.com/ubuntu impish/main amd64 Packages
   haproxy | 2.2.9-2ubuntu2 | http://mirrors.aliyun.com/ubuntu impish/main Sources
   haproxy | 2.2.9-2ubuntu2.1 | http://mirrors.aliyun.com/ubuntu impish-security/main Sources
   haproxy | 2.2.9-2ubuntu2.1 | http://mirrors.aliyun.com/ubuntu impish-updates/main Sources
root@ubuntu:~# apt-get install haproxy=2.2.9-2ubuntu2.1

2.2.2 编译安装

  1. 准备环境

    root@ubuntu:~# apt -y install libpcre3-dev zlib1g-dev libsystemd-dev make gcc libssl-dev  libreadline-dev
    root@ubuntu:~#http://www.lua.org/ftp/lua-5.3.5.tar.gz https://www.haproxy.org/download/2.5/src/haproxy-2.5.6.tar.gz
  2. 编译lua5.3

    root@ubuntu:~# tar -xf  lua-5.3.5.tar.gz -C  /usr/local/src
    root@ubuntu:~# cd /usr/local/src/lua-5.3.5/
    root@ubuntu:/usr/local/src/lua-5.3.5#make linux test
    root@ubuntu:/usr/local/src/lua-5.3.5# /usr/local/src/lua-5.3.5/src/lua -v
    Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
  3. 编译HAProxy

    root@ubuntu:~# mkdir  /usr/local/haproxy
    root@ubuntu:~# tar -xf haproxy-2.5.6.tar.gz
    root@ubuntu:~# cd haproxy-2.5.6
    root@ubuntu:~/haproxy-2.5.6# make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/ 
    root@ubuntu:~/haproxy-2.5.6# make install PREFIX=/usr/local/haproxy
    root@ubuntu:~# /usr/local/haproxy/sbin/haproxy -v
    HAProxy version 2.5.6-ba44b43 2022/04/26 - https://haproxy.org/
    Status: stable branch - will stop receiving fixes around Q1 2023.
    Known bugs: http://www.haproxy.org/bugs/bugs-2.5.6.html
    Running on: Linux 5.13.0-19-generic #19-Ubuntu SMP Thu Oct 7 21:58:00 UTC 2021 x86_64
  4. 准备haproxy的systemd启动文件

    root@ubuntu:~# cat /usr/lib/systemd/system/haproxy.service 
    [Unit]
    Description=HAProxy Load Balancer
    After=network-online.target
    Wants=network-online.target
    ​
    [Service]
    EnvironmentFile=-/etc/sysconfig/haproxy
    Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid"
    ExecStartPre=/usr/local/haproxy/sbin/haproxy -f $CONFIG -c -q $OPTIONS
    ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE $OPTIONS
    ExecReload=/usr/local/haproxy/sbin/haproxy -f $CONFIG -c -q $OPTIONS
    ExecReload=/bin/kill -USR2 $MAINPID
    KillMode=mixed
    SuccessExitStatus=143
    Type=notify
    ​
    [Install]
    WantedBy=multi-user.target
    ​

    重新加载systemd配置文件

    root@ubuntu:~#systemctl daemon-reload
    root@ubuntu:~#systemctl unmask haproxy
  5. 准备配置文件

    root@ubuntu:~# useradd -r -s /sbin/nologin haproxy
    root@ubuntu:~# cat /etc/haproxy/haproxy.cfg 
    global
            maxconn 100000
            chroot /usr/local/haproxy
            #stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
            user haproxy
            group haproxy
            daemon
            #nbproc 2  #需要注意2.5版本以后haproxy就弃用了这个选项
            nbthread 2  
            #cpu-map 1 0
            #cpu-map 2 1
            #cpu-map 3 2
            #cpu-map 4 3
            pidfile /run/haproxy.pid
            log 127.0.0.1 local3 info
     
    defaults
            option http-keep-alive
            option  forwardfor
            maxconn 100000
            mode http
            timeout connect 300000ms
            timeout client  300000ms
            timeout server  300000ms
     
    listen stats
            mode http
            bind 0.0.0.0:9999
            stats enable
            log global
            stats uri     /haproxy-status
            stats auth    haadmin:q1w2e3r4ys
     
    listen  web_port
            bind 0.0.0.0:80
            mode http
            log global
            server web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5
  6. 准备http页面 , 并将监听端口设置为8080

    root@ubuntu:~# apt-get install apache2
    root@ubuntu:~# cat /etc/apache2/ports.conf 
    # If you just change the port or add more ports here, you will likely also
    # have to change the VirtualHost statement in
    # /etc/apache2/sites-enabled/000-default.conf
    ​
    Listen 8080
    ​
    <IfModule ssl_module>
            Listen 443
    </IfModule>
    ​
    <IfModule mod_gnutls.c>
            Listen 443
    </IfModule>
    ​
    # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
    root@ubuntu:~# systemctl restart apache2
  7. 启动haproxy,并用页面访问,访问用户名密码为:haadmin/q1w2e3r4ys

    root@ubuntu:~# systemctl start haproxy
    root@ubuntu:~# systemctl status haproxy
    ● haproxy.service - HAProxy Load Balancer
         Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled)
         Active: active (running) since Mon 2022-05-02 14:18:18 UTC; 23min ago
        Process: 23544 ExecStartPre=/usr/local/haproxy/sbin/haproxy -f $CONFIG -c -q $OPTIONS (code=exited, status=0/SUCCESS)
       Main PID: 23546 (haproxy)
          Tasks: 3 (limit: 4588)
         Memory: 50.0M
            CPU: 170ms
         CGroup: /system.slice/haproxy.service
                 ├─23546 /usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
                 └─23548 /usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
    ​
    May 02 14:18:18 ubuntu systemd[1]: Starting HAProxy Load Balancer...
    May 02 14:18:18 ubuntu haproxy[23546]: [NOTICE]   (23546) : New worker (23548) forked
    May 02 14:18:18 ubuntu haproxy[23546]: [NOTICE]   (23546) : Loading success.
    May 02 14:18:18 ubuntu systemd[1]: Started HAProxy Load Balancer.

    image-20220502224320709
    image-20220502224345513


熊熊