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

目录

[一、HAProxy(High Availability Proxy)概述](#一、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.1 解决 lua 环境)

[3.2 编译安装HAProxy](#3.2 编译安装HAProxy)

[3.3 配置systemd管理文件](#3.3 配置systemd管理文件)

三、HAProxy配置文件内容详解

1、全局设置(global)

2、默认参数(defaults)

3、监听设置(Listen)

四、HAProxy调优

1、调整进程

2、将CPU与进程绑定

3、访问状态页

4、日志管理

[4.1 本地日志](#4.1 本地日志)

[4.2 远端日志](#4.2 远端日志)

五、Proxies配置

1、Proxies配置(defaults)

[2、 frontend与backend](#2、 frontend与backend)

[2.1 Proxies配置(frontend)](#2.1 Proxies配置(frontend))

[2.2 Proxies配置(backend)](#2.2 Proxies配置(backend))

[2.3 实际操作](#2.3 实际操作)

3、是否开启健康性检测

[3.1 默认无后端健康性检测](#3.1 默认无后端健康性检测)

[3.2 添加健康性检测(Check)](#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负载均衡策略

bash 复制代码
官方文档: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的版本,距离当前版本已经有较长时间没有更新,由于版本比较旧所以有很多功能不支持,如果对功能和性能没有要求可以使用此版本,否则推荐使用新版本

bash 复制代码
[root@localhost ~]#yum install -y haproxy

2、第三方rpm包安装

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

bash 复制代码
​从第三方网站下载rpm包:https://pkgs.org/download/haproxy

方法一:

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

bash 复制代码
[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仓库

bash 复制代码
[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)里的一个研究小组开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能

bash 复制代码
Lua 官网:www.lua.org

Lua 应用场景

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

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

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

bash 复制代码
[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文件,查看如何安装

bash 复制代码
[root@localhost haproxy-2.4.25]#sed -n '33,38p' INSTALL 
bash 复制代码
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
#完成编译后,使用管理员权限执行此命令将编译好的软件安装到系统预设的安装路径下。

开始编译安装:

bash 复制代码
[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管理文件

bash 复制代码
[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.target

eof
bash 复制代码
#详解
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管理时需要加载的文件,及其相关配置信息

bash 复制代码
[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 info

defaults
option http-keep-alive
option  forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client  300000ms
timeout server  300000ms

listen stats
 mode http
 bind 0.0.0.0:9999
 stats enable
 log global
 stats uri     /status
 stats auth    hauser:123456

listen  web_port
 bind 0.0.0.0:8899
 mode http
 log global
 server web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5

再创建haproxy程序用户

bash 复制代码
[root@localhost haproxy-2.4.25]#useradd -r -s /sbin/nologin haproxy
[root@localhost haproxy-2.4.25]#id haproxy

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

bash 复制代码
[root@localhost ~]#systemctl enable --now haproxy.service
[root@localhost ~]#systemctl status haproxy.service

三、HAProxy配置文件内容详解

bash 复制代码
官方地址配置文件官方帮助文档
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 由两大部分组成,分别是globalproxies部分

global:全局配置段

bash 复制代码
进程及安全配置相关的参数
性能调整相关参数
Debug参数

proxies:代理配置段

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

1、全局设置(global)

bash 复制代码
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)

bash 复制代码
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)

bash 复制代码
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_port
 bind 0.0.0.0:8899   #创建另一个监听器并将其绑定到所有网络接口的8899端口,对外提供服务
 mode http           #设置该监听器也以HTTP模式工作。
 log global          #使用全局日志设置记录与该监听器相关的活动

四、HAProxy调优

1、调整进程

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

bash 复制代码
[root@localhost ~]#pstree -p | grep haproxy
bash 复制代码
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)

bash 复制代码
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、访问状态页

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

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

4、日志管理

4.1 本地日志

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

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

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

(1)开启udp的514端口

bash 复制代码
$ModLoad imudp      #这是在rsyslog配置文件中加载UDP模块的命令。imudp表示输入模块(Input Module)用于处理UDP协议的数据。通过此命令,系统将能够监听并接收通过UDP端口发送过来的日志消息。

$UDPServerRun 514   #这个指令告诉rsyslog服务在指定的UDP端口(这里为514)上启动一个UDP服务器以监听日志事件。默认情况下,许多网络设备和服务会使用514端口通过UDP协议发送syslog日志信息给日志收集服务器

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

bash 复制代码
log 127.0.0.1 local3 info
bash 复制代码
local3.*                                                /var/log/haproxy.log

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

4.2 远端日志

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

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

bash 复制代码
log 172.16.12.11 local5 info

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

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

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

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

五、Proxies配置

bash 复制代码
官方文档:http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#4
bash 复制代码
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)

bash 复制代码
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)

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

2.2 Proxies配置(backend)

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

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

bash 复制代码
mode http|tcp     #指定负载协议类型,和对应的frontend必须一致
option            #配置选项
server            #定义后端real server,必须指定IP和端口
bash 复制代码
#针对一个server配置
check #对指定real进行健康状态检查,如果不加此设置,默认不开启检查,只有check后面没有其它配置也可以启用检查功能
#默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定端口才能实现健康性检查
 addr <IP>   #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
 port <num> #指定的健康状态监测端口
 inter <num> #健康状态检查间隔时间,默认2000 ms
 fall <num>   #后端服务器从线上转为线下的检查的连续失效次数,默认为3
 rise <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反向代理服务器操作:

bash 复制代码
[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)操作:

bash 复制代码
[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)操作:

bash 复制代码
[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)

bash 复制代码
listen  WEb_port_80
 bind 172.16.12.10:80
 mode http
 log global
 server rs1  172.16.12.12:80  check
 server rs2  172.16.12.13:80  check

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

4、Proxies配置(listen)

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

bash 复制代码
#官网业务访问入口
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 5
   server web2   172.16.12.13:8080   check inter 3000 fall 3 rise 5

HAProxy反向代理服务器操作:

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

bash 复制代码
[root@localhost ~]#vim /etc/haproxy/haproxy.cfg
listen  web
 bind 172.16.12.10:80
 mode http
 log global
 server rs1  172.16.12.12:80  check inter 3000 fall 2 rise 5
 server rs2  172.16.12.13:80  check inter 3000 fall 2 rise 5
[root@localhost ~]#systemctl restart haproxy

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

客户端测试:

相关推荐
醉颜凉2 分钟前
银河麒麟桌面操作系统V10 SP1:取消安装应用的安全授权认证
运维·安全·操作系统·国产化·麒麟·kylin os·安全授权认证
ZPC82105 分钟前
Python使用matplotlib绘制图形大全(曲线图、条形图、饼图等)
开发语言·python·matplotlib
镜花照无眠7 分钟前
Python爬虫使用实例-mdrama
开发语言·爬虫·python
2401_857610039 分钟前
SpringBoot实现:校园资料分享平台开发指南
服务器·spring boot·php
aaasssdddd9618 分钟前
python和c
c语言·开发语言·python
星星法术嗲人32 分钟前
【Java】—— 集合框架:Collections工具类的使用
java·开发语言
黑不溜秋的1 小时前
C++ 语言特性29 - 协程介绍
开发语言·c++
一丝晨光1 小时前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
C++忠实粉丝1 小时前
Linux环境基础开发工具使用(2)
linux·运维·服务器
天上掉下来个程小白1 小时前
Stream流的中间方法
java·开发语言·windows