Nginx + consul + upsync 完成动态负载均衡的方法详解


Posted in Servers onMarch 31, 2021

前置知识

DNS域名解析过程

  • 在浏览器输入域名,访问后
  • 在浏览器缓存中查找是否有对应的ip和端口,如果有直接访问对应ip和端口
  • 浏览器缓存中没有则在本地host文件中查找是否有对应的~~
  • 本地host文件中没有则去DSN服务器上查找

 外网映射

顾名思义,就是将本地的ip地址,映射出一个公网ip,可以供所有主机(连接到互联网的计算机)访问

  • 疑问:为什么需要使用外网映射

例如做微信支付时的第三方接口回调,微信回调你的接口必须是一个公网ip地址,不然他根本无法给你回调,导致你本地无法测试。这个时候你就需要外网映射来将自己的ip地址映射成一个公网(可供主机访问的网络)

  • 疑问:如何实现外网映射?

通过第三方工具完成外网映射,例如natapp,ngrok,具体如何使用自行进入官网观看,
ngrok官网.
natapp官网.(推荐)

 nginx 核心知识

什么是nginx

nginx是一款轻量级的web服务器/反向代理服务器,很小并且支持非常高的并发量

应用场景

http服务器 :做静态服务器、图片服务器
虚拟主机配置 :将一台服务器、拆分成多个网站部署。(可以通过配置不同的域名映射或者不同的端口来完成虚拟主机的配置)
反向代理: 使用反向代理隐藏真实ip地址
反向代理应用场景:
你有3台服务器分别提供不同的服务,这个时候使用nginx来配置通过域名映射来完成不同三台服务器的访问,或者通过端口也可以。可以隐藏3台提供服务器的真实ip地址,nginx通过内部转发到不同的服务器,抓包工具也只能获取到nginx服务器的ip地址(没有基点)。
负载均衡
安全配置
使用Nginx搭建API接口网关,解决网站跨域问题
实现网站静态资源和动态资源分离
实现防止DDOS(流量攻击)

名词解释

四层负载均衡

运行在运输层,常使用TCP协议

七层负载均衡

运行在应用层,常使用Http协议

负载均衡

作用: 能够减轻单台服务器的压力,故障转移(重试机制)如果一台服务器宕机了,直接轮询到下一台服务器、健康检查,在nginx中使用upstream配置上游服务器,nginx中

故障转移

如果访问其中一台服务器,发现服务宕机了,或者有延迟,可以配置故障转移直接切换到另一台服务器

### 连接到上游服务器的时间
		proxy_connect_timeout 1s;
		### 发送请求超时时间
 proxy_send_timeout 1s;
		### 接受相应超时时间
 proxy_read_timeout 1s;

动态负载均衡

在upstream中的配置不再是静态的,而是在注册中心上动态拉取配置,达到动态负载均衡的功能。

Nginx + consul + upsync 完成动态负载均衡

 1、安装centos7的基础环境

# 基础命令
 # 安装netstat命令
yum install netstat
 # 查看所有tcp端口使用情况
 netstat -ntlp
 # 查看当前服务进程
 ps -ef 可选:[ | grep nginx]
 # 强制杀死端口对应的程序
 kill -9 pid进程号
 
# 配置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum update
yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装基本环境
yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
yum install wget
yum install unzip

2、安装consul (服务注册与发现)

# 下载它的安装包,wget -c 中的 -c 表示断点续传
wget -c https://releases.hashicorp.com/consul/1.8.5/consul_1.8.5_linux_amd64.zip
# 解压压缩包
upzip unzip consul_1.8.5_linux_amd64.zip
# 执行./consul命令,执行后出现 Usage: consul [--version] [--help] <command> [<args>] 这一行以及下面的一些参数则代表这个consul没问题
./consul
# 关闭防火墙
systemctl stop firewalld
# 启动consul,这个ip填写自己计算机的ip,如果是虚拟机就填虚拟机的ip,centos查看ip地址可以用ip addr,window查看ip用 ipconfig
./consul agent -dev -ui -node=consul-dev -client=192.168.254.134
# 当然,也可以使用后台运行的方式,这样子输出的日志回到同级的nohup.out文件中
nohup ./consul agent -dev -ui -node=consul-dev -client=192.168.254.134 &
# 访问consul 的web页面
192.168.254.134:8500

# 查看并关闭consul的后台进程,我这里写的19854是jobs -l查询到的进程pid
jobs -l
kill -9 19854

3、安装nginx 并且为其添加upsync模块

# 下载upsync模块并且将其解压
wget -c https://github.com/weibocom/nginx-upsync-module/archive/master.zip
unzip nginx-upsync-module-master.zip
# 下载nginx
wget -c http://nginx.org/download/nginx-1.9.9.tar.gz
# 解压到当前目录
tar -zxvf nginx-1.9.9.tar.gz
# 配置一个nginx的用户以及用户组,-s /sbin/nologin nginx代表该用户是无法登录到主机的
groupadd nginx
useradd -g nginx -s /sbin/nologin nginx
# 这两个文件夹会在编译nginx时指定
mkdir -p /var/tmp/nginx/client/
mkdir -p /usr/local/nginx
# 进入到nginx的解压后文件夹的目录下
cd nginx-1.9.9 
# 编译 nginx ,--prefix 代表nginx安装的目录。其中指定了用户和用户组,以及上面创建的文件夹并且添加了upsync模块,由于upsync解压在nginx同级目录下,所以这里使用..来指定到它
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre --add-module=../nginx-upsync-module-master
make && make install
## 进入到刚刚nginx安装的目录,也就是/usr/local/nginx目录中,进入conf目录中编辑conf目录的文件内容
upstream myserver {
 server 127.0.0.1:11111;# 这个固定的,不用理
 # springbootserver : key的值,upsync_timeout 超时时间3秒,upsync_interval 间隔时间 ,upsync_type 类型consul,strong_dependency 增强依赖 
 upsync 192.168.254.134:8500/v1/kv/upstreams/springbootserver upsync_timeout=3000ms upsync_interval=500ms upsync_type=consul strong_dependency=off;
 # 将拉取下来的配置文件放在以下配置的目录中 
 upsync_dump_path /usr/local/nginx-1.9.9/conf/upsync_dump.conf;

 }
 # 将server中的location指定为刚刚创建的upstream(上游服务器)
 location / {
 proxy_pass http://myserver;
 index index.html index.htm;
 }
# 进入到sbin目录下,启动nginx
./nginx

4、进行测试

  • 本机启动2个服务,分别为8080和8081,ip地址为192.168.0.116
  • 使用linux命令为consul指定2个key value,192.168.254.134是consul的ip地址
# 使用curl 请求,一定要是put请求
curl -X PUT http://192.168.254.134:8500/v1/kv/upstreams/springbootserver/192.168.0.116:8080

curl -X PUT http://192.168.254.134:8500/v1/kv/upstreams/springbootserver/192.168.0.116:8081

#或者使用postman调用consul提供的api来添加key,value
http://192.168.254.134:8500/v1/kv/upstreams/springbootserver/192.168.0.116:8081

# 甚至可以图形化界面进行操作,手动添加key value,手动添加时注意如果是创建文件夹需要在最后加一个正斜杠 : /

5、在consul图形化页面添加key对应的value来指定负载均衡的算法

{"weight":1, "max_fails":2, "fail_timeout":10, "down":0}

到此这篇关于Nginx + consul + upsync 完成动态负载均衡的文章就介绍到这了,更多相关Nginx + consul + upsync 动态负载均衡内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
Nginx快速入门教程
Mar 31 Servers
nginx基于域名,端口,不同IP的虚拟主机设置的实现
Mar 31 Servers
查看nginx配置文件路径和资源文件路径的方法
Mar 31 Servers
Nginx服务器如何设置url链接
Mar 31 Servers
Nginx设置HTTPS的方法步骤 443证书配置方法
Mar 21 Servers
nginx常用配置conf的示例代码详解
Mar 21 Servers
阿里云日志过滤器配置日志服务
Apr 09 Servers
Nginx的gzip相关介绍
May 11 Servers
阿里云服务器Ubuntu 20.04上安装Odoo 15
May 20 Servers
Win2008系统搭建DHCP服务器
Jun 25 Servers
Windows Server 2008配置防火墙策略详解
Jun 28 Servers
Nginx 502 bad gateway错误解决的九种方案及原因
Aug 14 Servers
浅谈Nginx 中的两种限流方式
Mar 31 #Servers
查看nginx配置文件路径和资源文件路径的方法
Mar 31 #Servers
nginx里的rewrite跳转的实现
Mar 31 #Servers
nginx基于域名,端口,不同IP的虚拟主机设置的实现
Mar 31 #Servers
Nginx设置日志打印post请求参数的方法
Mar 31 #Servers
nginx 多个location转发任意请求或访问静态资源文件的实现
nginx简单配置多个server的方法
You might like
php中文本数据翻页(留言本翻页)
2006/10/09 PHP
PHP的ASP防火墙
2006/10/09 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
关于反爬虫的一些简单总结
2017/12/13 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
python开发游戏的前期准备
2019/05/05 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
小学五年级学生评语
2014/04/22 职场文书
护林防火标语
2014/06/27 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
z-index不起作用
2021/03/31 HTML / CSS