目录
一、HAProxy概念
1.1 什么是 HAProxy ?
HAProxy(High Availability Proxy)是一个高性能的TCP/HTTP负载均衡器,专为高可用性环境设计。它旨在提供快速且可靠的负载均衡解决方案,同时保持较低的CPU消耗。
1.2 HAProxy 优势
高性能:HAProxy 能够处理成千上万的并发连接,同时保持低延迟和高吞吐量。maxconn 2000
意味着HAProxy可以同时处理多达2000个并发连接。
高可用性:HAProxy支持多种健康检查机制,可以实时监控后端服务器的状态,确保只有健康的服务器才会接收请求。它还提供了会话保持(session persistence)功能,确保来自同一客户端的请求被转发到同一后端服务器,即使在高负载或故障转移情况下也能保持会话的连续性。
灵活性:HAProxy支持多种协议,包括TCP、HTTP、HTTPS、FTP等,并且可以通过配置来优化每种协议的性能。它还提供了丰富的配置选项,允许用户根据具体需求定制负载均衡策略,如轮询(round-robin)、最少连接(leastconn)、源地址哈希(source)等。
二、配置基础
配置文件haproxy.cfg解读:/etc/haproxy/haproxy.cfg
2.1 全局设置
定义了影响整个 HAProxy 进程的全局参数。
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# 调试和统计设置
stats socket /var/lib/haproxy/stats
log
:定义日志记录的地址和级别。chroot
:将 HAProxy 进程的工作目录更改到指定的目录,提高安全性。pidfile
:指定 HAProxy 进程 PID 文件的路径。maxconn
:设置 HAProxy 单个进程能接受的最大并发连接数。user
和group
:设置 HAProxy 进程运行的用户和组。daemon
:使 HAProxy 以守护进程模式运行。stats socket
:配置统计套接字的路径,用于收集 HAProxy 的运行数据。
2.2 默认设置
此部分定义了所有前端和后端默认的配置选项,可以被后续的 frontend
、backend
和 listen
区块覆盖。
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
timeout connect 10s
timeout client 1m
timeout server 1m
maxconn 2000
errorfile 503 /etc/haproxy/errorpage/503.http
mode
:定义 HAProxy 的工作模式,http
表示 HTTP 模式,tcp
表示 TCP 模式。log
:启用日志记录。option
:定义不同的选项,如httplog
用于记录 HTTP 请求的日志,dontlognull
表示不记录空连接日志等。timeout
:设置不同类型的超时时间,如连接超时、客户端超时、服务器超时等。mode
:定义了 HAProxy 的工作模式(如 http、tcp)。maxconn:
最大连接数。errorfile
:定义特定 HTTP 错误代码的响应文件路径。
2.3 前端设置
前端定义了如何接收和处理进入 HAProxy 的连接。
frontend http-in
bind *:80
mode http
default_backend servers
bind
:指定 HAProxy 监听的地址和端口。mode
:定义此前端的工作模式。default_backend
:指定了默认的后端服务器组。
2.4 后端设置
后端定义了如何将请求分发到后端服务器。
backend servers
balance roundrobin
server app1 172.25.254.10:80 check
server app2 172.25.254.20:80 check
balance
:定义了负载均衡算法(如 roundrobin、leastconn 等)。
server
:定义了后端服务器的地址、端口和检查选项。
2.4.1 相关参数
server <name> <address>:<port> [param1=value1] ...
定义一个后端服务器。<name>
是服务器的名称,<address>
是服务器的IP地址,<port>
是端口号。后面的[param1=value1]...
是可选参数,用于进一步配置服务器,如权重(weight)、检查间隔(check inter)、检查失败次数(fall)、检查成功次数(rise)等。
权重(weight
):设置服务器的相对权重,用于负载均衡算法中的权重分配。
检查间隔(check interval
):设置健康检查的时间间隔,以毫秒(ms)或秒(s)为单位。注意,在某些配置中,inter
可能是 interval
的简写,但最好使用完整的 interval
以避免混淆。
检查失败次数(fall
):指定在认为服务器不可用之前,需要连续失败的健康检查次数。
检查成功次数(rise
):指定在认为服务器重新可用之前,需要连续成功的健康检查次数。
检查命令(check
):虽然通常与 check interval
、fall
、rise
等参数一起使用来启用健康检查,但 check
本身也可以后跟特定的检查命令或协议(如 check http
、check tcp
等),以指定检查服务器健康状态的方法。
超时设置:timeout connect
:设置与服务器建立连接的超时时间。timeout server
:设置服务器响应的超时时间(即服务器处理请求并返回响应的时间)。这些超时设置通常不在 server
指令中直接设置,而是在 defaults
、frontend
或 backend
块中设置,但可以在 server
指令中通过 timeout check
来设置健康检查的超时时间。
备份服务器(backup
):标记该服务器为备份服务器,仅在所有非备份服务器都不可用时才会向其发送请求。
禁用(disabled
):暂时禁用该服务器,使其不会接收任何请求。
2.5 监听配置
listen
部分是 frontend
和 backend
的组合,适用于简单配置,无需分别定义前端和后端。
2.6 监听统计信息
统计页面,用于监控和管理后端服务器。
listen stats
bind *:9999
mode http
stats enable
stats uri /stats
stats auth admin:password
这个配置在 9999 端口上开启了一个 HTTP 统计页面,需要用户名和密码访问。 后面有实例。
三、haproxy 的算法
3.1 静态算法:
Round Robin(轮询):按照后端服务器列表的顺序依次将请求分发给每个服务器,然后再从头开始。每个服务器依次接收请求,实现负载均衡。适用于后端服务器性能相近的情况。
Static-Weight(静态权重):手动设置每个后端服务器的权重值。根据权重值来决定每个服务器获得请求的比例。可以根据服务器性能、硬件配置等设置不同的权重,以实现负载均衡。
Source IP Hash(源IP哈希):根据客户端的IP地址计算哈希值,并将请求分发到对应的服务器。这样,相同IP的请求总是被分发到同一个后端服务器上。
URI Hash(URI哈希):根据请求的URI(URL)计算哈希值,并将请求分发到对应的服务器。用于确保特定URI的请求总是发送到同一个后端服务器。
URL Parameter(URL参数):根据请求的URL参数来选择后端服务器。例如,可以根据某个特定的URL参数值来分发请求。
Static-Weight(静态权重):
backend web_servers
mode http
balance static-rr
server webserver1 172.25.254.10:80 check
server webserver2 172.25.254.20:80 check
round robin:
backend web_servers
mode http
balance roundrobin
server webserver1 172.25.254.10:80 check
server webserver2 172.25.254.20:80 check
Source IP Hash(源IP哈希):
backend web_servers
mode http
balance source
server webserver1 172.25.254.10:80 check
server webserver2 172.25.254.20:80 check
3.2 动态算法:
Least Response:
算法会选择响应时间最短的服务器来处理请求。它会测量后端服务器的响应时间,并将请求分发给响应时间最短的服务器,以确保请求能够尽快获得响应。这使得负载均衡器可以动态地选择性能最好的服务器来处理请求,从而优化整体性能。
backend web_servers
mode http
balance leastresponse
server webserver1 172.25.254.10:80 check
server webserver2 172.25.254.20:80 check
Least Connections(最少连接数):
backend web_servers
mode http
balance leastconn
server webserver1 172.25.254.10:80 check
server webserver2 172.25.254.20:80 check
URI Hash(URI哈希):
backend web_servers
mode http
balance uri
server webserver1 172.25.254.10:80 check
server webserver2 172.25.254.20:80 check
URL Parameter(URL参数):
backend web_servers
mode http
balance url_param sid
server webserver1 172.25.254.10:80 check
server webserver2 172.25.254.20:80 check
3.3 随机算法
hdr取模法:
backend web_servers
mode http
balance hdr(User-Agent)
server webserver1 172.25.254.10:80 check
server webserver2 172.25.254.20:80 check
除以上总结的外,还有其他算法,有需求的话可以去了解!!
四、高级功能
4.1 基于 cookie 的会话保持
会话保持实现方式:Cookie&&Session
使用Cookie是最常见的会话保持技术。当用户首次访问网站时,服务器会在响应中设置一个会话Cookie,并在用户浏览器中存储一个唯一的会话标识(通常是一个加密的字符串)。
在随后的每个请求中,浏览器都会自动将该会话Cookie包含在请求头中,使得服务器能够识别并与用户的会话进行关联。
会话Cookie通常具有过期时间,这样一旦用户关闭浏览器,会话Cookie就会失效,会话数据也会被清除,从而保护用户的隐私。
会话保持中服务器传输Session ID的过程可以通过Cookie来描述,因为Cookie是最常见的会话保持机制。
什么是"cookie"?用简单的话来解释,“cookie” 就像是网站和你之间的一张小便条,它记录了一些信息,以便在你后续的访问中提供更好的体验。
配置示例:
验证cookie信息:
4.2 IP透传
IP透传允许后端服务器接收到来自客户端的真实IP地址,而不是负载均衡器自身的IP地址。
4层透传
在四层(传输层)进行IP透传时,HAProxy将客户端发送的报文中的目标地址(原本是负载均衡器的IP地址)替换为后端服务器的IP地址,但保留客户端的源IP地址不变。这样,后端服务器在接收到报文时,可以直接从报文中获取到客户端的真实IP地址。
backend app_servers
bind 172.25.254.100:80
mode tcp
balance roundrobin
server webserver1 172.25.254.10:80 send-proxy check
server webserver2 172.25.254.20:80 send-proxy check
7层透传
在七层(应用层)进行IP透传时,HAProxy作为反向代理服务器,会在转发请求给后端服务器之前,在HTTP请求头中添加表示客户端真实IP地址的字段。后端服务器在接收到请求时,可以从请求头中读取该字段以获取客户端的真实IP地址。
defaults
option forwardfor
backend app_servers
bind 172.25.254.100:80
mode http
balance roundrobin
server webserver1 172.25.254.10:80 check
server webserver2 172.25.254.20:80 check
示例:通过IP透传技术,查看日志时,看到了访问主机的IP为172.25.254.6 :
4.3 ACL
基本格式:acl <aclname> <criterion> [flags] [operator] [<value>]
常用参数 :
<aclname>
: 自定义的ACL名称,用于后续引用。<criterion>
: 匹配的依据,如hdr
(HTTP请求头)、path
(URL路径)、src
(源IP地址)等。[flags]
: 可选的标志,用于修改匹配行为,如-i
表示不区分大小写。[operator]
: 操作符,如eq
(等于)、beg
(以...开始)、reg
(正则表达式匹配)等。[<value>]
: 与<criterion>
和[operator]
结合使用的匹配值。
说明:acl:区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl。
-i:忽略大小写
-f:从指定的文件中加载模式;
常用的方法:
1)hdr_beg(host):用于测试请求报文的指定首部的开头部分是否符合指定的模式
例子:
acl host_static hdr_beg(host) -i img. video. download. ftp.
测试请求是否为提供静态内容的主机img、video、download或ftp。
2)hdr_end(host):用于测试请求报文的指定首部的结尾部分是否符合指定的模式
例子:
acl host_static hdr_beg(host) -i .aa.com .bb.com
3)hdr_reg(host):正则匹配
例子:
acl bbs hdr_reg(host) -i ^(bbs.test.com|shequ.test.com|forum)
4)url_sub:表示请求url中包含什么字符串
5、url_dir:表示请求url中存在哪些字符串作为部分地址路径
6)path_beg: 用于测试请求的URL是否以指定的模式开头
例子:
acl url_static path_beg -i /static /iilannis /javascript /stylesheets
用于测试URL是否以/static、/iilannis、/javascript或/stylesheets开头。
7)path_end:用于测试请求的URL是否以指定的模式结尾
例子:
acl url_static path_end -i .jpg .gif .png .css .js
测试URL是否以.jpg、.gif、.png、.css或.js结尾。
也可以根据访问的地址和端口进行规制设置:
dst:目标地址
dst_port:目标端口
src:源地址
src_port:源端口
实现的结果:
当客户端访问haproxy时,请求的是静态文件内容时,请求转交给static server,请求的是php内容时,请求转交给php server,请求的是jsp内容时,请求转交给tomcat server,以实现动静分离。
五、实例
5.1 acl的应用实例
基于域名的访问
自定义错误页面
一般错误页面都是固定的;比如400、500、502、503、504等。
自定义错误页面示例:
自定义 503.http:
修改配置文件 haproxy.cfg:
在浏览器上测试一下:
还可以通过以下配置:在返回 503 错误时显示一个自定义的 HTML 页面,而不是默认的服务器错误页面。
errorloc 503 https://www.baidu.com
5.2 四层负载实现
实验环境:
主机 |
IP |
haproxy | eth0:172.25.254.100 |
server1 | eth0:172.25.254.10 |
server2 | eth0:172.25.254.20 |
在三台主机上安装 mariadb-server;
为了更好的观察效果,在 server1 和 server2 上修改 /etc/my.cnf.d/mariadb-server.cnf 文件:
在 server1 和 server2 上的数据库中查看一下是否生效:
在 server1 和 server2 上的数据库中:创建用户lxm
并设置其密码;并授予用户lxm
从任何主机连接到数据库服务器时,对数据库服务器上所有数据库(*.*
表示所有数据库和表)拥有全部权限。
编辑HAProxy的配置文件(通常是/etc/haproxy/haproxy.cfg
)
在haproxy上测试:
5.3haproxy的https实现
制作证书和密钥:
查看:
编辑HAProxy的配置文件:haproxy.cfg