haproxy实现代理和负载均衡

news2024/11/22 16:40:34

HaProxy介绍:

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

haproxy是可提供可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。haproxy非常适用于并发大(并发达1W以上)web站点,这些站点通常又需要会话保持或七层处理,haproxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。

LVS,nginx,haproxy对比:

LVS是内核中的功能,nginx和haproxy是第三方实现的功能。

LVS只能提供四层负载均衡无法提供七层负载,(无法控制7层协议http头部url等),功能单一。

nginx,haproxy可以实现4层和7层负载,功能较多,但是性能不如LVS,LVS>haproxy>nginx

haproxy对比nginx性能优越,功能单一,haproxy只做反向代理。

LVS没有后端服务器健康性检测,nginx和haproxy有后端服务器健康性检测。

安装haproxy:

三种方式:yum,rpm和编译

yum安装:yum install -y haproxy

[root@Node1 ~]#:yum install -y haproxy                #安装

[root@Node1 ~]#:systemctl start haproxy                #启动

[root@Node1 ~]#:systtemctl status haproxy                #查看是否启动

可以rpm -qc haproxy查看配置文件

rpm安装:

错误:软件包:rh-haproxy18-haproxy-1.8.24-3.el7.x86_64 (/rh-haproxy18-haproxy-1.8.24-3.el7.x86_64)
rpm安装haproxy需要需要:rh-haproxy18-runtime

需要依赖包

[root@Node1 ~]#:mkdir /hprxy; cd /phrxy

#准备一个runtime包,直接拖进来到目录下,然后下载haproxy包

[root@Node1 hprxy]#:wget http://mirror.centos.org/centos/7/sclo/x86_64/rh/Packages/r/rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm

[root@Node1 hprxy]#:ls
rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm  rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm

[root@Node1 hprxy]#:yum install -y rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm
[root@Node1 hprxy]#:yum install -y rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm

#启动服务
[root@Node1 hprxy]#:systemctl start rh-haproxy18-haproxy.service

查看状态:systemctl status rh-haproxy18-haproxy.service发现启动了

可以通过rpm -qc 服务名;rpm -ql 服务名,查看配置文件和列出文件相关文件。

编译安装haproxy:

在第二台机器7-2上编译安装,7-1和7-3作为web真实服务器

由于CentOS7 之前版本自带的lua版本比较低并不符合haproxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装haproxy,所以需要先安装lua环境。

[root@Node2 ~]#:mkdir /data ; cd /data

#查看当前lua版本,是5.1版本的。

[root@Node2 data]#:lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
#可以现在安装lua新版本:wget https://www.lua.org/ftp/lua-5.4.6.tar.gz
[root@Node2 data]#:wget https://www.lua.org/ftp/lua-5.4.6.tar.gz

#准备安装包:haproxy-2.4.25.tar,直接拖进来/data/下

[root@Node2 data]#:ls
haproxy-2.4.25.tar.gz  lua-5.4.6.tar.gz

#解压

[root@Node2 data]#:tar xf lua-5.4.4.tar.gz

#做个软链接
[root@Node2 data]#:ln -s lua-5.4.6 lua
[root@Node2 data]#:cd lua-5.4.4/src/
[root@Node2 src]#:make all test
#查看版本信息
[root@Node2 src]#:./lua -v
Lua 5.4.6  Copyright (C) 1994-2023 Lua.org, PUC-Rio                #5.4版本

#安装haproxy

#安装依赖环境:

[root@Node2 data]#:yum -y install gcc openssl-devel pcre-devel systemd-devel

#解压
[root@Node2 data]#:tar xf haproxy-2.4.25.tar.gz
[root@Node2 data]#:cd haproxy-2.4.25/
#创建lua目录用于自动补全功能
[root@Node2 haproxy-2.4.25]#:mkdir /usr/local/lua
[root@Node2 haproxy-2.4.25]#:cp -r src/   /usr/local/lua/
[root@Node2 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=/data/lua/src/  LUA_LIB=/data/lua/src/

#安装,指定路径
[root@Node2 haproxy-2.4.25]#:make install PREFIX=/apps/haproxy

#软链接,自动补全
[root@Node2 haproxy-2.4.25]#:ln -s /apps/haproxy/sbin/haproxy /usr/sbin/
#haproxy -v可以查看版本信息。haproxy -h查看帮助

#写一个自启动文件:

[root@Node2 haproxy-2.4.25]#:vim /usr/lib/systemd/system/haproxy.service

[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg  -c -q     #-c检查语法。-f指定配置文件,也可以跟文件夹
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid  #-p指定pid文件
ExecReload=/bin/kill -USR2 $MAINPID   #重新加载
LimitNOFILE=100000    #打开文件数
[Install]
WantedBy=multi-user.target
[root@Node2 haproxy-2.4.25]#:systemctl daemon-reload
#创建主配置文件目录。需要手动创建

[root@Node2 haproxy-2.4.25]#:mkdir /etc/haproxy

#创建主配置文件/etc/haproxy/haproxy.cfg

global:全局配置段

进程及安全配置相关的参数

性能调整相关参数

Debut参数

proxies:代理配置段

defaults:为frontend,backend,listen提供默认配置
frontend:前端,相当于nginx中的server{},定义虚拟机,监听分配请求
backend:后端,相当于nginx中的upstream{},真实服务器
listen:同时拥有前端和后端配置,配置简单,生产推荐使用,前端和后端,更简单。

主配置文件配置块:

[root@Node2 haproxy-2.4.25]#:vim /etc/haproxy/haproxy.cfg

#全局模块,

global
maxconn 100000                #最大连接数
chroot /apps/haproxy                #禁锢,haproxy进程,只可以访问,/apps/haroxy文件夹
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin         #指明sock文件的位置

#指明uid和gid

uid 99
gid 99
#后台方式,守护进程

daemon
#进程数, 开启几个进程

#nbproc 4                    #nbthread线程与nbproc进程不能同时指定
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /var/lib/haproxy/haproxy.pid                #指定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                支持7层http
bind 0.0.0.0:9999
stats enable
log global
stats uri     /haproxy-status        
stats auth    haadmin:123456                #用户名和密码

listen  web
bind 0.0.0.0:8899
mode http
log global

server web1  192.168.114.10:80
server web2  192.168.114.30:80

#指定一个pid路径

[root@Node2 haproxy-2.4.25]#:mkdir  /var/lib/haproxy

#创建用户haproxy

[root@Node2 haproxy-2.4.25]#:useradd -r -s /sbin/nologin  haproxy

#启动haproxy

[root@Node2 haproxy-2.4.25]#:systemctl enable --now haproxy

起来之后查看状态:

listen中说明了代理服务器,和后端真实服务器。

而frontend和backup就把两者分离出来。listen相当于两者的结合。

7-1和7-3作为web服务器。下载httpd:

yum install -y httpd

systemctl start httpd

7-1:echo 7-1 > /var/www/html/index.html

7-3:echo 7-3 > /var/www/html/index.html

systemctl status httpd查看状态是否都起来了。并且能curl通

测试是否实现了代理和负载均衡:在浏览器也可以在本台服务器上curl 192.168.114.20:8899要跟上端口号:8899。因为我们在listen中设置的就是8899端口号。

状态页:

在配置文件中有以下三个配置,端口号,uri,访问控制。在浏览器地址栏中输入:192.168.114.20:9999/haproxy-status

bind 0.0.0.0:9999

stats uri     /haproxy-status

stats auth    haadmin:123456


 

进程:发现进程是一个进程下三个线程

 修改进程配置,nbproc 4就是有四个进程:

重启systemctl restart haproxy。

通过进程树查看一下: 

日志:

vim /etc/rsyslog.conf打开文件开启15和16行。

在/etc/rsyslog.conf文件的73行下添加一行,指定local3,并制定日志文件路径在/var/log/haproxy.log

重启systemctl restart haproxy rsyslog

使用浏览器访问192.168.114.20:8899

在日志文件中tail -f /var/log/haproxy.log实时查看

不使用listen,而使用frontend和backup两个模块:相当于把listen分开写,frontend是代理端,backup是服务端,负载均衡的web服务器。把listen注释掉或者删除。

 测试:由于我们指定的80端口,直接是curl 192.168.114.20不需要加端口,默认就是80。

其中listen或者说frontend和backup可以放在子配置文件中:

创建一个子配置文件:mkdir /etc/haproxy/conf.d

直接写在子配置文件中,但haproxy不像nginx可以在主配置文件中写入include包含模块。haproxy主配置文件不支持include。需要将子配置文件写在/usr/lib/systemd/system/haproxy.service文件中指明。

 把主配置文件中的注释掉。修改文件:vim /usr/lib/systemd/system/haproxy.service

重新加载配置文件,重启服务:

[root@Node2 haproxy]#:systemctl daemon-reload
[root@Node2 haproxy]#:systemctl restart haproxy

访问测试:

haproxy也有跳转的功能,在server后加入check redir http://www.baidu.com

 自动跳转到百度主页,如果浏览器跳转不到(但也会显示标题头部是百度的),可以使用内置火狐浏览器:192.168.114.20。将自动跳转到百度首页。

---end---

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

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

相关文章

狼人杀系列

目录 杀人游戏(天黑请闭眼) (1)入门版 (2)标准版 (3)延伸版——百度百科 (3.1)引入医生和秘密警察 (3.2)引入狙击手、森林老人和…

学习gateway网关路由时遇到的问题

遇到这个问题先别慌,我们首先要检查是哪里出问题了,从报错信息中我们可以看到,他说 Unable to find GatewayFilterFactory with name -AddRequestHeader 找不到这个路由过滤器,所以导致网关设置失败,从这条信息上我…

Mac可以读取NTFS吗 Mac NTFS软件哪个好 mac ntfs读写工具免费

在跨操作系统环境下使用外部存储设备时,特别是当Windows系统的U盘被连接到Mac电脑时,常常会遇到文件系统兼容性的问题。由于Mac OS原生并不完全支持对NTFS格式磁盘的读写操作,导致用户无法直接在Mac上向NTFS格式的U盘或硬盘写入数据。下面我们…

web学习笔记(六十九)vue2

目录 1. vue2创建脚手架项目 2.vue2如何关闭eslint 1. vue2创建脚手架项目 (1)在cmd窗口输入npm install -g vue/cli命令行,快速搭建脚手架。 (2) 创建vue2项目 (3) 选择配置项目&#xff0c…

ic基础|功耗篇04:门级低功耗技术

大家好,我是数字小熊饼干,一个练习时长两年半的IC打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是…

pdf合并,pdf合并成一个pdf,pdf合并在线网页版

在处理pdf文件的过程中,有时我们需要将多个pdf文件合并成一个pdf文件。作为一名有着丰富计算机应用经验的技术博主,我将为您详细介绍如何将多个pdf文件合并成一个pdf文件。 pdf合并方法:使用, “轻云处理pdf官网” 打开 “轻云处…

mysql_config 命令, 可以查看mysqlclient库的位置在/usr/lib64/mysql下

好吧,其实我是从这里知道了 -l 后面加的库名和so文件这种名不一样,因为库文件实际叫下面这个名(前面有lib)。

昇思MindSpore学习笔记1--基本介绍

昇思MindSpore是一个全场景深度学习框架。 一、框架组成 1. 模型库ModelZoo 提供深度学习算法网络。 2. 扩展库MindSpore Extend 拓展领域场景,如GNN/深度概率编程/强化学习等。 3. 科学计算MindSpore Science 科学计算套件。 包含数据集、基础模型、预置高精度模…

Mybatis从源码分析——启动到解析配置文件再到执行SQL语句过程

文章目录 前言解析配置文件解析源码Mapper文件解析过程二级缓存解析过程SQL的解析 SQL执行流程openSession()流程Executor执行器二级缓存查询数据流程 插件使用原理 前言 mybatis的体系结构: public class App {public static void main(String[] args) {String re…

【Java】解决Java报错:UnsupportedOperationException in Collections

文章目录 引言一、UnsupportedOperationException的定义与概述1. 什么是UnsupportedOperationException?2. UnsupportedOperationException的常见触发场景3. 示例代码 二、解决方案1. 使用适当的集合类型2. 创建可变副本3. 使用合适的集合工厂方法4. 使用不可变集合…

win11 (将星x17promax) 安装WSL 子系统

最初只是想着在win11系统下挂载ext4盘符,方便使用。 目录 0. 简介1.安装WSL子系统1.1 环境确认1.1.1 虚拟化设置1.1.2 系统设置1.1.3 开启开发者模式(此项有必要?)1.1.4 安装WSL子系统 2.WSL操作指令2.0 WSL相关命令2.1 WSL重置2.…

《概率论与数理统计》期末复习笔记_上

目录 第1章 随机事件与概率 1.1 随机事件 1.2 事件的关系与运算 1.3 概率的定义与性质 1.4 古典概型_重点 1.5 几何概型 1.6 条件概率与乘法公式 1.7 全概率公式与贝叶斯公式_重点 1.8 事件的独立性_重点 1.9 伯努利概型_重难点 第2章 随机变量及其分布 2.1 随机变…

MySQL之可扩展性(三)

可扩展性 向外扩展 可以把向外扩展(有时也称为横向扩展或水平扩展)策略划分为三个部分:复制、拆分以及数据分片(sharding).最简单也最常见的向外扩展的方法是通过复制将数据分发到多个服务器上,然后将备库用于读查询。这种技术对于以读为主的应用很有效。它也有一…

【乐吾乐2D可视化组态编辑器】自定义图形库

乐吾乐2D可视化组态软件图形库是一种可扩展、开放性的图形库,可根据不同的需求定制各种酷炫的组件效果和场景。 常用的方式有:①原生代码图形库、②字体图形库、③svg 图形库、④图片、⑤组合图形,以下主要从性能和开发成本维度考量&#xf…

内网渗透:端口转发(SSH隧道)

SSH:两台设备之间进行远程登录的协议(SSH本身就是一个隧道协议) 远程文件传输scp命令(scp是基于SSH的) 拓扑: SSH隧道搭建的条件 1.获取到跳板机权限 2.跳板机中SSH服务启动 SSH端口转发分类&#xff1…

锁机制 -- 概述篇

锁机制 1、概述 ​  加锁是为了解决并发场景下,多个线程对同一资源同时进行操作,而导致同一线程多次操作出现结果不唯一的情况(一次操作包含多条指令)。结果不唯一发生的原因在于指令的错乱,前提条件是多线程环境及…

模版总结小全

BFS 最短步数问题 #include<iostream> #include<queue> #include<cstring> using namespace std;const int N 50; char g[N][N],d[N][N]; int dx[] {-1,0,1,0}; int dy[] {0,1,0,-1}; int n,m;int bfs(int x,int y){queue<pair<int,int> > q…

ardupilot开发 --- 坐标变换 篇

Good Morning, and in case I dont see you, good afternoon, good evening, and good night! 0. 一些概念1. 坐标系的旋转1.1 轴角法1.2 四元素1.3 基于欧拉角的旋转矩阵1.3.1 单轴旋转矩阵1.3.2 多轴旋转矩阵1.3.3 其他 2. 齐次变换矩阵3. visp实践 0. 一些概念 相关概念&am…

“论模型驱动架构设计方法及其应用”,软考高级论文,系统架构设计师论文

论文真题 模型驱动架构设计是一种用于应用系统开发的软件设计方法&#xff0c;以模型构造、模型转换和精化为核心&#xff0c;提供了一套软件设计的指导规范。在模型驱动架构环境下&#xff0c;通过创建出机器可读和高度抽象的模型实现对不同问题域的描述&#xff0c;这些模型…

自定义指令directive

一、在src目录下创建一个directive文件夹 test.ts文件存放创建的自定义指令&#xff0c;index.ts用于接收所有指令进行统一处理 二、编写自定义指令 // test.ts文件 export default {// 写个自定义指令mounted(el: any, binding: any) {console.log(el, binding, "&qu…