当前位置: 首页 > news >正文

haproxy七层代理

一:haproxy简介

        haproxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。

        haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

二:负载均衡

        负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。

二层负载均衡(mac)

        用于虚拟mac地址方式,外部对虚拟mac地址请求,负载均衡接收后分配给后端实际的mac地址响应。

三层负载均衡(ip)

        一般用于虚拟ip地址的方式,外部对虚拟ip地址请求,负载均衡接收后分配给后端实际的ip地址响应。

四层负载均衡(tcp)

        主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡,如常见的 LVS、F5 等。

  • 工作原理:四层负载均衡器在网络层(IP 层)和传输层(TCP/UDP 层)进行操作,它根据源 IP 地址、目标 IP 地址、端口号等信息进行流量分发,不涉及应用层数据。
  • 优点:处理速度快,因为它只需查看数据包头部的信息而不需解析数据包的内容。
  • 缺点:功能相对简单,不能根据应用层的信息(如 URL、Cookie)做出复杂的调度决策。

七层负载均衡器(http)

        位于 OSI 模型的最高层,即应用层,此负载均衡器支持多种协议,如 HTTP、FTP、SMTP 等。七层负载均衡器可根据报文内容(例如 URL、Cookie、主机名)进行流量分发,如常见的 HAProxy、Nginx。

  • 工作原理:七层负载均衡器在应用层进行操作,可以解析应用层的内容,根据具体的请求信息(如 HTTP 头、URL 路径、Cookie 等)进行更加精细的负载均衡。
  • 优点:功能强大,能够进行复杂的调度决策,适用于需要根据应用层数据进行调度的场景。
  • 缺点:处理开销较大,因为需要解析和分析应用层的数据。

三.haproxy的安装和环境搭建

主机安装haproxy

[root@localhost ~]# yum install haproxy

进入配置文件编辑,设置前端http,指定web1主机和web2主机

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

启动haproxy服务,检测是否成功

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

客户端web1

安装nginx

[root@localhost ~]# yum install nginx

将内容输入目录底下的文件

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

启动nginx服务

[root@localhost ~]# systemctl restart nginx.service 
[root@localhost ~]# systemctl status  nginx.service 

客户端web2

安装nginx

[root@localhost ~]# yum install nginx

将内容输入目录底下的文件

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

启动nginx服务

[root@localhost ~]# systemctl restart nginx.service 
[root@localhost ~]# systemctl status  nginx.service 

使用主机进行测试,haproxy环境搭建成功

[root@localhost ~]# curl 172.25.254.10
[root@localhost ~]# curl 172.25.254.20

四:global 配置参数说明

参数类型作用
chroot全局锁定运行目录
deamon全局以守护进程运行
user, group, uid, gid全局

运行haproxy的用户身份

stats socket

全局

套接字文件

nbproc N

全局

开启的haproxy worker 进程数,默认进程数是一个

nbthread 1 (和nbproc互斥)

全局

指定每个haproxy进程开启的线程数,默认为每个进程一个线程

cpu-map 1 0

全局

绑定haproxy worker 进程至指定CPU,将第1work进程绑定至0CPU

cpu-map 2 1

全局

绑定haproxy worker 进程至指定CPU,将第2work进程绑定至1CPU

maxconn N

全局

每个haproxy进程的最大并发连接数

maxsslconn N

全局

每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下

maxconnrate N

全局

每个进程每秒创建的最大连接数量

spread-checks N

全局

后端server状态check随机提前或延迟百分比时间,建议2- 5(20%-50%)之间,默认值0

pidfile

全局

指定pid文件路径

log 127.0.0.1 local2 info

全局

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

4.1:设置多进程(nbproc N)

进入配置文件global模块中配置全局,haproxy默认情况下是一个进程

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

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

[root@localhost ~]# systemctl restart haproxy.service#重新启动

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

 

4.2:进程至指定CPU(cpu-map 

[root@localhost ~]# systemctl restart haproxy.service#重新启动

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

4.3:查看进程中有几个子进程(cat)

[root@localhost ~]# cat /proc/17422/status | grep -i thread

4.5:设置多线程(nbthread N)

注意:多线程和多进程不可以同时设置,两者相互排斥

进入配置文件,重启服务查看进程

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

五:haproxy的状态界面

启动状态页

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

重新启动haproxy

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

注意:防火墙关闭,关闭selinux,将VIP、LVS等内容清理干净!!!!!
删除所有设备的VIP,清空所有LVS设置,关闭keepalived!!!

[root@localhost ~]#systemctl stop firewalld

[root@localhost ~]#setenforce 0

成功进入状态页

haproxy的状态监控页面编辑可以加下面参数

    listen admin_statsstats   enable      bind    *:9999    //监听的ip端口       mode    http    //开关option  httploglog     globalmaxconn 10       stats   refresh 30s   //统计页面自动刷新时间       stats   uri /status    //访问的status   ip:9999/status       stats   realm haproxy       stats   auth lee:lee  //认证用户名和密码stats   hide-version   //隐藏HAProxy的版本号stats   admin if TRUE   //管理界面,如果认证成功了,可通过webui管理节

六:基于cookie的会话保持

        cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session 共享服务器代替。

注意:不支持tcp mode,使用http mode

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

 重新启动程序

[root@localhost ~]#  service haproxy restart

使用浏览器访问地址

也可以使用虚拟机进行检测,基于cookie的会话保持完成。

[root@nginx ~]# curl -b WEBCOOKIE=lee1 172.25.254.100

七:自定义错误文件

获取错误文件的默认路径

[root@localhost ~]# rpm -ql haproxy |grep http

新建目录存放文件

[root@localhost errorpage]# mkdir /etc/haproxy/errorpage/503.http -p

编辑访问路径错误文件的内容

[root@localhost errorpage]# vim /etc/haproxy/errorpage/503.http

HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html;charset=UTF-8<html><body><h1>什么动物生气最安静</h1>
大猩猩!!
</body></html>

进入配置文件,插入新建错误文件路径,必须和存放文件一模一样

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

重新启动服务

[root@localhost ~]# systemctl restart haproxy.service
使用浏览器访问主机地址

八:hapoxy的四层负载示例

        针对除HTTP以外的TCP协议应用服务访问的应用场景,如MySQL Redis Memcache RabbitMQ。

客户端1号MySQL

[root@localhost ~]# yum install mariadb-server 

进入默认配置文件编辑信息,id号为1

[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf 

重新启动服务

进入数据库查看id

[root@localhost ~]# mysql

MariaDB [(none)]> SELECT @@server_id;

同理客户端2号MySQL

进入默认配置文件编辑信息,id号为2

[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf 

然后将两个客户端改为远程连接

rs1 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';rs2 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';

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

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

测试

[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like 'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs2 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like 'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs1 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
[root@node10 ~]# mysql -ulee -plee -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++构造和析构
  • `torch.device(“mps“)`、pip华为镜像源dockerfile以及后缀安装
  • 华为OD笔试
  • C#开启和关闭UAC功能
  • MySQL —— 约束
  • 周报 | 24.8.5-24.8.11文章汇总
  • Ubuntu安装MySQL5.7 + Apache + PHP + 禅道 保姆及教程
  • 糟糕界面集锦-控件篇05
  • XML动态sql查询当前时间之前的信息报错
  • 【数据结构进阶】哈希的应用
  • Matlab-use-yalmip-and-cplex12-10/
  • Flink开发语言选择:Java vs Scala,哪种更适合你的项目?
  • RAG与LLM原理及实践(11)--- Milvus hybrid search 源码分析及思想
  • 操作符5 学习编程的第23天
  • vue项目名修改、webstorm和idea创建的项目重命名、重构项目、修改项目名称
  • 时间复杂度分析经典问题——最大子序列和
  • Angular2开发踩坑系列-生产环境编译
  • Date型的使用
  • Git学习与使用心得(1)—— 初始化
  • JavaScript设计模式与开发实践系列之策略模式
  • jdbc就是这么简单
  • node学习系列之简单文件上传
  • scrapy学习之路4(itemloder的使用)
  • select2 取值 遍历 设置默认值
  • 容器服务kubernetes弹性伸缩高级用法
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 中文输入法与React文本输入框的问题与解决方案
  • AI算硅基生命吗,为什么?
  • linux 淘宝开源监控工具tsar
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Matlab)使用竞争神经网络实现数据聚类
  • (pojstep1.1.2)2654(直叙式模拟)
  • (二) 初入MySQL 【数据库管理】
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)大道至简,职场上做人做事做管理
  • .net MVC中使用angularJs刷新页面数据列表
  • .Net Web窗口页属性
  • .NET 常见的偏门问题
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @SpringBootConfiguration重复加载报错
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [C#] 基于 Token 的鉴权与签名机制详解 接口对接鉴权 token、sign(a=1b=2c=3d=4)、Base64、参数加密、MD5
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [C++] 从零实现一个ping服务
  • [HTML API]HTMLCollection
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
  • [IT生活推荐]大家一起来玩游戏喽,来的都进!
  • [leetcode] Balanced Binary Tree
  • [Lucas定理]【学习笔记】