简介
HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件
是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器
支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计
企业版网站:https://www.haproxy.com
社区版网站:https://www.haproxy.org
github:https://github.com/haproxy
版本对比
功能 | 社区版 | 企业版 |
---|---|---|
高级HTTP / TCP负载平衡和持久性 | 支持 | 支持 |
高级健康检查 | 支持 | 支持 |
应用程序加速 | 支持 | 支持 |
高级安全特性 | 支持 | 支持 |
高级管理 | 支持 | 支持 |
HAProxy Dev Branch新功能 | 支持 | |
24*7 支持服务 | 支持 | |
实时仪表盘 | 支持 | |
VRRP和Route Health Injection HA工具 | 支持 | |
ACL,映射和TLS票证密钥同步 | 支持 | |
基于应用程序的高级DDoS和Bot保护(自动保护) | 支持 | |
Bot(机器人)监测 | 支持 | |
Web应用防火墙 | 支持 | |
HTTP协议验证 | 支持 | |
实时集群追踪 | 支持 |
基本配置信息
官方文档:[HAProxy version 2.2.22 - Configuration Manual]
HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分
global:
全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置
global配置参数
![](https://i-blog.csdnimg.cn/direct/44c4cc8f76c8401e902c9ff6f8209e52.png)
Proxies配置
defaults
defaults 配置参数:
option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose #当服务器负载很高时,自动结束掉当前队列处理比较久的链接,针对业务情况选择开启
option http-keep-alive #开启与客户端的会话保持
option forwardfor #透传客户端真实IP至后端web服务器
mode http|tcp #设置默认工作类型,使用TCP服务器性能更好,减少压力
timeout http-keep-alive 120s #session 会话保持超时时间,此时间段内会转发到相同的后端服务器
timeout connect 120s #客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前),默认单位ms
timeout server 600s #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms,如果超时,会出现502错误,此值建议设置较大些,访止502错误
timeout client 600s #设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同
timeout check 5s #对后端服务器的默认检测超时时间
default-server inter 1000 weight 3 #指定后端服务器的默认设置
frontend
frontend 配置参数:
bind: #指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
#格式:
bind [<address>]:<port_range> [, ...] [param*]
#注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1
backend
定义一组后端服务器,backend服务器将被frontend进行调用。
mode http|tcp #指定负载协议类型,和对应的frontend必须一致
option #配置选项
server #定义后端real server
socat工具
对服务器动态权重和其它状态可以利用socat工具进行调整,Socat 是Linux 下的一个多功能的网络工具,名字由来是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如IP、TCP、UDP、IPv6、Socket文件等。
使用案例:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
......
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.254.10:80
server web2 172.25.254.20:80
......
#socat使用
#查看haproxy状态
[root@haproxy ~]#echo "show info" | socat stdio /var/lib/haproxy/stats
#查看serer服务器的状态
[root@haproxy ~]#echo "show servers state" | socat stdio /var/lib/haproxy/stats
#查看server权重
[root@haproxy ~]#echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
#更改server的权重
[root@haproxy ~]#echo "set weight webcluster/web1 1 " | socat stdio /var/lib/haproxy/stats
#让指定的server服务器disable
[root@haproxy ~]#echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
Haproxy算法
静态算法
按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和响应速度等,且无法实时修改权重,只能靠重启HAProxy生效。
static-rr
基于权重的轮询调度,不支持权重的运行时利用socat进行动态调整及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的 wrr
listen webcluster
bind *:80
mode http
balance static-rr
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
first
根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置,此方式使用较少
listen webcluster
bind *:80
mode http
balance first
server web1 172.25.254.10:80 maxconn 1 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
动态算法
基于后端服务器状态进行调度适当调整,优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。
roundrobin
基于权重的轮询动态调度算法,支持权重的运行时调整,不同于lvs中的rr轮训模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个real server,支持对real server权重动态调整,roundrobin为默认调度算法
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
leastconn
加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度(新客户端连接),比较适合长连接的场景使用,比如:MySQL等场景。
listen webcluster
bind *:80
mode http
balance leastconn
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 3
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
高级功能实验
基于cookie的会话保持
不支持 tcp mode,使用 http mode
#cookie
listen webcluster
bind *:80
mode http
balance roundrobin
cookie WEBCOOKIE insert nocache indirect
server web1 172.25.254.10:80 cookie lee1 check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 cookie lee2 check inter 2 fall 3 rise 5 weight 1
server web3_sorry 172.25.254.100:8080 backup
验证cookie信息
点击刷新一直是同一个网页内容则成功
IP透传
四层:IP+PORT转发
七层:协议+内容交换
四层负载
在四层负载设备中,把client发送的报文目标地址(原来是负载均衡设备的IP地址),根据均衡设备设置的选择web服务器的规则选择对应的web服务器IP地址,这样client就可以直接跟此服务器建立TCP连接并发送数据,而四层负载自身不参与建立连接,而和LVS不同,haproxy是伪四层负载均衡,因为haproxy 需要分别和前端客户端及后端服务器建立连接
七层代理
七层负载均衡服务器起了一个反向代理服务器的作用,服务器建立一次TCP连接要三次握手,而client要访问webserver要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的webserver,然后通过三次握手与此台webserver建立TCP连接,然后webserver把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client;所以,七层负载均衡设备起到了代理服务器的作用,七层代理需要和Client和后端服务器分别建立连接
七层ip透传
HAProxy配置
default增加forwardfor选项
webserver1服务器配置文件(apache)
[root@webserver2 ~]# systemctl restart httpd
webserver2服务器配置文件(nginx)
[root@webserver2 ~]# vim /etc/nginx/nginx.conf
[root@webserver2 ~]# systemctl restart nginx.service
测试
apache
nginx
四层透传
修改mode 为tcp
listen webcluster
bind *:80
mode tcp
balance roundrobin
server web1 172.25.254.10:80 send-proxy check inter 2 fall 3 rise 5 weight 1
server web2 172.25.254.20:80 send-proxy check inter 2 fall 3 rise 5 weight 1
在NGINX配置内添加变量proxy_protocol_addr 记录透传过来的客户端IP,并启用proxy_protocol代理功能
测试
HAProxy状态页面
可以通过 Web界面监测状态
状态页配置项
stats enable #基于默认的参数启用stats page
stats hide-version #将状态页中haproxy版本隐藏
stats refresh <delay> #设定自动刷新时间间隔,默认不自动刷新
stats uri <prefix> #自定义stats page uri,默认值:/haproxy?stats
stats realm <realm> #账户认证时的提示信息,示例:stats realm HAProxy\ Statistics
stats auth <user>:<passwd> #认证时的账号和密码,可使用多次,默认:no authentication,可有多行用户
stats admin { if | unless } <cond> #启用stats page中的管理功能
实例
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen stats
mode http
bind *:9999
stats enable
stats hide-version
stats refresh 3
stats uri /status
stats auth ran:ran
[root@haproxy ~]# systemctl restart haproxy.service
测试
sorry server
在后端服务器全部无法访问时,提供错误响应
HAProxy
下载HTTPD,修改端口,启动httpd
关闭后端服务器进行测试
自定义错误页面
[root@haproxy ~]#mkdir -p /etc/haproxy/errorpage/
[root@haproxy ~]#vim /etc/haproxy/errorpage/badpage.http
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html>
<meta charset="UTF-8">
<body><h1>这是一个错误页面 Service Unavailable</h1>
No server is available to handle this request.
</body></html>
~
配置到default区域
重启haproxy服务
测试(关闭两台web服务器)