haproxy七层代理
一、负载均衡
作用
动态水平扩展(用户无感知)
提升并发处理能力(解决单点瓶颈)
节约公网IP(降低成本)
隐藏后端服务器IP(增强安全)
支持四层(TCP/UDP)和七层(HTTP)代理
高性能(数万至数十万并发)
类型对比
四层(L4):
基于IP+端口转发
修改报文头部目标地址(NAT)
记录TCP/UDP会话状态
工具:LVS(重量级)、Nginx(轻量级)、HAProxy(模拟)
七层(L7):
基于应用层信息(URL/Header等)
代理客户端与后端建立独立连接
工具:Nginx(HTTP协议)、HAProxy(会话保持/路径转移)
二、HAProxy核心配置
1. 配置文件结构
global # 全局参数(进程/性能/日志)defaults # 默认参数(继承至frontend/backend)frontend # 前端监听(类似Nginx的server)backend # 后端服务器组(类似Nginx的upstream)listen # 简写模式(合并frontend+backend)
2. 关键配置参数
健康检查:
server web1 192.168.23.20:80 check inter 3s fall 3 rise 5
权重调整:
weight 2
(动态算法支持运行时修改)备份服务器:
backup
(仅当主节点全宕机时启用)连接控制:
maxconn 100000
(单服务器最大连接数)
3. 多进程/线程优化
globalnbproc 2 # 启动2个工作进程cpu-map 1 0 # 进程1绑定CPU0cpu-map 2 1 # 进程2绑定CPU1nbthread 2 # 每个进程2个线程 多线程多进程
三、调度算法
1. 静态算法
文件配置(后面要修改balance)
static-rr:
基于权重的轮询(权重仅支持0/1,需重启生效)测试结果
first:
按服务器列表顺序分配(忽略权重)当第一台服务器的连接数达到上限,新请求才会分配给下一台服务测试结果
2. 动态算法
roundrobin(默认):
加权轮询,支持慢启动和动态权重调整测试结果
leastconn:
最少连接数,适合长连接场景(如数据库)测试结果
可以使用socat命令进行修改权重
测试结果
3.其他算法
算法 | 适用场景 | 动态支持 |
---|---|---|
source | 基于客户端IP | 是(一致性哈希) |
uri | 缓存服务器(CDN) | 是 |
url_param | 电商Session保持(如userid) | 是 |
hdr(User-Agent) | 按浏览器类型调度 | 是 |
一致性哈希配置hash-type consistent
source
缺陷:如果访问客户端时一个家庭,那么所有的家庭的访问流量都会被定向到一台服务器
测试结果
uri
基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后 根据最终结果将请求转发到后端指定服务器
url_param
对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器 总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商 通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server
测试结果
hdr
针对用户每个http头部(header)请求中的指定信息做hash, 此处由 name 指定的http首部将会被取出并做hash计算, 然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。
测试结果
四.高级功能及配置
1.基于cookie的会话保持
(响应头返回Set-Cookie: SERVERID=s1_weight
,后续请求带此Cookie定向到rs1)
cookie配置
基于linux的测试结果
2.HAProxy状态页
通过web界面,显示当前HAProxy的运行状态
状态页配置
测试结果
3.四层IP透传
在四层下记录客户端的真实IP地址
在haproxy的主机下将mode中的http改为tcp(四层tcp/udp,七层http)
并在下面添加send-proxy
rs配置(rs1和rs2都要)
添加变量' "$proxy_protocol_addr"'记录透传过来的客户端IP
添加proxy_protocol,将无法直接访问此网站,只能通过四层代理
两次测试对比
七层IP透传
当haproxy工作在七层的时候,也可以透传客户端真实IP至后端服务器
在配置上除了把mode改为http外,还需添加option forwardfor,其余与四层一样
4.ACL
访问控制列表ACL, 是一种基于包过滤的访问控制技
ACL配置选项
ACL-criterion 匹配规范
ACL-flags 匹配模式
ACL-operator 具体操作符
ACL-value 操作对象
多个ACL的逻辑处理
示例acl test hdr_end(host) -i .com #以.com结尾
acl acceptsrc src 192.168.23.40 #主机ip
use_backend webservera if test #表示如果test符合则访问webservera
default_backend webserverb #表示如果不符合则访问webserverb
http-request deny if acceptsrc test #表示在192.168.23.40上访问以.com结尾的会拒绝访问
测试
5. 自定义HAProxy 错误界面
haproxy默认使用的错误错误页面
haproxy配置(rs1和rs2要关闭nginx)
创建errorpage目录和503.http文件
测试
基于http重定向错误页面(其他配置与前面一样)
6. HAProxy 四层负载
haproxy配置
rs1和rs2配置
首先安装MySQL
添加serverid
创建用户和密码,提供权限并刷新权限
测试
7 HAProxy https 实现
证书制作
https配置示例
测试(如果只是curl 192.168.23.10 不会出现任何东西因为这个是有证书的)