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
Filebeat 采集 Nginx 日志的方法
Mar 31 Servers
图文详解Nginx版本平滑升级方案
Sep 15 Servers
Nginx虚拟主机的配置步骤过程全解
Mar 31 Servers
Kubernetes控制节点的部署
Apr 01 Servers
Docker官方工具docker-registry案例演示
Apr 13 Servers
Tomcat项目启动失败的原因和解决办法
Apr 20 Servers
Windows Server 2019 配置远程控制以及管理方法
Apr 28 Servers
使用Apache Camel表达REST服务的方法
Jun 10 Servers
Linux中sftp常用命令整理
Jun 28 Servers
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
Aug 05 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+MySQL5.0中文乱码解决方法
2006/11/20 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
PHP json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
javascript实现数字验证码的简单实例
2014/02/10 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
javascript实现table表格隔行变色的方法
2015/05/13 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
js选项卡的制作方法
2017/01/23 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
python安装教程
2018/02/28 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
python安装numpy和pandas的方法步骤
2019/05/27 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
Python计算机视觉里的IOU计算实例
2020/01/17 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
韩国11街:11STREET
2018/03/27 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
伊琍体标语
2014/06/25 职场文书
模范班主任事迹材料
2014/12/17 职场文书
小学远程教育工作总结
2015/08/13 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL