haproxy七层代理

发布于:2025-07-22 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、负载均衡

  1. 作用

    • 动态水平扩展(用户无感知)

    • 提升并发处理能力(解决单点瓶颈)

    • 节约公网IP(降低成本)

    • 隐藏后端服务器IP(增强安全)

    • 支持四层(TCP/UDP)和七层(HTTP)代理

    • 高性能(数万至数十万并发)

  2. 类型对比

    • 四层(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. 多进程/线程优化

global
  nbproc 2      # 启动2个工作进程
  cpu-map 1 0   # 进程1绑定CPU0
  cpu-map 2 1   # 进程2绑定CPU1
  nbthread 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 不会出现任何东西因为这个是有证书的)


网站公告

今日签到

点亮在社区的每一天
去签到