当前位置: 首页 > backend >正文

haproxy七层代理

一、负载均衡

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

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 不会出现任何东西因为这个是有证书的)

http://www.xdnf.cn/news/15837.html

相关文章:

  • 嵌入式硬件篇---继电器
  • C#.NET EFCore.BulkExtensions 扩展详解
  • 物联网安装调试-温湿度传感器
  • 分布式文件系统04-DataNode海量数据分布式高可靠存储
  • python中读取 Excel 表格数据
  • 【数据结构】揭秘二叉树与堆--用C语言实现堆
  • 【MySQL】索引中的页以及索引的分类
  • LLVM中AST节点类型
  • string【下】- 补充
  • MySQL中的排序和分页
  • 集群与高可用
  • Facebook 开源多季节性时间序列数据预测工具:Prophet 饱和预测 Saturating Forecasts
  • Go并发聊天室:从零构建实战
  • Shell脚本-tee工具
  • 小程序和H5数据mock配置过程
  • 前端环境搭建---基于SpringBoot+MySQL+Vue+ElementUI+Mybatis前后端分离面向小白管理系统搭建
  • LLM 的Top-P参数 是在LLM中的每一层发挥作用,还是最后一层?
  • SpringBoot五分钟快速入门指南
  • NW993NX584美光固态闪存NX559NX561
  • [故障诊断方向]基于二维时频图像和数据增强技术的轴承故障诊断模型
  • 数据分析综合应用 30分钟精通计划
  • 动态规划——数位DP经典题目
  • 量子计算与AI融合的技术突破与实践路径
  • 6. 装饰器模式
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pillow’问题
  • 小架构step系列19:请求和响应
  • Java行为型模式---中介者模式
  • [故障诊断方向]SNNs:针对小样本轴承故障诊断的孪生神经网络模型
  • Selenium 中 findElement 方法全解析:定位网页元素的 7 种方式
  • BeanFactory 和 FactoryBean 的区别