haproxy实现代理和负载均衡

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.mzph.cn/diannao/37821.shtml

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

相关文章

Numpy array和Pytorch tensor的区别

1.Numpy array和Pytorch tensor的区别 笔记来源: 1.Comparison between Pytorch Tensor and Numpy Array 2.numpy.array 4.Tensors for Neural Networks, Clearly Explained!!! 5.What is a Tensor in Machine Learning? 1.1 Numpy Array Numpy array can only h…

信息学奥赛初赛天天练-39-CSP-J2021基础题-哈夫曼树、哈夫曼编码、贪心算法、满二叉树、完全二叉树、前中后缀表达式转换

PDF文档公众号回复关键字:20240629 2022 CSP-J 选择题 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 5.对于入栈顺序为a,b,c,d,e的序列,下列( )不合法的出栈序列 A. a,b&a…

螺旋矩阵问题C代码

给定一个n行m列的二维数组,要求按顺时针螺旋顺序输出矩阵中的所有元素,n和m小于等于10 如下图是一个三行四列的螺旋矩阵 要求输出 1 2 3 4 8 12 11 10 9 5 6 7 全局变量定义 int a[11][11]; int vis[11][11]; // 访问标记数组关键代码如下 int dx[] …

MySQL高级-MVCC-基本概念(当前读、快照读)

文章目录 1、MVCC基本概念1.1、当前读1.1.1、创建表 stu1.1.2、测试 1.2、快照读 1、MVCC基本概念 全称Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个…

镂空的文字?分享 1 段优质 CSS 代码片段!

大家好,我是大澈! 本文约 800 字,整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段优质 CSS 代码片段,实现 CSS 文字镂空的效果。 老规矩,先阅读代码片段并思考,再看代码解析再思考&#…

Leetcode3190. 使所有元素都可以被 3 整除的最少操作数

Every day a Leetcode 题目来源:3190. 使所有元素都可以被 3 整除的最少操作数 解法1:遍历 遍历数组,累加最少操作数,即 min(num % 3, 3 - num % 3)。 代码: /** lc appleetcode.cn id3190 langcpp** [3190] 使所…

uniapp+vue3开发微信小程序踩坑集

本文主要记录使用uniappvue3开发微信小程序遇见的各种常见问题及注意点。(持续更新) 问题: 自定义组件为什么有些样式加不上去 给自定义组件增加class的时候,有时候不生效有时候生效,一度让我怀疑自己记忆错乱。后来…

全国31省细分产品出口数据集(2002-2022年)

数据简介:整理全国31个省直辖市自治区按hs码分的22类细分产品的出口数据,只包含22类的细分,不包含更细的类目。可用来计算出口产品质量,出口产品技术复杂度等指标,数据区间为2002-2022年。 数据名称:31省细…

《昇思25天学习打卡营第11天 | 昇思MindSpore基于 MindSpore 实现 BERT 对话情绪识别》

11天本节学习到BERT全称是来自变换器的双向编码器表征量,它是Google于2018年末开发并发布的一种新型语言模型。BERT模型的主要创新点都在pre-train方法上,即用了Masked Language Model和Next Sentence Prediction两种方法分别捕捉词语和句子级别的repres…

【SGX系列教程】(五)Intel-SGX 官方示例分析(SampleCode)——RemoteAttestation

文章目录 一.RemoteAttestation原理介绍1.1 远程认证原理1.2 远程认证步骤1.3 远程认证基本流程1.4 IAS通过以下步骤验证报告的签名1.5 关键术语1.6 总结二.源码分析2.1 README2.1.1 README给出的编译流程2.2 重点代码分析2.2.0 主要代码模块交互流程分析2.2.1 isv_app文件夹2.…

python-18-零基础自学python-用类创建冰淇凌小店的口味

学习内容:《python编程:从入门到实践》第二版 知识点: 类、子类、继承、调用函数 练习内容: 练习9-6:冰激凌小店 冰激凌小店是一种特殊的餐馆。编写一个名为IceCreamStand的类,让它继承为完成练习9-1或…

YonBIP 获取项目代码配置(图文)

项目开发文件在本地环境重新部署后,开发端机器需要重新部署,在此记录一下操作过程。 1. 新建项目目录,在目录下点鼠标右键,选 Git Bash Here 2. 开始下载代码,根据代码量多少,几分钟就能下载完成。 3. 下载…

任意密码重置漏洞

文章目录 1. 任意密码重置漏洞原理2. 任意密码重置漏洞产生原因3. 任意密码重置漏洞场景3.1 验证码爆破3.2 验证凭证回传3.3 验证凭证未绑是用户3.4 跳过验证步骤3.5 凭证可预测3.6 同时向多个账户发送凭证 4. 任意密码重置经典案例4.1 中国人寿某重要系统任意账户密码重置4.2 …

【单元测试】Controller、Service、Repository 层的单元测试

Controller、Service、Repository 层的单元测试 1.Controller 层的单元测试1.1 创建一个用于测试的控制器1.2 编写测试 2.Service 层的单元测试2.1 创建一个实体类2.2 创建服务类2.3 编写测试 3.Repository 1.Controller 层的单元测试 下面通过实例演示如何在控制器中使用 Moc…

API-节点操作

学习目标: 掌握节点操作 学习内容: DOM节点查找节点增加节点删除节点 DOM节点: DOM树里每一个内容都称之为节点。 节点类型 元素节点所有的标签比如body、div;html是根节点属性节点所有的属性,比如href文本节点所有…

FastAPI-Cookie

fastapi-learning-notes/codes/ch01/main.py at master Relph1119/fastapi-learning-notes GitHub 1、Cookie的作用 Cookie可以充当用户认证的令牌,使得用户在首次登录后无需每次手动输入用户名和密码,即可访问受限资源,直到Cookie过期或…

《PyTorch计算机视觉实战》:一、二章

目录 第一章:人工神经网络基础 比较人工智能和传统机器学习 人工神经网络(Artificial Neural Network,ANN) 是一种受人类大脑运作方式启发而构建的监督学习算法。神经网络与人类大脑中神经元连接和激活的方式比较类似&#xff0…

GoLang语言

基础 安装Go扩展 go build 在项目目录下执行go build go run 像执行脚本文件一样执行Go代码 go install go install分为两步: 1、 先编译得到一个可执行文件 2、将可执行文件拷贝到GOPATH/bin Go 命令 go build :编译Go程序 go build -o "xx.exe"…

4.x86游戏实战-人物状态标志位

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:3.x86游戏实战-寄存器 人物状态标志位: 什么叫人物状态标志位&…

Leetcode[反转链表]

LCR 024. 反转链表 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示…