haproxy七层代理详解之-完整安装部署流程及负载均衡实现-及热更新方法

news2025/1/9 16:28:19

一.负载均衡

1.1负载均衡时什么

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

1.1.1四层负载均衡

1.1.1.1介绍

1.四层负载均衡是基于ip+port的负载均衡。

2.四层是基于三层负载均衡,发布三层的ip地址(虚拟ip),再加上四层的端口号,从而决定哪些流量需要做负载均衡。

3.四层负载均衡器也称为四层交换机,分析IP层及TCP/UDP层,但是无法解析应用层协议。

1.1.1.2原理

1.通过ip+port决定负载均衡的去向。

2.对流量请求进行NAT处理,转发至后台服务器

3.记录tcp、udp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。

1.1.1.3支持4层代理的软件

1.F5:硬件负载均衡器,成本较高。

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

3.Haproxy:模拟四层转发。

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

1.1.2七层负载均衡

1.1.2.1介绍

1.七层负载均衡器是基于虚拟的url或主机ip的负载均衡。

2.七层负载均衡在于内容的交换,即应用层报文内容的交换解析。

3.七层负载均衡器也称为七层交换机,支持四层负载均衡器的功能,且可分析应用层信息,如HTTP协议、URI、Cookie等信息

1.1.2.2原理

1.通过虚拟url或主机ip进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。

2.代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建立tcp连接,

1.1.2.3支持7层代理的软件
  • Nginx:基于http协议(nginx七层是通过proxy_pass)

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

 1.2.3四层和七层的区别

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

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

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

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

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

三.haproxy简介

  • HAProxy是法国开发者 威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计

haproxy安装(负载均衡软件)

实验环境

功能ip
haproxyeth0:172.25.254.100
RSeth0:172.25.254.10
RSeth0:172.25.254.20

3.1三台主机部署

webserver1

[root@webserver1 ~]# dnf install nginx -y

[root@webserver1 ~]# echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html

[root@webserver1 ~]# systemctl enable --now nginx.service 
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

webserver2

[root@webserver22 ~]# dnf install nginx -y

[root@webserver2 ~]# echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html

[root@webserver2 ~]# systemctl enable --now nginx.service 
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

安装haproxy并编辑配置文件

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

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
frontend webcluster                # 设置前端
    bind *:80                      # 监听端口
    mode http                      # 七层
    use_backend webcluster-host    # 使用的后端

backend webcluster-host            # 定义后端名称
    balance roundrobin             # 调度规则(使用的算法)
    server web1 172.25.254.10:80   # 后端server的ip
    server web2 172.25.254.20:80


#    第二种写法
#    listen webcluster
#        bind *:80
#        mode http
#        balance roundrobin
#        server web1 172.25.254.10:80
#        server web2 172.25.254.20:80

[root@haproxy ~]# systemctl enable haproxy.service 
[root@haproxy ~]# systemctl restart haproxy.service

测试

后端检测

[root@webserver1 ~]# systemctl stop nginx.service 

 

 四.haproxy的基本配置信息

4.1global配置

global
    log         127.0.0.1 local2        # 日志级别为2 记录在本机

    chroot      /var/lib/haproxy        # 设定haproxy运行目录
    pidfile     /var/run/haproxy.pid    # PID文件
    maxconn     100000                  # 最大链接数
    user        haproxy                 # 运行的用户
    group       haproxy                 # 运行的组
    daemon                              # 运行在后台

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats    # 状态接口

    # utilize system-wide crypto-policies
    ssl-default-bind-ciphers PROFILE=SYSTEM # 支持ssl的加密认证
    ssl-default-server-ciphers PROFILE=SYSTEM

4.1.1多进程和线程

启用查询多进程
# 默认为单进程
[root@haproxy ~]# pstree -p | grep haproxy
           |-haproxy(1925)---haproxy(1927)---{haproxy}(1928)

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

global
###省略### 
    nbproc 2    # 启用多线程 
    cpu-map 1 0 # 进程和cpu核心绑定防止cpu抖动从而减少系统资源消耗
    cpu-map 2 1 # 2 表示第二个进程,1表示第二个cpu核心

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

[root@haproxy ~]# pstree -p | grep haproxy
           |-haproxy(2042)-+-haproxy(2045)
           |               `-haproxy(2046)

# 查看多进程
[root@haproxy ~]# pstree -p | grep haproxy
           |-haproxy(2030)-+-haproxy(2032)
           |               `-haproxy(2033)
多线程对比
[root@haproxy ~]# cat /proc/2045/status | grep -i thread
Threads:	1  # 未开启多线程
Speculation_Store_Bypass:	thread vulnerable


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

global
###省略###
    nbthread 2 # 开启多线程

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

[root@haproxy ~]# pstree -p | grep haproxy
           |-haproxy(2066)---haproxy(2068)---{haproxy}(2069)

[root@haproxy ~]# cat /proc/2068/status | grep -i thread
Threads:	2
Speculation_Store_Bypass:	thread vulnerable

4.2proxies配置

4.2.1proxies参数说明

参数类型作用
defaults[]proxies默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
frontendproxies前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。
backendproxies后端服务器组,等于nginx的upstream和LVS中的RS服务器
listenproxies将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用
 4.2.1.1defaults
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 

defaults
    mode                    http                # 使用七层
    log                     global              # 日志 根据global的设定
    option                  httplog             # 记录http的日志
    option                  dontlognull         # 空链接的日志不记录
    option http-server-close                    # 等待客户端完整HTTP请求的时间,此处为等待10s
    option forwardfor       except 127.0.0.0/8  # 透传客户端真实IP至后端web服务器
                                                # 在apache配置文件中加入:<br>%{x-Forwarded-For}i
                                                # 后在webserer中看日志即可看到地址透传信息
    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                 # 对后端服务器的默认检测超时时间
    maxconn                 3000                # 最大能够承受的并发链接
backup使用案例 
web1
[root@webserver1 ~]# systemctl stop nginx.service 

web2
[root@webserver2 ~]# systemctl stop nginx.service 

###  backup 示例
[root@haproxy ~]# dnf install httpd -y

[root@haproxy ~]# vim /etc/httpd/conf/httpd.conf 
# 定位47行,修改端口号
 46 #Listen 12.34.56.78:80
 47 Listen 8080

[root@haproxy ~]# systemctl enable --now  httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

[root@haproxy ~]# echo sorry 下班了 > /var/www/html/index.html


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

listen webcluster
    bind *:80
    mode http
    balance roundrobin
    server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
    server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
    server web_s 172.25.254.100:8080 backup
# web1和web2没有被调用的时候,调用web_s

[root@haproxy ~]# systemctl restart haproxy.service 
[root@haproxy ~]# curl 172.25.254.100
sorry 下班了
[root@haproxy ~]# curl 172.25.254.100
sorry 下班了
# 开启其中一台
[root@webserver2 ~]# systemctl start nginx.service 


# 检测
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
 server配置
# 针对一个server配置
check #对指定rea1进行健康状态检査,如果不加此设置,默认不开启检査,只有check后面没有其它配置也可以启用检查功能

# 默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定端口才能实现健康性检查
addr <IP>             # 可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
port <num>            # 指定的健康状态监测端口
inter <num>           # 健康状态检查间隔时间,默认2000ms
fa11 <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的最大并发连接数

4.3socat工具

  • 对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如IP、TCP、UDP、IPv6、Socket文件等
利用工具socat 对服务器动态权重调整
# 动态调整haproxy里面的参数
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats mode 600 level admin
# mode 600:stats文件权限是600
# level admin 表示管理员权限,通过stats文件来控制haproxy文件的配置,不加admin只能看不能写

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

[root@haproxy ~]# ll /var/lib/haproxy/stats 
srw------- 1 root root 0  8月  9 11:55 /var/lib/haproxy/stats

# 安装socat动态调整haproxy的参数
[root@haproxy ~]# dnf install socat -y


# 查看当前集群的权重
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats 
2 (initial 2)

# 设置权重
[root@haproxy ~]# echo "set weight webcluster/web1 1 "| socat stdio /var/lib/haproxy/stats 

# 查看修改成功
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats 
1 (initial 2)
[root@haproxy ~]# for i in {1..10}
> do 
> curl 172.25.254.100
> done
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10

# 设置一台主机下线
[root@haproxy ~]# echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats 

[root@haproxy ~]# for i in {1..10}; do  curl 172.25.254.100; done
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20

# 重新启用
[root@haproxy ~]# echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/stats 

[root@haproxy ~]# for i in {1..10}; do  curl 172.25.254.100; done
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10

针对多进程处理方法

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

global
###省略###
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats1 mode 600 level admin process 1 # haproxy多进程热处理
    stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2

    # utilize system-wide crypto-policies
    ssl-default-bind-ciphers PROFILE=SYSTEM
    ssl-default-server-ciphers PROFILE=SYSTEM
    nbproc 2 # 多进程
    cpu-map 1 0
    cpu-map 2 1

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

[root@haproxy ~]# ll /var/lib/haproxy
总用量 0
srw------- 1 root root 0  8月 11 19:22 stats
srw------- 1 root root 0  8月 11 19:25 stats1
srw------- 1 root root 0  8月 11 19:25 stats2

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

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

相关文章

嵌入式生物打印是什么?有啥优势?

大家好&#xff0c;今天我们来了解一下这篇《Embedded 3D bioprinting–An emerging strategy to fabricate biomimetic & large vascularized tissue constructs》发表于《Bioactive Materials》的一篇综述&#xff0c;在组织工程和再生医学领域&#xff0c;传统方法存在一…

【JUC】04-synchronized关键字

1. 悲观锁与乐观锁 悲观锁&#xff1a;认为自己在使用数据的时候一定会有别的线程来修改数据&#xff0c;因此在获取数据的时候会先加锁&#xff0c;确保数据不会被别的线程修改。synchroized和Lock的实现类都是乐观锁&#xff1a;认为自己在使用数据时不会有别的线程修改数据…

激光尘埃粒子计数器在洁净室监测中的关键应用(原理、类型、选型)

激光尘埃粒子计数器的应用 激光尘埃粒子计数器广泛应用于多个领域&#xff0c;包括但不限于&#xff1a; 权威机构&#xff1a;如血液中心、防疫站、疾控中心、质量监督所等。 生产企业和科研部门&#xff1a;如电子行业、制药车间、半导体、光学或精密机械加工、塑胶、喷漆…

构建流水线生产管理创新的RFID智能管理系统应用方案

在当今竞争激烈的制造业环境中&#xff0c;流水线生产的高效、精准和智能化管理已成为企业获取竞争优势的关键。然而&#xff0c;传统的流水线生产管理方式在应对日益复杂的生产需求和多变的市场环境时&#xff0c;逐渐暴露出诸多难点和痛点。 一、流水线生产管理的难点与痛点…

OCR调研

OCR调研 一、介绍 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是一种将图像中的文字转换为计算机可处理格式的技术。OCR技术经历了从传统OCR到基于深度学习的OCR的转变。深度学习OCR技术通过模拟人脑神经元结构处理文本和图像数据&am…

打造高效存储与访问体验:NFS共享携手Nginx负载均衡,赋能企业级数据流通与性能优化

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团团-CSDN博客 目录: 前言&#…

AIGC实践|AI助力一张照片生成百变写真

前言&#xff1a; 在之前的文章中&#xff0c;我们已经领略了 AI 在动态有声绘本、小游戏开发、视频短片制作以及包装设计等领域的神奇应用&#xff0c;在本篇文章中&#xff0c;我将尝试利用AI辅助&#xff0c;使用一张照片生成个性化写真集。充分满足工作艺术照、各地郊游打…

关于自己部署AI大模型踩的坑(二)—— GPU篇

最近一直在研究如何打算属于我自己的J.A.R.V.I.S.&#xff08;钢铁侠中的机器人管家&#xff09;。 上一篇写了我最近在部署自己的大模型&#xff0c;使用llama3.1&#xff0c; 和通义千问2。虽然最终结果也是成功了&#xff0c;过程却十分地坎坷。 所以这一篇文章一是总结其中…

linux学习--第一天

--linux基础命令 -本地安装 1. sudo dpkg -i 软件包 &#xff1a;安装单个软件包 2. sudo dpkg -i * .deb &#xff1a;安装多个软件包 3. sudo dpkg -L 软件包&#xff1a;列出软件在系统中文件路径 4. sudo dpkg -s 软件包&#xff1a;列出软件包的安装状态 5. …

页面布局-1

1.定位 CSS 属性名功能属性值position设置定位 static&#xff1a;不定位&#xff0c;默认值。 relative&#xff1a;相对定位。 absolute&#xff1a;绝对定位。 fixed&#xff1a;固定定位 left与参照点左侧距离长度right与参照点右侧距离长度top与参照点上侧距离长度bottom…

【数据结构初阶】队列

hello&#xff01; 目录 一、概念与结构 二、队列的实现 Queue.h Queue.c test.c 一、概念与结构 1、概念&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出的特性。 入队列&#xff1a;进行插入操作…

音视频概要

YUV原理的讲解 YUV是一种常见的视频像素格式&#xff0c;经常用在视频编解码上面&#xff0c;YUV分别由Y分量和U、V分量(红色投影Cr)组成。Y分量指的是亮度分量&#xff0c;也就是我们经常说的灰阶值&#xff0c;相当于一副灰色的图像。而U分量和V分量表示的是色度分量&#x…

搭建高可用OpenStack(Queen版)集群(九)之部署nova计算节点

一、搭建高可用OpenStack&#xff08;Queen版&#xff09;集群之部署计算节点 一、部署nova 1、安装nova-compute 在全部计算节点安装nova-compute服务 yum install python-openstackclient openstack-utils openstack-selinux -y yum install openstack-nova-compute -y 若yu…

基于vue框架的《大学计算机》课程思政资源共享平台ac9s7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,教师,教研小组,章节分类,课程内容,资源类型,资源信息 开题报告内容 基于Vue框架的《大学计算机》课程思政资源共享平台 开题报告 一、引言 随着教育信息化的深入发展&#xff0c;高等教育领域对课程思政的重视程度日益提升。《大…

【kubernetes】pod控制器详解

一、pod控制器概述 1、Pod控制器作用 Pod控制器&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行重启&#xff0c;当根据重启策略无效&#xff0c;则会重新新建pod的资源。 2、pod控制器…

Ethercat学习-SOEM主站源码解析(DC部分)

文章目录 SOEM DC模式源码简介示例用图ecx_porttimeecx_parentportecx_configdc如果从站不支持DC如果从站支持DC SOEM DC模式源码简介 示例用图 本文中都会围绕着这个图来讲&#xff0c;从站的port编号依次为0&#xff0c;3&#xff0c;1&#xff0c;2 在SOEM中&#xff0c;与…

C++11相关新特性(列表初始化、右值引用、可变参数模版)

目录 C11相关新特性 列表初始化 初始化简单变量 初始化容器 decltype关键字 C 11新增的容器 左值引用和右值引用 左值与右值 左值引用与右值引用 左值引用和右值引用的相互转化 右值引用的使用 拷贝构造函数与移动构造函数 赋值重载函数与移动赋值重载函数 元素插…

ZABBIX邮件监控发送信息

前言&#xff1a;本地邮箱&#xff0c;第三方邮箱&#xff0c;第三方邮箱加脚本 1、本地邮箱测试 #cd /home # ls laiyingx [rootzabbix ~]# vim /etc/postfix/main.cf /mydestination $myhostname, localhost.$mydomain, localhost,$mydomain [rootzabbix ~]# systemctl…

Python 函数返回yield还是return?这是个问题

如果你刚入门 Python&#xff0c;你可能之前没有遇到过yield。虽然它看起来很奇怪&#xff0c;但它是你编码工具库中的一个重要工具。在成为 Python 大师的道路上&#xff0c;你必须掌握它。 返回列表的函数 假设有一个函数&#xff0c;它可以一次性生成一系列值&#xff0c;…

代理服务器在HTTP请求中的应用:Ruby实例

摘要 在现代互联网架构中&#xff0c;代理服务器是不可或缺的组件&#xff0c;它提供了访问控制、数据加密、缓存和匿名访问等多种功能。本文将介绍代理服务器的基本概念&#xff0c;并以Ruby编程语言为例&#xff0c;展示如何在HTTP请求中使用代理服务器&#xff0c;包括设置…