加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 安全 > 正文

基于Upsync模块实现Nginx动态配置

发布时间:2021-01-18 08:49:57 所属栏目:安全 来源:网络整理
导读:副标题#e# 《基于Upsync模块实现Nginx动态配置》要点: 本文介绍了基于Upsync模块实现Nginx动态配置,希望对您有用。如果有疑问,可以联系我们。 题图:By Federico Respini From Unsplash Upsync是新浪微博开源的基于Nginx实现动态配置的三方模块. Nginx-U
副标题[/!--empirenews.page--]

《基于Upsync模块实现Nginx动态配置》要点:
本文介绍了基于Upsync模块实现Nginx动态配置,希望对您有用。如果有疑问,可以联系我们。

题图:By Federico Respini From Unsplash

Upsync是新浪微博开源的基于Nginx实现动态配置的三方模块.Nginx-Upsync-Module的功能是拉取Consul的后端server的列表,并动态更新Nginx的路由信息.此模块不依赖于任何第三方模块.Consul作为Nginx的DB,利用Consul的KV服务,每个Nginx Work进程独立的去拉取各个upstream的配置,并更新各自的路由.

Upsync模块工作原理

在Nginx的设计中,每一个upstream维护了一张静态路由表,存储了backend的ip、port以及其他的meta信息.每次请求到达后,会依据location检索路由表,然后依据具体的调度算法(如round robin )选择一个backend转发请求.但这张路由表是静态的,如果变更后,则必须reload,经常reload的话这对SLA有较大影响.

为了达到减少reload的目的,大多通过动态更新维护路由表来解决这个问题.通常路由表的维护有Push与Pull两种方式.

  • Push方案

通过Nginx API向Nginx发出请求,操作简单、便利.

架构图如下:

http api除了操作简单、方便,而且实时性好;缺点是有多台Nginx时,不同Nginx路由表的一致性难于保证,如果某一条注册失败,便会造成服务配置的不一致,容错复杂.另外扩容Nginx服务器,需要从其他的Nginx中同步路由表.

  • Pull方案

路由表中所有的backend信息(含meta)存储到Consul,所有的Nginx从Consul拉取相关信息.有变更则更新路由表,利用Consul解决一致性问题,同时利用Consul的wait机制解决实时性问题.利用Consul的index进行增量摘取,解决带宽占用问题.

在Consul中,一个K/V对代表一个backend信息,增加一个即视作扩容,减少一个即为缩容.调整meta信息,如权重,也可以达到动态流量调整的目的.

架构图如下:

  • 基于动态路由的方案实现

Upsync模块使用了第二种模式,通过拉取Consul的后端Server的列表,并动态更新Nginx的路由信息.Upsync模块工作流程图如下:

每个Work进程定时的去Consul拉取相应upstream的配置,若Consul发现对应upstream的值没有变化,便会hang住这个请求五分钟(默认值).在这五分钟内对此upstream的任何操作,都会立刻返回给Nginx对相应路由进行更新.

upstream变更后,除了更新Nginx的缓存路由信息,还会把本upstream的后端server列表dump到本地,保持本地server信息与consul的一致性.

除了注册/注销后端的server到consul,会更新到Nginx的upstream路由信息外,对后端server属性的修改也会同步到nginx的upstream路由.

Upsync模块支持修改的属性有:weight、max_fails、fail_timeout、down.

  1. 修改server的权重可以动态的调整后端的流量.
  2. 若想要临时移除server,可以把server的down属性置为1.
  3. 若要恢复流量,可重新把down置为0.

每个work进程各自拉取、更新各自的路由表,采用这种方式的原因:

  1. 基于Nginx的进程模型,彼此间数据独立、互不干扰.
  2. 若采用共享内存,需要提前预分配,灵活性可能受限制,而且还需要读写锁,对性能可能存在潜在的影响.
  3. 若采用共享内存,进程间协调去拉取配置,会增加它的复杂性,拉取的稳定性也会受到影响.

Upsync模块高可用性

Nginx的后端列表更新依赖于Consul,但是不强依赖于它,具体表现为:

  1. 即使中途Consul意外挂了,也不会影响Nginx的服务,Nginx会沿用最后一次更新的服务列表继续提供服务.
  2. 若Consul重新启动提供服务,这个时候Nginx会继续去Consul探测,这个时候Consul的后端服务列表发生了变化,也会及时的更新到Nginx.
  3. work进程每次更新都会把后端列表dump到本地,目的是降低对Consul的依赖性,即使在consul不可用时,也可以Reload Nginx.

Nginx启动流程图如下:

Nginx启动时,master进程首先会解析本地的配置文件,解析完成功,接着进行一系列的初始化,之后便会开始work进程的初始化.work初始化时会去Consul拉取配置,进行work进程upstream路由信息的更新,若拉取成功,便直接更新,若拉取失败,便会打开配置的dump后端列表的文件,提取之前dump下来的server信息,进行upstream路由的更新,之后便开始正常的提供服务.

每次去拉取Consul都会设置连接超时,由于Consul在无更新的情况下默认会hang五分钟,所以响应超时配置时间应大于五分钟.大于五分钟之后,Consul依旧没有返回,便直接做超时处理.

Upsync模块安装

安装Consul

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.

Upsync最新版本是支持ectd,这里用ectd做为后端存储.有关consule的讲解后面单独来讲.如果你还没有etcd环境,可参考「etcd使用入门」一文搭建一个.

安装配置Nginx

  • 下载对应软件包

这里使用的是Upsync最新版本,目前支持Nginx 1.9+.nginx-upstream-check-module是Tengine中的模块,主要用于upstream的健康检查.由于nginx-upstream-check-module最新版本只支持1.9.2,所以这里Nginx选用1.9.2.

$ cd /root

$ wget ‘http://nginx.org/download/nginx-1.9.2.tar.gz’

$ git clone https://github.com/weibocom/nginx-upsync-module

$ git clone https://github.com/xiaokai-wang/nginx_upstream_check_module

  • 编译安装Nginx

$ apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make build-essential

$ tar xzvf nginx-1.9.2.tar.gz

$ cd nginx-1.9.2

$ patch -p0 < ~/nginx_upstream_check_module/check_1.9.2+.patch

$ ./configure –add-module=/root/nginx_upstream_check_module –add-module=/root/nginx-upsync-module

$ make && make install

  • 配置Nginx

Nginx会默认安装到/usr/local/nginx目录下.

创建用户和相应目录

$ useradd -M nginx -s /sbin/nologin

$ mkdir -p /var/log/nginx

$ chown -R nginx.nginx /var/log/nginx

$ mkdir /usr/local/nginx/conf/conf.d

$ mkdir -p /usr/local/nginx/conf/servers

修改Nginx主配置文件

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读