HAProxy(高可用性代理)

1 HAProxy 简介

HAProxy( High Availability Proxy)是一个高性能的负载均衡器和代理服务器,为基于 TCP 和 HTTP 的应用程序提供高可用性、负载平衡和代理,广泛应用于提高 web 应用程序的性能和可靠性。它支持多种协议,包括 ​四层(TCP/UDP)与七层(HTTP/HTTPS)负载均衡​,能够处理大量并发连接,支持基于cookie的持久性、自动故障切换、支持正则表达式、SSL终端卸载、HTTP头改写、路径路由及web状态统计等功能。

企业版网站:HAProxy Technologies | Powering the World's Busiest Applications

社区版网站:HAProxy - The Reliable, High Perf. TCP/HTTP Load Balancer

github:https://github.com/haprox

四层负载均衡和七层负载均衡的区别

1.分层位置:四层负载均衡在传输层及以下,七层负载均衡在应用层及以下

2.性能 :四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高:七层可支持解析应用 层报文消息内容,识别URL、Cookie、HTTP header等信息。

3.原理 :四层负载均衡是基于ip+port;七层是基于虚拟的URL或主机IP等。

4.功能类比:四层负载均衡类似于路由器;七层类似于代理服务器。

5.安全性:四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击

1.1 负载均衡

负载均衡是一种将网络流量或计算任务分配到多个服务器或资源上的技术。目的是优化性能、提高可靠性和增强可扩展性。其核心原理是通过调度算法将请求均匀分发,避免单一服务器过载,从而提升整体系统的处理能力和服务稳定性。

负载均衡器:负载均衡器(Load Balancer)是网络架构中的关键组件,负责将客户端请求智能分配到多个后端服务器,以优化资源利用、提升系统性能并保障高可用性。 

代理服务器:代理服务器(Proxy Server)是位于客户端与目标服务器之间的中间节点,通过转发请求和响应实现网络通信的中介功能。其核心价值在于优化性能、增强安全性和扩展网络能力。

 分类​

​硬件负载均衡器​:专用设备(如F5),性能高但成本昂贵。

软件负载均衡器​:如Nginx、HAProxy,灵活且成本低,但可能受限于宿主资源。

 ​网络层级​

四层负载均衡​:基于TCP/UDP协议,通过IP和端口分发请求。

​七层负载均衡​:解析HTTP内容(如URL、Cookie),实现更精细的路由。

 常用算法​

 ​轮询(Round Robin)​​:依次分配请求,简单但忽略服务器负载差异。

​加权轮询​:根据服务器性能分配权重,高性能服务器处理更多请求。

最少连接数​:优先将请求发送至当前连接数最少的服务器。

哈希算法​:基于请求特征(如IP或URL)固定分配到特定服务器,适用于会话保持。

 ​应用场景​

Web服务​:分散高并发访问压力,如电商促销活动。 ​云计算​:动态分配虚拟机或容器资源,适应流量波动。 ​数据库集群​:通过读写分离提升数据库性能。 ​全局负载均衡​:结合DNS解析,实现跨地域容灾。 

 ​优势​

​高可用性​:自动屏蔽故障节点,保障服务持续运行。

​扩展性​:按需增减服务器,灵活应对流量变化。 ​

资源优化​:均衡负载避免资源浪费,提升处理效率。

1.2 HAProxy的基本配置信息

HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是:global(全局配置段)和proxies(代理配置段)

1.2.1 global:全局配置段

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

性能调整相关参数

Debug参数

1.2.1.1 global 配置参数说明

global  

       log         127.0.0.1 local2                        #定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个

        chroot              /var/lib/haproxy                 # 锁定运行目录  

        pidfile              /var/run/haproxy.pid          #指定pid文件  

        maxconn         100000                             #指定最大连接数  

        user                  haproxy                           #指定haproxy的运行用户  

        group                haproxy                           #指定haproxy的运行组  

        daemon                                                    #指定haproxy以守护进程方式运行

        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                                 #指定每个客户端每秒建立连接的最大数量

1.2.2 proxies:代理配置段

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

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

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

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

1.2.2.1  proxies参数说明proxies

1.defaults:默认配置项,针对以下的frontend、backend和listen生效,可以多个 name也可以没有name

2.frontend:前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集 群。

3.backend:后端服务器组,等于nginx的upstream和LVS中的RS服务器

4.listen: 将frontend和backend合并在一起配置,相对于frontend和backend 配置更简洁,生产常用

1.2.2.2  defaults默认配置项详解 

defaults
        mode                            http                        #HAProxy实例使用的连接协议
        log                                global                     #指定日志地址和记录日志条目的syslog/rsyslog日志设备,此处的 global表示使用 global配置段中 设定的log值。
        option                           httplog                    #日志记录选项,httplog表示记录与 HTTP
会话相关的各种属性值,包括 HTTP请求、会话状态、连接数、源地 址以及连接时间等
        option                           dontlognull               #dontlognull表示不记录空会话连接日志
        option http-server-close                                #等待客户端完整HTTP请求的时间,此处为等 待10s。
        option forwardfor          except 127.0.0.0/8   #透传客户端真实IP至后端web服务器
        option                           redispatch                #当server Id对应的服务器挂掉后,强制定 向到其他健康的服务器,重新派发
        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                         #session 会话保持超时时间,此时间段内
会转发到相同的后端服务器
        maxconn                        3000
        errorloc  503 https://www.baidu.com

1.3 HAProxy的算法

HAProxy通过固定参数 balance 指明对后端服务器的调度算法

balance参数可以配置在listen或backend选项中。

HAProxy的调度算法分为静态和动态调度算法

有些算法可以根据参数在静态和动态算法中相互转换。

1.3.1 静态算法

静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。

1.3.1.1 static-rr:基于权重的轮询调度

按权重轮询分配请求,权重固定且不支持动态调整。

不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)。 不支持端服务器慢启动(慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它,而是先给一部分,当没问题后在给一部分)。

其后端主机数量没有限制,相当于LVS中的 wrr。

1.3.1.2 first

按服务器列表顺序分配,优先使用连接数未达上限的服务器。适用于冷热服务器混合部署(优先启用新服务器)。

根据服务器在列表中的位置,自上而下进行调度。
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务。
其会忽略服务器的权重设置。
不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效。

1.3.2 动态算法

基于后端服务器状态进行调度适当调整, 新请求将优先调度至当前负载较低的服务器 权重可以在haproxy运行时动态调整无需重启

1.3.2.1  roundrobin(动态轮询)

默认加权轮询算法,支持动态权重调整。适用于无状态服务(如API网关),确保高性能服务器处理更多请求。

  1. 基于权重的轮询动态调度算法
  2. 支持权重的运行时调整,不同于lvs中的rr轮训模式
  3. HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数)
  4. 其每个后端backend中最多支持4095个real server
  5. 支持对real server权重动态调整
  6. roundrobin为默认调度算法,此算法使用广泛
1.3.2.2  leastconn(最少连接数)

将请求分配给当前连接数最少的服务器,适合长连接场景(如数据库、WebSocket)。

leastconn加权的最少连接的动态
支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接)

1.3.3 哈希算法

1.3.3.1 source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash。

1)map-base 取模法

map-based:取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请 求转发至对应的后端服务器。 此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度 缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果整体改变。

2)一致性哈希

一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动hash(o) mod n 该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动。

1.3.3.2 uri

uri(网络资源标识),包括url和urn,基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后 根据最终结果将请求转发到后端指定服务器 适用于后端是缓存服务器场景 默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性哈希。

1.3.3.3 url_param

url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器 总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商 通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server 如果无没key,将按roundrobin算法

#假设:

url = Bárbaro Cavernario

host = "www.mlw.com"

url_param = "key=value"

2 HAProxy的安装

2.1 实验环境

主机IP
haproxy(nat)192.168.88.101
RS1(nat)192.168.88.11
RS2(nat)192.168.88.12
client(nat)192.168.88.102

根据实验环境配置IP、及其主机名,关闭防火墙和selinux、启动网络服务和网卡,确保haproxy与RS1,RS2之间网络互通,并在三台虚拟机上安装nginx,然后在RS1,RS2的网页默认文件中写入提示语句方便后面测试。

[root@haproxy ~]# dnf install nginx -y [root@haproxy ~]# systemctl disable --now firewalld.service

[root@RS1 ~]# echo RS1 - 192.168.1.51 > /usr/share/nginx/html/index.html [root@RS1 ~] # systemctl enable --now nginx

[root@RS2 ~]# echo RS1 - 192.168.1.52 > /usr/share/nginx/html/index.html [root@RS2 ~] # systemctl enable --now nginx

2.2 软件安装  安装软件包 ,启动软件

 [root@haproxy ~]# dnf install haproxy -y

 [root@haproxy ~]# systemctl start haproxy.service

查看版本

[root@haproxy ~]# haproxy -v HAProxy version 2.4.17-9f97155 2022/05/13 - HAProxy - The Reliable, High Perf. TCP/HTTP Load Balancer Status: long-term supported branch - will stop receiving fixes around Q2 2026. Known bugs: http://www.haproxy.org/bugs/bugs-2.4.17.html Running on: Linux 5.14.0-284.11.1.el9_2.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Apr 12 10:45:03 EDT 2023 x86_64 

haproxy软件基本信息

软件安装包: haproxy-2.4.22-3.el9_3.x86_64.rpm

启动文件: /lib/systemd/system/haproxy.service

主配置目录: /etc/haproxy/

主配置文件: /etc/haproxy/haproxy.cfg

子配置目录: /etc/haproxy/conf.d

2.3 ACL示例-基于源地址的访问控制

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

#具体配置如下图

 

2.4 haproxy的全站加密

1)生成证书

[root@haproxy ~]# mkdir /etc/haproxy/certs/ [root@haproxy ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/mlw.org.key -x509 -days 365 -out /etc/haproxy/certs/mlw.org.crt

[root@haproxy ~]# cd /etc/haproxy/certs/

[root@haproxy certs]# cat mlw.org.key mlw.org.crt > mlw.pem

 

2)配置haproxy

[root@haproxy certs]# vim /etc/haproxy/haproxy.cfg [root@haproxy certs]# systemctl restart haproxy.service

 3)测试结果
[root@client ~]# curl -IkL http://192.168.88.11
HTTP/1.1 302 Found
content-length: 0
location: https://192.168.88.11/
cache-control: no-cacheHTTP/1.1 200 OK
server: nginx/1.20.1
date: Mon, 28 Jul 2025 11:58:36 GMT
content-type: text/html
content-length: 21
last-modified: Mon, 28 Jul 2025 11:13:45 GMT
etag: "68875b69-15"
accept-ranges: bytes[root@client ~]# curl -Ik https://www.mlw.org
HTTP/2 301
server: nginx
date: Mon, 28 Jul 2025 04:00:02 GMT
content-type: text/html; charset=UTF-8
location: https://mlw.org/
x-redirect-by: WordPress
expires: Mon, 28 Jul 2025 04:00:02 GMT
cache-control: max-age=0
x-cache-status: MISS
x-rocket-nginx-serving-static: MISS
strict-transport-security: max-age=31536000;
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
referrer-policy: no-referrer-when-downgrade
content-security-policy: default-src * 'unsafe-inline' 'unsafe-eval' data: blob:;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93551.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub靶场:ica1

一、信息收集nmap扫描一下IP。(扫不出来的可以看一下前面几篇找ip的步骤)下面给了框架的版本是9.2的,我们去kali里搜一下有没有已经公开的漏洞。searchsploit qdPM 9.2 locate 50176.txt more /usr/share/exploitdb/exploits/php/webapps/50…

【Dv3admin】ORM数据库无法查询的问题

Django 运行过程中,数据库连接的健康状态直接影响应用的稳定性和数据访问准确性。长时间空闲的数据库连接经常因外部机制被回收,进而引发数据查询异常和返回无效结果。 本文围绕 Django 中数据库连接长时间空闲导致的连接失效问题,介绍相关的…

使用 Flownex 对机械呼吸机进行建模

当患者无法独立呼吸时,机械呼吸机通过气管插管将富氧空气输送到患者的肺部。肺是敏感而复杂的器官,因此在无法忍受的压力和体积范围内提供空气,根据每分钟所需的呼吸次数计时,并适当加湿和加热。机械呼吸机的精确建模对于其安全有…

力扣刷题日常(7-8)

力扣刷题日常(7-8) 第7题: 整数反转(难度: 中等) 原题: 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果. 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0. 假设环境不允许存储 64 位整数(有符号或无符号).…

串口接收数据包(协议带帧头帧尾)的编程实现方法:1、数据包格式定义结构体2、使用队列进行数据接收、校验解包

这种带帧头帧尾的数据包处理流程可以简单概括为 “识别边界→提取有效数据→验证完整性” 三个核心步骤,具体操作如下:1. 数据包格式定义(先约定规则)首先明确一个 “合格数据包” 的结构,比如: 帧头&#…

JSON 对象封装教程

JSON 对象封装方法在 Java 中封装 JSON 对象通常使用第三方库&#xff0c;如 org.json、Gson 或 Jackson。以下是几种常见的方法&#xff1a;使用 org.json 库添加 Maven 依赖&#xff1a;<dependency><groupId>org.json</groupId><artifactId>json<…

【WRF-Chem】EDGAR 排放数据处理:分部门合并转化为二进制(Python全代码)

目录 process.py process_biofl.py process_fossil.py process_micro.py process_sector.py 参考 process.py 读取 EDGAR 排放数据库中 2000 至 2023 年间不同行业的甲烷(CH₄)排放数据,进行合并处理,并将总排放以二进制格式保存到文件中。 导入必要的库 import numpy as n…

【学习过程记录】【czsc】1、安装

文章目录 背景 安装 安装python 安装czsc 功能测试 附录 奇葩的报错 背景 详见: https://github.com/waditu/czsc 安装 安装python !重要!作者强调,python必须是大于等于3.8 为此呢,我也是花了一点时间装了一个python3.13。 安装czsc 关于czsc的安装呢,官方也是给出…

Python批量生成N天前的多word个文件,并根据excel统计数据,修改word模板,合并多个word文件

1&#xff0c;需求 根据word模板文件&#xff0c;生成多个带日期后缀的word文件根据excel-每日告警统计数量&#xff0c;逐个修改当日的文档2&#xff0c;实现 shell脚本&#xff1a;根据word模板文件&#xff0c;生成多个带日期后缀的word文件 #!/bin/bash # 生成近一年日期 …

基于uni-app的血糖血压刻度滑动控件

想要做一个基于uni-app的血糖血压刻度滑动控件&#xff0c;hbuilder市场没有好的&#xff0c;参照别人的写了一个。如图&#xff1a;源码&#xff0c;自己放入components里面。<!-- 刻度滑动选择 --> <template><view><view class"slide-title"…

C语言(02)——标准库函数大全(持续更新)

想要了解更多的C语言知识&#xff0c;可以订阅下面的专栏&#xff0c;里面也有很多品质好文&#xff1a; 打怪升级之路——C语言之路_ankleless的博客-CSDN博客 还在持续更新中&#xff0c;以下是学习过程中遇到的一些库函数&#xff08;排序不分先后&#xff09;&#xff1a…

永磁同步电机无速度算法--静态补偿电压模型Harnefors观测器

一、原理介绍本文基于Harnefors教授提出的静态补偿电压模型&#xff0c;可以实现带载零速启动、正反转切换等功能&#xff0c;原理清晰&#xff0c;实现简便。二、仿真模型在MATLAB/simulink里面验证所提算法&#xff0c;搭建仿真。采用和实验中一致的控制周期1e-4&#xff0c;…

[SKE]Python gmssl库的C绑定

Python gmssl库的C绑定 摘要:本文展示gmssl库的C绑定,并给出完整代码。将参考模型从Python脚本迁移到纯C代码中使用gmssl库(TongSuo项目,支持国密算法如SM4,同时兼容AES、DES、3DES、RSA等)。这样,UVM(SystemVerilog)可以通过DPI-C直接调用C函数,而无需嵌入Py…

4.方法的使用

方法是指一段具有独立功能的代码块&#xff0c;只有被调用时才会执行方法的主要作用体现在&#xff1a;代码组织&#xff1a;将原本挤在一起的臃肿代码按照功能进行分类管理例如&#xff1a;将用户注册的验证逻辑、数据库操作、结果返回等分离成不同方法提高复用性&#xff1a;…

day21-Excel文件解析

目录 1. 概述 2. Apache POI 3. XSSF解析Excel文件 3.1. 添加Jar包依赖 3.2. Workbook&#xff08;Excel文件&#xff09; 3.2.2. 加载&#xff08;解析&#xff09;Excel文件 3.3. Sheet &#xff08;工作簿&#xff09; 3.3.1. 创建工作簿 3.3.2. 获取工作簿 3.3.3.…

与 TRON (波场) 区块链进行交互的命令行工具 (CLI): tstroncli

源码仓库 一个基于 Node.js 和 TypeScript 构建的&#xff0c;用于与 TRON (波场) 区块链进行交互的命令行工具 (CLI)。 本项目旨在提供一个简单、可扩展的框架&#xff0c;让开发者可以轻松地通过命令行调用 TRON 的 HTTP API&#xff0c;实现查询链上信息、发送交易等操作。…

rabbitmq--默认模式(点对点)

导入包&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>application.yml springrabbitmq:host: localhostport: 5672username: guestpassword: gue…

外网访问文档编辑器Docsify(Windows版本),内网穿透技术应用简便方法

如果你正在为项目写文档&#xff0c;但又不想折腾复杂的构建流程&#xff0c;也不想维护一堆静态 HTML 文件&#xff0c;那你一定要试试 docsify。docsify 是一个基于 JavaScript 的开源文档生成工具&#xff0c;它最大的特点就是“无构建”&#xff1a;你只需要写 Markdown 文…

第4章唯一ID生成器——4.5 美团点评开源方案Leaf

Leaf是美团点评公司基础研发平台推出的一个唯一ID生成器服务&#xff0c;其具备高可靠性、低延迟、全局唯一等特点&#xff0c;目前已经被广泛应用于美团金融、美团外卖、美团酒旅等多个部门。Leaf根据不同业务的需求分别实现了Leaf-segment和Leaf-snowflake两种方案&#xff0…

分布式搜索和分析引擎Elasticsearch实战指南

ES 介绍与安装 Elasticsearch&#xff0c; 简称 ES&#xff0c;它是个开源分布式搜索引擎&#xff0c;它的特点有&#xff1a;分布式&#xff0c;零配置&#xff0c;自动发现&#xff0c;索引自动分片&#xff0c;索引副本机制&#xff0c;restful 风格接口&#xff0c;多数据源…