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缓存代理--
varnishweb服务--
nginx,tengine,apache,php,tomcatUDP--目前不支持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/haproxyHAProxy 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/haproxy2.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.repoCentOS7安装版本>1.8时,直接安装会报如下错误。需要安装openssl11。因此需要直接安装epel源

[root@centos7 ~]#yum install epel-release
[root@centos7 ~]#yum clean all
[root@centos7 ~]#yum makecache之后直接安装HAProxy
[root@centos7 ~]# yum install haproxy222.1.2 编译安装HAproxy
准备编译环境, 并下载
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编译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编译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准备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准备配置文件
[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 本机准备
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启动
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.
2.2 Ubuntu安装
2.2.1 apt源安装
HAproxy官网默认提供Debian/Ubuntu的安装包。直接访问页面:https://www.haporxy.org。点击如下图即可。

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

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.12.2.2 编译安装
准备环境
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编译
lua5.3root@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编译
HAProxyroot@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准备
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准备配置文件
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准备
http页面 , 并将监听端口设置为8080root@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启动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.
