Nginx反向代理实现负载均衡+Keepalive实现高可用

目录

实现负载均衡

实现高可用


实现负载均衡

Nginx的几种负载均衡算法:

  • 1.轮询(默认) 每个请求按照时间顺序逐一分配到下游的服务节点,如果其中某一节点故障,nginx 会自动剔除故障系统使用户使用不受影响。

  • 2.权重(weight) 在配置文件中对下游的服务节点指定权重值 weight, weight 值越大则被分配的评率越高,一般这种负载均衡,用于节点的配置情况不一样,有的可能配置高,有的配置低。

  • 3.ip_hash 对每个请求,针对 ip 进行 hash, 然后分配到后台节点,这样一来,同一 ip 会被固定分配到下游固定服务上。它能够暂时的解决集群环境中容器之间 session 共享的问题(因为session每次只能和一个人,一对一的记录,但是如果现在需要负载均衡就出现了一种一对多的情况,可以使用ip_hash实现一对一),但是不是解决的根本之道,只是权宜之策,我们试想,如果访问的好好的,家里的路由器被重启了,或者运营商分配给你的 ip 地址改变了,那么你再次访问的时候,新的 ip 就可能被分配到新的服务上,之前的 session 也就失效了。

  • 4.least_conn (最少连接调度算法) 最少连接调度算法,对下游服务中连接情况,优先选择连接数最少的服务分配。

  • 5.least_time (最小响应时间) 最小响应时间, 计算节点平均响应时间,然后取响应最快的那个,分配更高权重。

(1)首先我们一共需要三个主机

后端的两个主机用于apache服务:

window10:192.168.159.165kail:192.168.159.151

负载均衡设备nginx:

centos1:192.168.159.200

(2)配置window10

开启apache服务

新建一个网页并且编辑内容:

新建的网页:www/index.html
内容:
Hello My Ip add 192.168.159.165

访问结果

(2)配置kail

开启apache服务

新建一个网页并且编辑内容:

网页地址:/var/html/index.html
网页内容:
Hello My Ip add 192.168.159.165

访问结果

(3)nginx设备配置

进入 /etc/nginx/nginx.conf

vim /etc/nginx/nginx.conf

配置负载均衡:

upstream nginx_boot{
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2   
server 192.168.159.151 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.159.165 weight=100 max_fails=2 fail_timeout=30s;
# 这里的IP请配置成你WEB服务所在的机器IP
}
server {location / {root   html;        # 配置一下index的地址,最后加上index.ftl。        index  index.html index.htm index.jsp index.ftl;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 请求交给名为nginx_boot的upstream上        proxy_pass http://nginx_boot;}location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css){root   /usr/local/nginx/html/static;expires 7d;}
}

现在可以尝试访问:

第一次:

第二次:

不断地尝试可以发现:始终是访问一次165然后再一次151,成功的实现了负载均衡!!!,并且权重和我们设置的也是一样的,当然也可以手动的修改权重

也可以将负载均衡的方式修改为轮询或者上面介绍的其他方式。

实现高可用

线上如果采用单个节点的方式部署Nginx,难免会出现天灾人祸,比如系统异常、程序宕机、服务器断电、机房爆炸、地球毁灭….哈哈哈,夸张了。但实际生产环境中确实存在隐患问题,由于Nginx作为整个系统的网关层接入外部流量,所以一旦Nginx宕机,最终就会导致整个系统不可用,这无疑对于用户的体验感是极差的,因此也得保障Nginx高可用的特性。

接下来则会通过keepalived的VIP机制,实现Nginx的高可用。 VIP并不是只会员的意思,而是指Virtual IP,即虚拟IP。

keepalived在之前单体架构开发时,是一个用的较为频繁的高可用技术,比如MySQL、Redis、MQ、Proxy、Tomcat等各处都会通过keepalived提供的VIP机制,实现单节点应用的高可用。

上面那个实验完成了,但是现在实现了负载均衡但是并没有实现高可用问题

需要实现高可用,那就需要增加一台nginx服务器

这里使用192.168.159.201当做另外一台nginx服务器

实现原理:(类似于VRRP)

  1. 需要在200和201这两台设备上都安装keepalive+nginx的环境

  2. keepLive虚拟出一个VIP

  3. 浏览器通过访问这个VIP来实现高可用

这里以192.168.159.200这台设备为了,下面是具体的过程:

(1)首先配置keepalive

//获取软件包
wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
//解压
tar -zxvf keepalived-2.2.4.tar.gz
//进入该目录中后进行预编译
./configure
//编译
make/make install

(2)添加配置文件

vi keepalived.conf

bal_defs {  # 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。notification_email {  root@localhost  }  notification_email_from root@localhost  smtp_server localhost  smtp_connect_timeout 30  # 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)  router_id 192.168.159.200
}  # 定时运行的脚本文件配置  
vrrp_script check_nginx_pid_restart {  # 之前编写的nginx重启脚本的所在位置  script "/soft/scripts/keepalived/check_nginx_pid_restart.sh"   # 每间隔3秒执行一次  interval 3  # 如果脚本中的条件成立,重启一次则权重-20  weight -20  
}  # 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)  
vrrp_instance VI_1 {  # 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)  state MASTER  # 绑定虚拟IP的网络接口,根据自己的机器的网卡配置  interface ens33   # 虚拟路由的ID号,主从两个节点设置必须一样  virtual_router_id 250 # 填写本机IP  mcast_src_ip 192.168.159.200  # 节点权重优先级,主节点要比从节点优先级高  priority 100  # 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题  nopreempt  # 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)  advert_int 1  authentication {  auth_type PASS  auth_pass 1111  }  # 将track_script块加入instance配置块  track_script {  # 执行Nginx监控的脚本  check_nginx_pid_restart  }  virtual_ipaddress {  # 虚拟IP(VIP),也可扩展,可配置多个。192.168.159.250  }  
}

(7)编写脚本

vim check_nginx_pid_restart.sh

//脚本内容:
#!/bin/sh  
# 通过ps指令查询后台的nginx进程数,并将其保存在变量nginx_number中  
nginx_number=`ps -C nginx --no-header | wc -l`  
# 判断后台是否还有Nginx进程在运行  
if [ $nginx_number -eq 0 ];then  # 如果后台查询不到`Nginx`进程存在,则执行重启指令  /soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf  # 重启后等待1s后,再次查询后台进程数  sleep 1  # 如果重启后依旧无法查询到nginx进程  if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then  # 将keepalived主机下线,将虚拟IP漂移给从机,从机上线接管Nginx服务  systemctl stop keepalived.service  fi  
fi

(8)为该脚本授权

chmod +x check_nginx_pid_restart.sh

(9)将一些文件拷贝到/etc下

mkdir /etc/keepalived
cp keepalived.conf /etc/keepalived/
cd /root/keepalived/keepalived/etc/init.d
cp keepalived /etc/init.d/
cd ../sysconfig
cp keepalived /etc/sysconfig/

(10)修改配置文件

vim /etc/keepalived/keeplive.conf
//修改后:
bal_defs {  # 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。notification_email {  root@localhost  }  notification_email_from root@localhost  smtp_server localhost  smtp_connect_timeout 30  # 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)  router_id 192.168.159.200
}  # 定时运行的脚本文件配置  
vrrp_script check_nginx_pid_restart {  # 之前编写的nginx重启脚本的所在位置  script "/root//keepalived/keepalived/etc/keepalived/check_nginx_pid_restart.sh"   # 每间隔3秒执行一次  interval 3  # 如果脚本中的条件成立,重启一次则权重-20  weight -20  
}  # 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)  
vrrp_instance VI_1 {  # 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)  state MASTER  # 绑定虚拟IP的网络接口,根据自己的机器的网卡配置  interface ens33   # 虚拟路由的ID号,主从两个节点设置必须一样  virtual_router_id 250 # 填写本机IP  mcast_src_ip 192.168.159.200  # 节点权重优先级,主节点要比从节点优先级高  priority 100  # 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题  nopreempt  # 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)  advert_int 1  authentication {  auth_type PASS  auth_pass 1111  }  # 将track_script块加入instance配置块  track_script {  # 执行Nginx监控的脚本  check_nginx_pid_restart  }  virtual_ipaddress {  # 虚拟IP(VIP),也可扩展,可配置多个。192.168.159.250  }  
}

(11)设置开机自启

[root@centos111 keepalived]# chkconfig keepalived on
[root@centos111 keepalived]# systemctl daemon-reload
[root@centos111 keepalived]# systemctl start keepalived.service 
[root@centos111 keepalived]# systemctl enable keepalived.service 

(12)备服务器配置(201)--大致流程与200相同

这里就不详细演示了

注:从上图中可以明显看见虚拟IP已经成功挂载,但另外一台机器192.168.12.250并不会挂载这个虚拟IP,只有当主机下线后,作为从机的192.168.12.130才会上线,接替VIP。

(13)测试

使用kail (192.168.159.151) ping 虚拟ip(192.168.159.250)、

可以看到成功的ping通了

现在尝试关闭192.168.159.200服务器

nmcli con down ens33

然后再打开该服务器

nmcli con up ens33

查看192.168.159.201服务器

可以发现192.168.159.250这个虚拟ip已经转到备服务器(192.168.159.201)这里了!

到此Nginx的负载均衡和高可用实验都全部完成!!

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

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

相关文章

主播产品塑造话术

产品卖点 一、品质卓越 我们的产品始终坚持高品质的标准,从原材料的选择到生产工艺的把控,每一个环节都经过严格的品质检测。我们注重产品的耐用性和稳定性,确保您在使用过程中无需担心质量问题。 二、功能强大 我们的产品不仅具备基本的…

人人吐槽互联网行情不好?但这个岗位的需求猛增、疯狂招人!

在目前的大环境下,外部力量对国内国高科技领域的打压和封锁,国内的IT大厂纷纷进行了裁员,IT行业的龙头大厂裁员举措引发行业震动…… 可真的是这样吗?中国IT没前途了?在IT行业找不到工作了?非也非也,这只…

1-docker安装和配置、虚拟化、配置国内源、镜像操作、容器基本操作(run运行容器、-v目录映射、-p端口映射、容器其他操作)

1 docker和虚拟化 2 docker安装和配置 2.0 docker 中的一些概念 2.1 配置国内源(不配也可以,只是会从国外仓库下载) 3 镜像操作 4 容器操作 4.1 容器基本操作 4.2 run运行容器 4.3 -v目录映射 4.4 -p端口映射 4.5 容器其他操作 1 docker和虚…

干货分享:好用的两款封面制作工具

无论你是图文博主还是视频博主,做封面都是必不可少的。关于做封面的产品,我推荐两个:如果你使用手机,我推荐使用醒图;如果你使用电脑,我则推荐稿定设计。 01 醒图 为什么醒图如此出色呢? 首先…

什么是steam搬砖中的散户、倒爷和倒狗?三者有什么区别?

steam/csgo游戏搬砖之如何注册 csgo饰品市场有三种人:散户,倒爷和倒狗。 散户:定义和股票市场中的定义是一样的,拥有同类型饰品数量占存世数量比例较小的人。 倒爷:拥有同类型饰品较多,但是不影响市场平衡…

能否在一台电脑上安全地登录多个Facebook账号?

Facebook是一个流量大、用户多的平台,许多人可能需要在一台设备上管理多个Facebook账号,无论是出于个人或职业需求,都能带来极大地便利。然而,保持每个账号的安全性和隐私性却是一个挑战。本文将介绍如何在一台电脑上安全地登录多…

如何使用cp命令复制文件和目录!【Linux命令合集】

如何使用cp命令复制文件和目录!【Linux命令合集】 Linux命令 只要你使用Linux,你就会一直使用cp命令。用于复制文件和目录。 常用组合键: # -r:复制整个目录(递归) # -p:保留原始文件所有者、组、权限和时间戳 cp -rp foldA fold…

【Linux】:消息队列和信号量

消息队列和信号量 一.消息队列1.原理2.消息队列的各种接口1.创建消息队列2.释放消息队列3.发送和接收信息 二.信号1.概念2.各种接口1.创建信号量2.销毁信号量3.对信号量进行操作 三.一个现象 一.消息队列 1.原理 这种消息队列被称为system V标准。 可以使用ipcs -q来查询消息队…

分页符 分页

【插入】---【分页符】 目录和一级标题得新起一页

【React-Router】路由快速上手

1. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 npm i react-router-dom2. 快速开始 // index.jsimport React from react; import ReactDOM from react-dom/client; import ./index.css; import App from ./App; i…

QEMU Guest Agent本地提权漏洞处理(CVE-2023-0664)

一、漏洞描述 QEMU Guest Agent(qga)类似于vmware中的 vmtools,相关安全报告显示它的Windows版本安装程序存在本地提权高危漏洞(CVE-2023-0664),攻击者可利用该漏洞进行本地权限提升,获得SYSTE…

音视频5、libavformat-1

libavformat库,是FFmpeg中用于处理各种媒体容器格式(media container format)的库。它的两个最主要的功能是 : demuxing:解封装,将一个媒体文件分割为多个多媒体流 muxing:封装,将多个多媒体数据流写入到指定媒体容器格式的文件中 这两个过程所做的…

智能化学习打破资源障碍 成为英语学习新趋势

智能化学习是一种基于互联网和人工智能技术的学习行为,通过网络,学习者可以随时随地进行学习,真正打破了时间和空间的限制。与传统线下学习方式相比,智能化学习更加方便、资源更加丰富,使海量英语学习资源唾手可得,智能化学习正逐渐成为中国孩子习得英语的重要方式。 随着全球…

基于python和django旅游管理系统

基于python和django旅游管理系统 摘要 基于Python和Django的旅游管理系统是一个以现代化技术为基础的系统,旨在提升旅游行业的管理效率和服务水平。该系统以Django框架为核心,结合Python编程语言的灵活性和强大的生态系统,实现了多方面的功能…

vue3之echarts渐变柱状图

vue3之echarts渐变柱状图 效果&#xff1a; 核心代码&#xff1a; <template><div class"abnormal"><div class"chart" ref"chartsRef"></div></div> </template><script setup> import * as echa…

新手小白想做跨境电商,应该选第三方平台还是独立站?

近几年在疫情的影响下&#xff0c;电商特有的“免接触”模式迅速切中消费者的心理痛点&#xff0c;加上国内电商发展已经趋于平缓&#xff0c;很多线下店铺被迫关闭&#xff0c;这也使得越来越多的大卖和平台也不约而同布局跨境电商。而说到跨境电商&#xff0c;或许大家普遍想…

论文阅读:MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model

论文标题&#xff1a; MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model 翻译&#xff1a; MedSegDiff&#xff1a;基于扩散概率模型的医学图像分割 名词解释&#xff1a; 高频分量&#xff08;高频信号&#xff09;对应着图像变化剧烈的部分&…

视频剪辑达人分享:高效减片头时长并调整播放速度的技巧,提升视频品质

在视频剪辑的过程中&#xff0c;许多初学者经常会遇到一些问题&#xff0c;如片头过长、播放速度不适当等&#xff0c;这些问题不仅会影响观众的观看体验&#xff0c;还会对视频品质产生负面影响。在调整播放速度时&#xff0c;要根据视频内容来进行调整。一般来说&#xff0c;…