haproxy-高性能负载均衡反向代理服务

目录

一、HAProxy(High Availability Proxy)概述

1、HAProxy的概念

2、HAProxy的主要特性

3、HAProxy的优缺点

4、Haproxy负载均衡策略

5、LVS、nginx、HAProxy的区别

二、安装HAProxy

1、yum安装

2、第三方rpm包安装

3、编译安装

3.1 解决 lua 环境

3.2 编译安装HAProxy

3.3 配置systemd管理文件

三、HAProxy配置文件内容详解

1、全局设置(global)

2、默认参数(defaults)

3、监听设置(Listen)

四、HAProxy调优

1、调整进程

2、将CPU与进程绑定

3、访问状态页

4、日志管理

4.1 本地日志

4.2 远端日志

五、Proxies配置

1、Proxies配置(defaults)

 2、 frontend与backend

2.1 Proxies配置(frontend)

2.2 Proxies配置(backend)

2.3 实际操作

3、是否开启健康性检测

3.1 默认无后端健康性检测

3.2 添加健康性检测(Check)

4、Proxies配置(listen)


一、HAProxy(High Availability Proxy)概述

1、HAProxy的概念

HAProxy是一款基于事件驱动、单进程模型设计的四层与七层负载均衡器,它能够在TCP/UDP层面以及HTTP(S)等应用层协议上实现高效的流量分发。HAProxy不仅适用于Web服务器负载均衡,还能应用于数据库、邮件服务器、缓存服务器等多种场景,支持高达数百万级别的并发连接,并具有极低的延迟

  • 支持功能
  • TCP 和 HTTP 反向代理
  • SSL/TSL服务器
  • 可以针对HTTP请求添加 cookie,进行路由后端服务器
  • 可平衡负载至后端服务器,并支持持久连接
  • 支持所有主服务器故障切换至备用服务器 keepalive
  • 支持专用端口实现监控服务
  • 支持停止接受新连接请求,而不影响现有连接
  • 可以在双向添加,修改或删除HTTP报文首部字段
  • 响应报文压缩
  • 支持基于 pattern 实现连接请求的访问控制
  • 通过特定的 URI(url)为授权用户提供详细的状态信息

2、HAProxy的主要特性

  • 高性能负载均衡: HAProxy通过优化的事件驱动引擎,能够以最小的系统资源开销处理大量并发请求。它支持多种负载均衡算法,如轮询、最少连接、源IP哈希等,可根据实际业务需求灵活配置
  • 健康检查与故障恢复: HAProxy具备完善的后端服务器健康检查机制,可以根据响应时间、错误率等因素自动剔除不健康的后端节点,并在节点恢复时重新将其加入到服务池中,确保服务连续性
  • 会话保持与亲和性: 为了保证用户的会话一致性,HAProxy支持基于cookie或源IP地址的会话保持功能,确保同一客户端的请求被转发到同一台后端服务器进行处理
  • 安全性与SSL卸载: HAProxy支持SSL/TLS加密传输,可对HTTPS流量进行解密并透明地分发至后端服务器,同时也能终止SSL连接以减轻服务器的加密计算压力
  • 高级路由与策略: 根据HTTP请求头、URL路径、内容类型等条件,HAProxy可以执行复杂的路由规则和ACL策略,使得负载均衡更加智能化和精准化
  • 日志记录与监控: HAProxy提供丰富的日志记录选项,可通过syslog、CSV格式输出等方式收集统计数据,便于运维人员实时监控系统状态和性能指标

3、HAProxy的优缺点

  • 优点

高性能:HAProxy是一个高性能的负载均衡器,可以处理大量的并发连接

灵活性:HAProxy支持多种负载均衡算法,如轮询、加权轮询、最少连接等,可以根据实际需求选择合适的算法

高可用性:HAProxy可以检测服务器的健康状态,如果某个服务器出现故障,它可以自动将流量转移到其他健康的服务器,从而保证服务的高可用性

安全性:HAProxy可以作为反向代理,隐藏后端服务器的真实IP地址,提高系统的安全性。

  • 缺点

单点故障:如果HAProxy本身出现故障,可能会导致整个系统的服务不可用

配置复杂:HAProxy的配置相对复杂,需要一定的学习成本

性能瓶颈:虽然HAProxy的性能很高,但在处理大量并发连接时,可能会成为系统的性能瓶颈

功能单一:只支持做负载均衡的调度服务器,不支持正则处理,不能实现动静分离,也不能做web服务器

总的来说,HAProxy是一个强大的负载均衡器,可以提高系统的可用性、性能和安全性,但也需要注意其可能存在的缺点

4、Haproxy负载均衡策略

官方文档:http://cbonte.github.io/haproxy-dconv/2.4/configuration.html#4-balance

静态调度算法:不管后端,按照调度器的算法进行 分配

动态调度算法:会考虑后端服务器的负载情况

(1)roundrobin,表示简单的轮询 rr

(2)static-rr,表示根据权重

(3)leastconn,表示最少连接者先处理

(4)source,表示根据请求源IP

(5) uri,表示根据请求的URI,做cdn需使用

(6) url_param,表示根据请求的URl参数' balance url param’requires an URL parameter name

(7)hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求

(8)rdp-cookie (name),表示根据据cookie(name)来锁定并哈希每一次TCP请求

5、LVS、nginx、HAProxy的区别

  • IVS基于Linux操作系统实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡
  • LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案
  • LVs因为工作在TCP模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URI等多种状态检测方式
  • HAProxy功能强大,但整体性能低于4层模式的IVS负载均衡
  • Nginx主要用于web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是对群集节点健康检查功能不强,性能没有Haproxy好

二、安装HAProxy

1、yum安装

CentOS 7 的默认的base仓库中包含haproxy的安装包文件,但是版本比较旧,是1.5.18的版本,距离当前版本已经有较长时间没有更新,由于版本比较旧所以有很多功能不支持,如果对功能和性能没有要求可以使用此版本,否则推荐使用新版本

[root@localhost ~]#yum install -y haproxy

2、第三方rpm包安装

官方没有提供rpm相关的包,可以通过第三方仓库的rpm包

​从第三方网站下载rpm包:https://pkgs.org/download/haproxy

方法一: 

基于互联网第三方仓库在线安装,这里我选择的是HA-Proxy 1.8.24 版本

[root@localhost ~]#cd /opt
[root@localhost opt]#yum install rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm -y
[root@localhost opt]#yum install rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm -y
[root@localhost opt]#systemctl start rh-haproxy18-haproxy.service 
[root@localhost opt]#systemctl status rh-haproxy18-haproxy.service 
[root@localhost data]#/opt/rh/rh-haproxy18/root/usr/sbin/haproxy -v

方法二:基于第三方yum仓库

[root@localhost ~]#yum install centos-release-scl-rh -y
[root@localhost ~]#yum install rh-haproxy18-haproxy -y

3、编译安装

编译安装HAProxy 2.0 LTS版本,更多源码包下载地址:http://www.haproxy.org/download/

3.1 解决 lua 环境

HAProxy 支持基于 lua 实现功能扩展,lua是一种小巧的脚本语言,于1993年由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能

Lua 官网:www.lua.org

Lua 应用场景

  • 游戏开发
  • 独立应用脚本
  • Web 应用脚本
  • 扩展和数据库插件,如MySQL Proxy
  • 安全系统,如入侵检测系统

由于 CentOS7 之前版本自带的 lua 版本比较低并不符合 HAProxy 要求的lua 最低版本(5.3)的要求

因此需要编译安装较新版本的 lua 环境,然后才能编译安装 HAProxy,这里我安装lua 5.4.4版本

[root@localhost ~]#yum -y install gcc openssl-devel pcre-devel systemd-devel  #先安装依赖环境
[root@localhost ~]#cd /opt
[root@localhost opt]#tar xf lua-5.4.4.tar.gz 
[root@localhost opt]#cd lua-5.4.4/
[root@localhost lua-5.4.4]#make all
[root@localhost lua-5.4.4]#cd src
[root@localhost src]#./lua -v
[root@localhost src]#cd /opt
[root@localhost opt]#ln -s lua-5.4.4 lua

3.2 编译安装HAProxy

将源码包解压后,可以看到,与之前的nginx、php等编译安装不同,它没有configure执行文件

configuse执行文件主要生成的是Makefile文件,解压完源码包后就已经生成了该文件

可以查看INSTALL文件,查看如何安装

[root@localhost haproxy-2.4.25]#sed -n '33,38p' INSTALL 

make clean
#清除之前编译过程中产生的目标文件和临时文件,确保从一个干净的状态开始新的编译过程。make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1-j $(nproc) 
#使用系统的逻辑处理器数量同时进行编译,以加快编译速度。TARGET=linux-glibc 
#指定目标平台为基于glibc的Linux系统。USE_OPENSSL=1 
#启用OpenSSL库支持,使得软件可以利用OpenSSL提供的加密和安全功能。USE_LUA=1 
#启用Lua脚本语言支持,允许在软件中编写和运行Lua脚本来扩展功能。USE_PCRE=1 
#启用PCRE(Perl Compatible Regular Expressions)库支持,提供强大的正则表达式处理能力。USE_SYSTEMD=1
#启用Systemd支持,使软件能够更好地与Systemd初始化系统集成,例如注册systemd服务等。sudo make install
#完成编译后,使用管理员权限执行此命令将编译好的软件安装到系统预设的安装路径下。

开始编译安装:

[root@localhost haproxy-2.4.25]#make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/opt/lua/src/  LUA_LIB=/opt/lua/src/
[root@localhost haproxy-2.4.25]#make install PREFIX=/apps/haproxy
[root@localhost haproxy-2.4.25]#ln -s /apps/haproxy/sbin/haproxy /usr/sbin/
[root@localhost haproxy-2.4.25]#haproxy  -v

3.3 配置systemd管理文件

[root@localhost haproxy-2.4.25]#tee /usr/lib/systemd/system/haproxy.service  <<eof[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg  -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
LimitNOFILE=100000[Install]
WantedBy=multi-user.targeteof
#详解
Description=HAProxy Load Balancer
#这一行定义了服务的简要描述,说明该服务是用于提供负载均衡功能的HAProxy
After=syslog.target network.target
#表示此服务在syslog日志系统和网络服务完全启动之后开始启动。[Service]   #服务部分包含了与服务运行相关的各种设置。ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg  -c -q
#指定服务启动前执行haproxy命令。表示启动HAProxy前检查配置文件/etc/haproxy/haproxy.cfg 
#是否有效,-c表示仅检查配置文件,-q表示静默模式,不输出多余信息。
#该文件需要手动建立并配置信息。  
'具体信息在下一目录介绍'ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
#执行haproxy命令,并指定配置文件路径为 /etc/haproxy/haproxy.cfg,
#-Ws:表示以守护进程模式运行并打开Unix套接字以便进行管理操作,
#同时将PID写到/var/lib/haproxy/haproxy.pid 文件中。该文件也需要手动创建ExecReload=/bin/kill -USR2 $MAINPID
#设置当服务收到reload信号时需要执行的操作,这里是发送USR2信号给主进程($MAINPID),
#使得haproxy能够平滑重载配置文件而无需停止服务。LimitNOFILE=100000
#服务的最大打开文件数量限制为100000[Install]
#安装部分定义了如何将此服务与系统的启动目标关联WantedBy=multi-user.target
#表明该服务应随多用户目标启动,即在系统进入多用户模式时自动启动haproxy服务

 再创建systemd管理时需要加载的文件,及其相关配置信息

[root@localhost haproxy-2.4.25]#mkdir /etc/haproxy
[root@localhost haproxy-2.4.25]#mkdir /var/lib/haproxy
[root@localhost haproxy-2.4.25]#vim /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /apps/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 infodefaults
option http-keep-alive
option  forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client  300000ms
timeout server  300000mslisten statsmode httpbind 0.0.0.0:9999stats enablelog globalstats uri     /statusstats auth    hauser:123456listen  web_portbind 0.0.0.0:8899mode httplog globalserver web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5

再创建haproxy程序用户 

[root@localhost haproxy-2.4.25]#useradd -r -s /sbin/nologin haproxy
[root@localhost haproxy-2.4.25]#id haproxy

最后就能使用systemctl命令启动haproxy服务了 

[root@localhost ~]#systemctl enable --now haproxy.service
[root@localhost ~]#systemctl status haproxy.service

三、HAProxy配置文件内容详解

官方地址配置文件官方帮助文档
http://cbonte.github.io/haproxy-dconv/
http://cbonte.github.io/haproxy-dconv/2.4/configuration.html
https://www.haproxy.org/download/2.5/doc/configuration.txt

HAProxy配置文件的模版

编译安装完毕后。它的默认配置文件位置是源码包目录下的examples/option-http_proxy.cfg文件

而在system管理文件中并没有加载此目录,而是指向了/etc/haproxy/haproxy.cfg,所以将该模板文件复制到systemd加载的目录中并修改为haproxy.cfg,然后进行相关的配置。

HAProxy 的配置文件 haproxy.cfg 由两大部分组成,分别是 global  proxies 部分

global:全局配置段

进程及安全配置相关的参数
性能调整相关参数
Debug参数

proxies:代理配置段

defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置,配置简单,生产推荐使用

1、全局设置(global)

global            #全局,表示该段信息为全局配置
maxconn 100000    #置全局的最大并发连接数为100000
chroot /usr/local/haproxy  
#使运行中的haproxy进程被限制在/usr/local/haproxy目录下,以增强安全性。stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
#创建一个Unix套接字用于本地管理统计信息,权限为0600,只允许管理员访问。uid 99   gid 99   #设置HAProxy进程运行时的用户ID和组ID
daemon           #使haproxy以守护进程模式运行于后台。
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info
#定义日志记录,将日志信息发送到本地IP地址127.0.0.1,并使用syslog标识符local3,
#记录级别为info以上的日志信息

2、默认参数(defaults)

defaults                    #定义默认的参数设置
option http-keep-alive      #用HTTP长连接支持
option  forwardfor          #开启X-Forwarded-For头部的插入
maxconn 100000              #设置每个frontend或backend的最大并发连接数为100000
mode http                   #指定默认的模式为HTTP
timeout connect 300000ms    #设置建立连接超时时间为300秒
timeout client  300000ms    #设置客户端超时时间也为300秒
timeout server  300000ms    #置后端服务器超时时间同样为300秒

3、监听设置(Listen)

listen stats            #监听范围mode http              #设置监听器的工作模式为HTTP。bind 0.0.0.0:9999      #将监听器绑定到所有网络接口的9999端口,用于接收外部请求。stats enable           #启用统计信息收集和展示功能,允许通过HTTP访问查看自身状态信息log global             #使用全局日志设置记录与该监听器相关的活动stats uri     /status  #设置访问统计信息页面的URI路径为/status。stats auth    hauser:123456
#配置基本的HTTP身份验证,用户名为 hauser密码为 123456
#这意味着只有知道此凭据的用户才能访问统计信息。listen  web_portbind 0.0.0.0:8899   #创建另一个监听器并将其绑定到所有网络接口的8899端口,对外提供服务mode http           #设置该监听器也以HTTP模式工作。log global          #使用全局日志设置记录与该监听器相关的活动

四、HAProxy调优

1、调整进程

当HAProxy服务启动以后,默认开启一个主进程,带一个工作进程以及三个线程

[root@localhost ~]#pstree -p | grep haproxy

nbproc    n     #开启的haproxy work 进程数,默认进程数是一个
#nbthread  1    #和多进程 nbproc配置互斥(版本有关,CentOS8的haproxy1.8无此问题),指定每个haproxy进程开启的线程数,默认为每个进程一个线程
#如果同时启用nbproc和nbthread 会出现以下日志的错误,无法启动服务Apr  714:46:23 haproxy haproxy: [ALERT] 097/144623 (1454) : config : cannot enable multiple processes if multiple threads are configured. Please use either nbproc or nbthread but not both.

进程与线程会有冲突,当指定进程数后,线程会被关闭

2、将CPU与进程绑定

CPU亲缘性(CPU Affinity)是指将进程或线程绑定到特定的CPU核心上运行的技术。通过设置CPU亲缘性,可以避免进程在不同核心之间频繁迁移,从而减少缓存失效、上下文切换等开销,提高系统的整体性能和效率

通过添加cpu-map参数将工作进程与cpu绑定:cpu-map n(work)  n(cpu) 

nbproc  4
cpu-map 1  0     #绑定haproxy worker 进程至指定CPU,将第1个work进程绑定至0号CPU
cpu-map 2  1     #绑定haproxy worker 进程至指定CPU,将第2个work进程绑定至1号CPU
cpu-map 3  2     #绑定haproxy worker 进程至指定CPU,将第3个work进程绑定至2号CPU
cpu-map 4  3     #绑定haproxy worker 进程至指定CPU,将第4个work进程绑定至3号CPU

这样设置后,haproxy的工作进程将会在指定的核心上运行,有利于优化并行处理能力和减少资源竞争。使得每个进程都在固定的核心上执行,有助于提升数据包处理的稳定性和一致性,尤其在多核处理器环境中更为重要。当然,实际应用时需要根据具体的硬件环境和负载情况合理配置CPU亲缘性 

3、访问状态页

listen stats
#状态页mode http
#模式为httpbind 192.168.241.11:9999
#绑定在192.168.241.11 端口为9999上stats enable
#状态开启log globalstats uri     /status
#状态页位置stats auth    hauser:123456
#状态页登录用户名为haadmin 密码为123456

 在listen模块中,写配置文件时已添加好了,现在只需要用浏览器访问即可

4、日志管理

4.1 本地日志

haproxy服务没有单独的日志管理文件,它的默认日志文件位置在/var/log/messages

由于该文件的日志信息相对比较重要,所以建议单独存放

在配置文件的第14行已经定义的日志的格式,只需要在rsyslog日志管理的配置文件中指定信息即可

(1)开启udp的514端口

$ModLoad imudp      #这是在rsyslog配置文件中加载UDP模块的命令。imudp表示输入模块(Input Module)用于处理UDP协议的数据。通过此命令,系统将能够监听并接收通过UDP端口发送过来的日志消息。$UDPServerRun 514   #这个指令告诉rsyslog服务在指定的UDP端口(这里为514)上启动一个UDP服务器以监听日志事件。默认情况下,许多网络设备和服务会使用514端口通过UDP协议发送syslog日志信息给日志收集服务器

(2)由于在haproxy的主配置文件的第14行已经定义的日志的格式,现在只需要在rsyslog日志管理的配置文件中指定信息即可

log 127.0.0.1 local3 info

local3.*                                                /var/log/haproxy.log

当所有的配置都完成后,重启rsyslog和haproxy服务,那在/var/log/目录下自动生成日志文件haproxy.log

4.2 远端日志

由于haproxy服务只能做代理服务,对资源消耗较大,建议将日志文件放在远程的日志文件服务器上,专门建立日志文件查看

(1)在haproxy主配置文件中,定义日志的标识符及信息

log 172.16.12.11 local5 info

(2)在远端的日志服务器上修改rsyslog配置文件

注:两个设备的udp的514端口必须要开启

(3)测试,重启haproxy和rsyslog服务后,远端日志服务器就会生成对应的日志文件 

当然,haproxy服务器本机也会产生日志,如果只想把日志记录在远端日志服务器,只需要把haproxy服务器中的日志配置删除即可 

五、Proxies配置

官方文档:http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#4
defaults [<name>] #默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
frontend <name>   #前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。
backend <name>    #后端服务器组,等于nginx的upstream和LVS中的RS服务器
listen  <name>    #将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用#注:name字段只能使用大小写字母,数字,‘-’(dash),'_‘(underscore),'.' (dot)和 ':'(colon),并且严格区分大小写  

1、Proxies配置(defaults)

option redispatch
#当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose
#当服务器负载很高时,自动结束掉当前队列处理比较久的连接,针对业务情况选择开启
option http-keep-alive
#开启与客户端的会话保持
option forwardfor
#透传客户端真实IP至后端web服务器
mode http|tcp
#设置默认工作类型,使用TCP服务器性能更好,减少压力
timeout http-keep-alive 120s
#session 会话保持超时时间,此时间段内会转发到相同的后端服务器
timeout connect 120s
#客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前),默认单位ms
timeout server 600s
#客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms,如果超时,会出现502错误,此值建议设置较大些,防止502错误
timeout client 600s
#设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同
timeout check   5s
#对后端服务器的默认检测超时时间
default-server inter 1000 weight 3
#指定后端服务器的默认设置

 2、 frontend与backend

frontend与backend定义了haproxy服务的反向代理与负载均衡

 2.1 Proxies配置(frontend)

bind:
#指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于
listen字段中#格式:
bind [<address>]:<port_range> [, ...] [param*]
#注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1backlog <backlog> #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注
意:不支持backend
listen http_proxy      #监听http的多个IP的多个端口和sock文件bind :80,:443,:8801-8810bind 10.0.0.1:10080,10.0.0.1:10443bind /var/run/ssl-frontend.sock user root mode 600 accept-proxylisten http_https_proxy     #https监听bind :80bind :443 ssl crt /etc/haproxy/site.pem   #公钥和私钥公共文件listen http_https_proxy_explicit     #监听ipv6、ipv4和unix sock文件bind ipv6@:80bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pembind unix@ssl-frontend.sock user root mode 600 accept-proxylisten external_bind_app1         #监听file descriptorbind "fd@${FD_APP1}"
frontend study_web_port     #可以采用后面形式命名:业务-服务-端口号bind :80,:8080bind 10.0.0.7:10080,:8801-8810,10.0.0.17:9001-9010mode http|tcp            #指定负载协议类型use_backend <backend_name>    #调用的后端服务器组名称

2.2 Proxies配置(backend)

定义一组后端服务器,backend服务器将被frontend进行调用。

注: backend 的名称必须唯一,并且必须在listen或frontend中事先定义才可以使用,否则服务无法启动

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

2.3 实际操作

HAProxy反向代理服务器操作:

[root@localhost ~]#vim /etc/haproxy/haproxy.cfg
frontend nginx
#定义了一个名为 "nginx" 的前端代理,它监听来自客户端的请求bind 172.16.12.10:80
#表示该前端代理将绑定到IP地址为172.16.12.10的服务器上的80端口,对外提供HTTP服务use_backend web
#指定当接收到请求时,应将请求转发到名称为 "web" 的后端集群进行处理backend web
#定义了一个名为 "web" 的后端集群
server rs1 172.16.12.12:80
server rs2 172.16.12.13:80
#分别定义了两台后端服务器。其中,rs1 对应的实际服务器IP地址是172.16.12.12,
#并且在该服务器上运行的服务也监听80端口;同样地,rs2 对应的服务器IP地址是172.16.12.13
[root@localhost ~]#systemctl restart haproxy

后端服务器1(172.16.12.12)操作: 

[root@localhost ~]#yum install -y httpd
[root@localhost ~]#systemctl start httpd
[root@localhost ~]#echo "welcome to apache_server 1" > /var/www/html/index.html

后端服务器2(172.16.12.13)操作: 

[root@localhost ~]#yum install epel-release.noarch -y
[root@localhost ~]#yum install -y nginx
[root@localhost ~]#systemctl start nginx
[root@localhost ~]#echo "welcome to nginx_server 2" > /usr/share/nginx/html/index.html

客户端测试:

3、是否开启健康性检测

3.1 默认无后端健康性检测

模拟后端服务器1宕机,即关闭后端服务器1的apache服务

客户端测试访问有一半的几率访问失败,是因为haproxy反向代理服务器没有开启健康性检测,当后端服务器1宕机时,haproxy反向代理服务器仍将请求调度到它上,导致错误

3.2 添加健康性检测(Check)

listen  WEb_port_80bind 172.16.12.10:80mode httplog globalserver rs1  172.16.12.12:80  checkserver rs2  172.16.12.13:80  check

此时当haproxy反向代理服务器配置了健康性检测机制,那么当客户端访问时,haproxy反向代理服务器就会检测后端服务器是否能正常工作,将请求调度到能正常工作的后端服务器上

4、Proxies配置(listen)

listen 配置块是用于定义虚拟服务(Virtual Service)或前端代理(Frontend)。这个配置项结合了frontend和backend的概念,可以简化配置并集中管理同一逻辑服务的所有相关设置

#官网业务访问入口
listen WEB_PORT_80    #业务名称 支持自定义bind 172.16.12.10:80   #ip加端口mode http          #默认 可以不写option forwardfor  #透传客户端真实IP至后端web服务器server web1   172.16.12.12:8080   check inter 3000 fall 3 rise 5server web2   172.16.12.13:8080   check inter 3000 fall 3 rise 5

HAProxy反向代理服务器操作:

在配置文件中将frontend和backend删除,防止端口与地址冲突,再去配置listen语句 

[root@localhost ~]#vim /etc/haproxy/haproxy.cfg
listen  webbind 172.16.12.10:80mode httplog globalserver rs1  172.16.12.12:80  check inter 3000 fall 2 rise 5server rs2  172.16.12.13:80  check inter 3000 fall 2 rise 5
[root@localhost ~]#systemctl restart haproxy

后端服务器1和后端服务器2的操作和之前的一样就行

客户端测试:

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

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

相关文章

day52 动态规划part13● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

考虑到一般动态规划的写法是n方&#xff0c;为了降低复杂度&#xff0c;考虑每次假如选择当前数dp[i]对应最长的序列&#xff0c;就找前面上一个数&#xff08;已经做递推的时候记录了上一个数的比他小的一个数&#xff0c;因为等于上一个比他小的数的序列长度&#xff08;已经…

寻找峰值(二分查找思想)

解法一&#xff1a;暴力求解 int findPeakElement(int* nums, int numsLen ) {// write code herefor (int i 1; i < numsLen - 1; i) {if ((nums[i] > nums[i - 1]) && (nums[i] > nums[i1])) {return i;}}if (nums[numsLen - 1] > nums[numsLen - 2]) …

蓝桥杯练习系统(算法训练)ALGO-980 斐波那契串

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;10.0s Java时间限制&#xff1a;30.0s Python时间限制&#xff1a;50.0s 问题描述 斐波那契串由下列规则生成&#xff1a;   F[0] "0";   F[1] "1";   F[n] F[n-1] F[n-2]…

鸿蒙开发为什么这么火,现在入行鸿蒙是否来的及?

鸿蒙开发是当前备受关注的技术领域之一&#xff0c;对于想要入门学习鸿蒙开发的初学者来说&#xff0c;需要掌握一定的基础知识和技能。鸿蒙开发又是否能为程序员们带来一片光明的未来呢&#xff1f;让我们一同探讨这些问题。 对于初学者来说&#xff0c;鸿蒙开发是否易于上手呢…

MySQL基础-----多表关系与查询概述

目录 前言 一、多表关系 1.一对多 2.多对多 3.一对一 二、多表查询概述 1.概述 2.笛卡尔积 3.分类 前言 本期我们开始学习新的章节&#xff0c;也就是MySQL的多表关系与查询&#xff0c;在本期主要是讲述概念性的东西&#xff0c;大概介绍多表关系是什么&#xff0c;为什…

应用方案 | D54123B低功耗漏电保护电路

概 述 A&#xff09;、D54123B是一款高性能 CMOS 漏电保护器专用电路。芯片内部包含稳压电源、放大电路、比较器电路、延时电路、计数器电路、跳闸控制电路及跳闸驱动电路。芯片外围应用有脱扣线圈、压敏电阻、稳压二级管、二级管、电阻、电容等元器件。 B&#xff09;、内部…

基于SSM SpringBoot vue家教交流平台

基于SSM SpringBoot vue家教交流平台 系统功能 管理员登录 家长登录注册 学生登录注册 教师登录注册 个人中心 家长信息管理 学生信息管理 教师信息管理 招聘家教管理 应聘家教管理 确认招聘管理 论坛管理 系统管理 我的收藏管理 管理员管理 开发环境和技术 开发语言&#x…

宏任务与微任务:JavaScript异步编程的秘密

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

高等数学常用公式

高等数学常用公式 文章目录 内容大纲 内容 大纲 感谢观看 期待关注 有问题的小伙伴请在下方留言&#xff0c;喜欢就点个赞吧

并发容器介绍(二)

并发容器介绍&#xff08;二&#xff09; 文章目录 并发容器介绍&#xff08;二&#xff09;BlockingQueueBlockingQueue 简介ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue ConcurrentSkipListMap 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 Bl…

YOLO V9 C++版本部署

文章目录 一、环境配置二、编译三、运行yolo四、测试效果 一、环境配置 下载MNN git clone https://github.com/alibaba/MNN.git下载MNN-YOLO git clone https://github.com/wangzhaode/mnn-yolo.git二、编译 ### compile mnn ### cd MNN mkdir build_s cd build_s/ cmake …

算法刷题Day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

目录 0 哈希表 哈希函数1 有效的字母异位词1.1 string的回顾1.2 我的代码 2 两个数组的交集2.1 unordered_set 介绍2.2 我的解题&#xff08;set&#xff09; 3 快乐数3.1 我的解题&#xff08;set&#xff09; 4 两数之和4.1 暴力求解4.2 哈希表&#xff08;map&#xff09; &…

vue-cli自定义创建项目-eslint依赖冲突解决方式

创建项目步骤 概览&#xff1a; 在安装 npm安装时会报错 npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: vue/eslint-config-standard6.1.0 npm ERR! Found: eslint-plugin-vue8.7.1 npm ERR! node_modules/eslint-plugin…

公网ip和局域网ip

什么是公网IP&#xff1f; 公网&#xff0c;俗称外网&#xff0c;又被叫做互联网&#xff0c;是连接不同地区局域网或者城域网计算机的通信的远程网络。通常可以跨接很大的物理范围&#xff0c;连接多个地区、城市和国家提供远距离通信&#xff0c;形成全球性的互联网络。因此…

开源好用的所见即所得(WYSIWYG)编辑器:Editor.js

文章目录 特点基于区块干净的数据 界面与交互插件标题和文本图片列表Todo表格 使用安装创建编辑器实例配置工具本地化自定义样式 今天介绍一个开源好用的Web所见即所得(WYSIWYG)编辑器&#xff1a; Editor.js Editor.js 是一个基于 Web 的所见即所得富文本编辑器&#xff0c;它…

爬虫怎么使用代理IP通过HTML和CSS采集数据?

使用爬虫采集数据时&#xff0c;有时为了隐藏真实IP地址或规避某些网站的限制&#xff0c;我们需要使用代理IP。同时&#xff0c;通过HTML和CSS选择器&#xff0c;我们可以定位并提取页面中的特定数据。以下是一个基本的步骤说明&#xff0c;以Python的requests和BeautifulSoup…

nodejs版本过高导致vue-cli项目无法正常运行解决方案

95% emitting CompressionPlugin ERROR Error: error:0308010C:digital envelope routines::unsupported 方法一&#xff1a;在使用 npm run dev之前使用 set NODE_OPTIONS--openssl-legacy-provider Error: error:0308010C:digital envelope routines::unsupported 解决方法…

3.11_C++_day1_作业

作业要求&#xff1a; 程序代码&#xff1a; #include <iostream> #include <string.h>using namespace std;int main() {int a0,b0,c0,d0,e0;//分别记录字符串中的大写&#xff0c;小写&#xff0c;数字&#xff0c;空格&#xff0c;其他字符个数string str;cha…

C++作业day1

2> 试编程 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include <string.h>using namespace std;int main() {string str;cout << "请输…

C++学习笔记:红黑树

红黑树 什么是红黑树红黑树的规则红黑树节点的定义红黑树的插入空树插入非空插入条件判断新插入的节点 cur 不为 root 且 parent->_col 为红就需要调整父节点为左 grandf->left parent当uncle节点为红色时,只需要进行颜色调整,即可当uncle为空 或 者存在但是为黑parent …