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

2024-03-12 06:04

本文主要是介绍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的操作和之前的一样就行

客户端测试:

这篇关于haproxy-高性能负载均衡反向代理服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800334

相关文章

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

构建高性能WEB之HTTP首部优化

0x00 前言 在讨论浏览器优化之前,首先我们先分析下从客户端发起一个HTTP请求到用户接收到响应之间,都发生了什么?知己知彼,才能百战不殆。这也是作为一个WEB开发者,为什么一定要深入学习TCP/IP等网络知识。 0x01 到底发生什么了? 当用户发起一个HTTP请求时,首先客户端将与服务端之间建立TCP连接,成功建立连接后,服务端将对请求进行处理,并对客户端做出响应,响应内容一般包括响应

Nginx高性能分析

Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 Nginx 为什么这么快! Nginx 的进程模型 Nginx 服务器,正常运行过程中: 多进程:一个 Master 进程、多个 Worker 进程。Master 进程:管理 Work

云原生之高性能web服务器学习(持续更新中)

高性能web服务器 1 Web服务器的基础介绍1.1 Web服务介绍1.1.1 Apache介绍1.1.2 Nginx-高性能的 Web 服务端 2 Nginx架构与安装2.1 Nginx概述2.1.1 Nginx 功能介绍2.1.2 基础特性2.1.3 Web 服务相关的功能 2.2 Nginx 架构和进程2.2.1 架构2.2.2 Ngnix进程结构 2.3 Nginx 模块介绍2.4

【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】

文章目录 1.Ribbon(负载均衡,服务调用)1.1问题引出1.2 Ribbon负载均衡1.3 RestTemplate整合Ribbon1.4 指定Ribbon负载均衡策略1.4.1 配置文件1.4.2 配置类1.4.3 定义Ribbon客户端配置1.4.4 自定义负载均衡策略 2.OpenFeign面向接口的服务调用(服务发现,远程调用)2.1 OpenFeign的使用2.1 .1创建

在亚马逊云科技上利用Graviton4代芯片构建高性能Java应用(上篇)

简介 在AI迅猛发展的时代,芯片算力对于模型性能起到了至关重要的作用。一款能够同时兼具高性能和低成本的芯片,能够帮助开发者快速构建性能稳定的生成式AI应用,同时降低开发成本。今天小李哥将介绍亚马逊推出的4代高性能计算处理器Gravition,带大家了解如何利用Graviton芯片为Java生成式AI应用提高性能、优化成本。 本篇文章将介绍如何在云平台上创建Graviton芯片服务器,并在Gra