> 技术文档 > haproxy七层代理

haproxy七层代理


一、负载均衡

1.1.什么是负载均衡

负载均衡:Load Balance,简称LB。是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均 衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了 公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展。

1.2.负载均衡的作用

负载均衡的核心作用可以概括为以下 5 点


1. 提升系统性能(快)

  • 并行处理:将请求分散到多台服务器,避免单台过载,显著降低用户等待时间(如电商秒杀场景)。

  • 资源优化:充分利用集群中每台服务器的计算、存储、网络资源。


2. 保障高可用性(稳)

  • 故障自动隔离:通过健康检查实时剔除故障节点,确保流量仅分配给正常服务器(如某台服务器宕机时自动切换)。

  • 消除单点故障:即使部分服务器崩溃,服务仍可正常运行(如银行系统要求 99.99% 可用性)。


3. 支持弹性扩展(多)

  • 动态扩容:根据流量波动自动增减服务器(如云环境中的“双十一”临时扩容数千台服务器,活动后自动缩容)。

  • 无缝升级:可滚动更新服务器(如先下线部分节点升级,用户无感知)。


4. 安全防护(防)

  • DDoS 防御:分散攻击流量到全网节点,避免单点被压垮(如 Cloudflare 的 Anycast 负载均衡)。

  • 隐藏真实架构:对外仅暴露负载均衡器 IP,后端服务器无需直接暴露公网。


5. 灵活性(活)

  • 会话保持:通过 IP 哈希或 Cookie 绑定,确保同一用户的请求始终分配到固定服务器(如在线购物车场景)。

  • 按需求路由:根据 URL、用户地域、设备类型等条件智能分配流量(如视频流量优先分配到 CDN 节点)。


一句话总结负载均衡的核心作用是让系统“更快、更稳、更多、更防、更活”,是任何需要高并发、高可用的分布式架构的基石。

1.3.为什么使用负载均衡

1.Web服务器的动态水平扩展

2.对用户无感知 增加业务并发访问及处理能力

3.解决单服务器瓶颈问题 节约公网IP地址

4.降低IT支出成本 隐藏内部服务器IP

5.提高内部服务器安全性 配置简单

6.固定格式的配置文件 功能丰富

7.支持四层和七层,支持动态下线主机 性能较强

8.并发数万甚至数十万

1.4.负载均衡的类型

1.DNS负载均衡:通过域名解析将同一域映射到多个IP,用户就近或者轮询访问。

2.硬件负载均衡

F5 美国F5网络公司

Netscaler 美国思杰公司

Array华耀

AD-1000 深信服

3.软件负载均衡

1.四层负载均衡:LVS,haproxy

2.七层负载均衡:Nginx,Envoy,Treafik

4.云负载均衡(托管服务):公有云提供的托管式负载均衡,自动集成弹性伸缩、健康检查、DDoS 防护。

5.混合负载均衡:多层叠加不同负载均衡技术,解决复杂场景问题。

如:用户 → DNS(GSLB) → 云负载均衡(AWS ALB) → Nginx(7 层路由) → 微服务集群

1.4.1.四层负载均衡

四层负载均衡(Layer 4)工作在 OSI 模型的传输层,基于 IP 地址和端口号转发流量,不关注应用层信息(如 HTTP 头部、URL 等),通过 NAT 处理将请求转发到后端服务器,并记录连接对应的服务器,后续流量都通过该服务器处理。其特点是高性能(开销小,接近网络层面)、配置简单、通用性强,适用于所有基于 TCP 或 UDP 的应用(如 Web、邮件、MySQL 等)

 

支持四层负载的软件有:

lvs:重量级四层负载均衡器。

Nginx:轻量级四层负载均衡器,可缓存。(nginx四层是通过upstream模块)

Haproxy:模拟四层转发。

1.4.2.七层负载均衡

七层模式下 HAProxy 扮演“反向代理”,先与客户端完成一次完整的 HTTP/TLS 会话,然后再向选中的后端服务器建立第二条 HTTP/TLS 连接,因此可以在应用层对请求做非常精细的路由、改写、安全和缓存策略。

 

支持的软件:

Nginx:基于http协议(nginx七层是通过proxy_pass)

Haproxy:七层代理,会话保持、标记、路径转移等。

1.4.3.四层与七层的区别
维度 四层(Layer 4 / TCP Mode) 七层(Layer 7 / HTTP Mode) osi层级 传输层(TCP/UDP) 应用层(HTTP/SMTP 等) 决策依据 IP + 端口 IP + 端口 + URL/Header/Cookie/内容 实现原理 仅做 包转发/NAT,一次握手(客户端↔后端),HAProxy 透明 作为 反向代理,两次握手(客户端↔HAProxy;HAProxy↔后端),需解析 HTTP 请求 功能范围 负载均衡、连接复用、健康检查、简单限速 除四层的功能外,还有:会话保持,安全防护,高可用等功能 性能开销 极低(只处理包头) 较高(需解析负载内容,建立新连接) 经典场景 MySQL、Redis、SSH、DNS、RDP 等非 HTTP 长连接 Web、API、微服务、跨语言版本灰度、动静分离等 HTTP 场景

四层 = “快递分拨中心”——只看地址和门牌号,转发最快。

七层 = “智能客服中心”——先看包裹里的信件内容,再决定派给谁,功能更强大但处理更慢。

二、haproxy简介以及参数说明

HAProxy是一款开源、高性能的负载均衡器和代理服务器,专为TCP和HTTP应用而设计。它可以将客户端的请求分发到多台后端服务器,从而提高应用的可用性和性能。HAProxy支持多种负载均衡算法和健康检查机制,是构建高可用性系统的理想选择。

2.1.global配置:

global:全局配置段

进程及安全配置相关的参数

性能调整相关参数

Debug参数

proxies:代理配置段

defaults:为frontend, backend, listen提供默认配置

frontend:前端,相当于nginx中的server {}

backend:后端,相当于nginx中的upstream {}

listen:同时拥有前端和后端配置,配置简单,生产推荐使用

gloabl配置

#参数 log 127.0.0.1 local2#定义全局的syslog服务器:日志服务器需要开启UDP协议,最多可以定义两个 chroot /var/lib/haproxy#锁定运行目录 pidfile /var/run/haproxy.pid#指定pid文件 maxconn 4000#指定最大连接数 user haproxy#指定haproxy的运行用户 group haproxy#指定haproxy的运行用户 daemon#指定haproxy以守护进程方式运行 # turn on stats unix socket stats socket /var/lib/haproxy/stats#指定haproxy的套接字文件 nbproc 2 #指定haproxy的work进程数量,默认是1个 cpu-map 1 0 #指定第一个work绑定第一个cpu核心 cpu-map 2 1 #指定第二个work绑定第二个cpu核心 nbthread 2#指定haproxy的线程数量,默认每个进程一个线程,此参数与nbproc互斥maxsslconn 100000#每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下maxconnrate 100#指定每个客户端每秒建立连接的最大数量
2.1.1启用多进程
#在全局参数下写入nbproc 2#启用多进程cpu-map 1 0#进程和cpu核心绑定,防止cpu抖动而减少系统资源消耗cpu-map 2 1#2 表示第二个进程 1标表示第二个cpu核心#查看多进程信息haproxy haproxy]# pstree -p | grep haproxy  |-haproxy(4816)-+-haproxy(4820)  |  `-haproxy(4821)
2.1.2 启用多线程
#在全局参数下写入#nbproc 2#cpu-map 1 0#cpu-map 2 1nbthread 2 #启用多线程#多线程与多进程互斥,只能启用其中一个

2.2.peoxies配置

2.2.1.参数说明
参数 类型 作用 defaults[] proxies 默认配置项,针对以下的frontend、backend和listen生效,可以多个 name也可以没有name frontend proxies 前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集 群 backend proxies 后端服务器组,等于nginx的upstream和LVS中的RS服务器 listen proxies 将frontend和backend合并在一起配置,相对于frontend和backend 配置更简洁,生产常用
2.2.2.Proxies配置-defaults      
defaults mode  http#HAProxy实例使用的连接协议 log  global #指定日志地址和记录日志条目的 此处的 global表示使用 global配置段中设定的log值。syslog/rsyslog日志设备 option  httplog#日志记录选项,httplog表示记录与 HTTP包括 HTTP请求、会话状态、连接数、源地址以及连接时间等会话相关的各种属性值 option  dontlognull #dontlognull表示不记录空会话连接日志 option http-server-close#等待客户端完整HTTP请求的时间,此处为等待10s。 option forwardfor except 127.0.0.0/8#透传客户端真实IP至后端web服务器在apache配置文件中加入:
%{X-Forwarded-For}i后在webserver中看日志即可看到地址透传信息 option redispatch#当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发 option http-keep-alive#开启与客户端的会话保持 retries 3#连接后端服务器失败次数 timeout http-request 10s#等待客户端请求完全被接收和处理的最长时间 timeout queue 1m#设置删除连接和客户端收到503或服务不可用等提示信息前的等待时间 timeout connect 10s#设置等待服务器连接成功的时间 timeout client 1m#设置允许客户端处于非活动状态,即既不发送数据也不接收数据的时间 timeout server 1m#设置服务器超时时间,即允许服务器处于既不接收也不发送数据的非活动时间 timeout http-keep-alive 10s#session 会话保持超时时间,此时间段内会转发到相同的后端服务器 timeout check 10s#指定后端服务器健康检查的超时时间 maxconn 3000 errorfile 503 /etc/haproxy/errorpage/503page.http
  
2.2.3. Proxies配置-frontend

frontend配置参数:

bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中#格式:bind [
]: [, ...] [param*] #注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1 backlog #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注意:不支持backend

frontend 配置示例:

frontend webserver bind *:80 mode http balance roundrobin use_backend lee-webserver-80-RS #调用backend的名称
2.2.4. Proxies配置-backend
mode http|tcp #指定负载协议类型,和对应的frontend必须一致option  #配置选项server  #定义后端real server,必须指定IP和端口#针对一个server配置check  #对指定real进行健康状态检查,如果不加此设置,默认不开启检查,只有check后面没有其它配置也可以启用检查功能#默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定端口才能实现健康性检查addr  #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量port  #指定的健康状态监测端口inter  #健康状态检查间隔时间,默认2000 msfall  #后端服务器从线上转为线下的检查的连续失效次数,默认为3rise  #后端服务器从下线恢复上线的检查的连续有效次数,默认为2 weight  #默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接backup #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似Sorry Server disabled #将后端服务器标记为不可用状态,即维护状态,除了持久模式 #将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求redirect prefix http://www.baidu.com/ #将请求临时(302)重定向至其它URL,只适用于http模式maxconn  #当前后端server的最大并发连接数  #sever配置backend webserver #server web1 192.168.75.10:80 #server web2 192.168.75.20:80
2.2.5.Proxies配置-listen 简化配置

使用listen替换 frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用 listen配置示例:

vim /etc/haproxy/haproxy.cfglisten mysql_server bind :3306 mode tcp balance roundrobin server my1 192.168.75.10:80heck server my2 192.168.75.20:80check

2.3.socat 工具

对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工 具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向 通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等

#查看haproxy状态[root@haproxy ~]# echo \"show info\" | socat stdio /var/lib/haproxy/statsName: HAProxyVersion: 2.4.22-f8e3218Release_date: 2023/02/14Nbthread: 1Nbproc: 1Process_num: 1Pid: 1006Uptime: 0d 0h46m07sUptime_sec: 2767Memmax_MB: 0PoolAlloc_MB: 0PoolUsed_MB: 0PoolFailed: 0Ulimit-n: 8035Maxsock: 8035Maxconn: 4000Hard_maxconn: 4000 #查看集群权重[root@haproxy ~]# echo get weight webserver/web1 | socat stdio#设置权重[root@haproxy ~]# echo \"set weight webserver/web1 1 \" | socat stdio /var/lib/haproxy/stats #下线后端服务器[root@haproxy ~]# echo \"disable server webserver_80/webserver1 \" | socat stdio /var/lib/haproxy/stats #上线后端服务器[root@haproxy ~]# echo \"enable server webserver_80/webserver1 \" | socat stdio /var/lib/haproxy/stats

 

三、haproxy算法

简介


一、静态算法(权重只能 0/1,不支持运行时热调整)

  1. static-rr 最简单的“加权轮询”,权重在启动时就固定。适合会话已共享(如 Session 存入 Redis),或完全无会话状态的短连接服务。 配置:balance static-rr

  2. first 先把第一台 server 的连接数打到它的 maxconn,再轮到第二台,以此类推。适合资源极端紧张、只想“能省则省”的场景(例如临时压测机)。

    配置:balance first


二、动态算法(运行时可用 set weight 动态调整)

  1. roundrobin(默认) 经典“加权轮询”,每个权重值就是一次循环次数,支持慢启动。90% 的 Web/短连接直接用它即可。 配置:balance roundrobin

  2. leastconn 每次挑“当前活跃连接数 ÷ 权重”最小的一台。对长连接(MySQL、Redis、WebSocket)极其友好。 配置:balance leastconn

  3. random 纯随机,但在服务器数量巨大(>100)时可降低调度表维护开销。可再叠加一致性哈希(hash-type consistent)。 配置:balance random


三、哈希类算法(按某字段做一致性哈希,天然会话保持) 所有哈希算法都能通过 hash-type 指令切换“静态取模”或“一致性哈希”:

  • hash-type map-based 取模法 → 静态,不支持权重调整

    所谓取模运算,就是计算两个数相除之后的余数,10%7=3, 7%4=3 map-based算法:基于权重取模,hash(source_ip)%所有后端服务器相加的总权重

  • hash-type consistent → 动态,节点上下线只移动 1/N 的键,支持 set weight

  1. source 取“源 IP”做哈希。TCP 模式没有 Cookie 时,用它做粘性会话最方便。 配置:balance source

  2. uri 取 HTTP 请求行的 URI(不含 ?query)做哈希。常见于缓存层,保证同一 URI 固定落到同一台缓存机。 配置:balance uri

  3. url_param 取 URL 参数 name 的值做哈希。例如按 userid 分片,让同一用户始终进同一后端。 配置:balance url_param

  4. hdr() 取指定 HTTP 头(如 User-Agent、Authorization、X-Region)的值做哈希。适合按语言、地域、Token 做分片。 配置:balance hdr(User-Agent)

  5. rdp-cookie 针对 Windows 远程桌面,解析 RDP 协议里的 Cookie 做哈希,实现会话保持 配置:balance rdp-cookie


小结口诀

  • 短连接、无状态 → roundrobin

  • 长连接(DB、Socket) → leastconn

  • 需要会话保持: – 能种 Cookie → 七层 stick-table 或 cookie insert – 不能种 Cookie → source / uri / url_param / hdr

  • 超大集群节点频繁变更 → random + consistent

  • 权重想热调 → 选动态算法并打开 stats socket

 

爱购银饰批发网