利用 consul+nginx-upsync 实现动态负载

如果Nginx遇到大流量和高负载,修改配置文件重启可能并不总是那么方便,因为恢复Nginx并重载配置会进一步增加系统负载,并很可能暂时降低性能。而一个个修改配置文件也是很容易出错和费时间的操作。

这时候不妨试试consul+nginx-upsync-module实现Nginx的动态负载。

nginx-upsync-module

nginx-upsync-module 提供了动态的负载均衡,它可以从consul或etcd同步upstreams,动态修改后端服务器属性(weight,max_fails,down…),而不需要重新加载nginx。这样我们通过它实现平滑伸缩,而不严重地影响性能。

利用docker安装

我已经基于centos7构建了一个镜像 13sai/nginx-lua-upsync ,你可以使用下面的命令启动一个容器

docker run -itd --name=nginx-upsync -p 8008:80 -p 9501:9501 -p 9502:9502 -p 9503:9503 -p 8500:8500 13sai/nginx-lua-upsync

当然,你也可以不使用docker自行搭建,添加nginx-upsync-module模块可以参考nginx模块lua模块

进入容器配置

docker exec -it nginx-upsync /bin/bash

cd /usr/local/nginx/conf

echo "server host.docker.internal:9501 weight=1 fail_timeout=10 max_fails=3;" >> servers.conf

vi nginx.conf

 #nginx.conf 主要配置
 ...

 upstream 13sai{
    upsync 192.168.65.2:8500/v1/kv/upstreams/test-server upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
    upsync_dump_path /usr/local/nginx/conf/servers.conf;
    include /usr/local/nginx/conf/servers.conf;
}


server {
    listen       80;

    location / {
        proxy_pass http://13sai;
    }


    ...

}

...

upsync语法说明

语法:syntax: upsync $consul/etcd.api.com:$port/v1/kv/upstreams/$upstream_name/ [upsync_type=consul/etcd] [upsync_interval=second/minutes] [upsync_timeout=second/minutes] [strong_dependency=off/on]
默认值:无,如果省略参数,则默认参数为upsync_interval = 5s upsync_timeout = 6m strong_dependency = off
描述:从 consul/etcd 中拉取upstreams

upsync 定义从consul/etcd拉取最新的upstream信息并存到本地的操作
upsync_timeout 定义从consul/etcd拉取配置的超时时间
upsync_interval 定义从consul/etc拉取配置的间隔时间
upsync_type 定义使用配置服务类型
strong_dependency 启动时是否强制依赖配置服务器,如果配置为on,则拉取失败,nginx同样会启用失败
upsync_dump_path 定义从consul/etcd拉取配置后持久化到的本地的文件路径,这样即使 consul/etcd出问题了,本地同样会有备份文件

注意下面这个文件必须要有,文件路径和名称可以自定义,nginx-upsync-module会将负载信息缓存到此文件,否则Nginx启动会报错。

#servers.conf,192.168.x.xxx是我的宿主机ip
server 192.168.x.xxx:9501 weight=20 max_fails=1 fail_timeout=5s;

重启nginx

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

这里虽然我们还未启动consul,但没有什么影响,upsync会去拉取,也必然会失败,servers.conf就不会更新,Nginx的error日志会有信息。

利用swoole启动3个http服务

// 可启动3个server,端口分别为9501,9502,9503,输出也做对应修改
$http = new Swoole\Http\Server("127.0.0.1", 9501);
$http->on('request', function ($request, $response) {
    $response->end("9501");
});

consul安装

这里consul只做一个kv存储,我自己也是第一次用,就不去做过多介绍了。

下载地址

解压到你需要的目录,主要也就是一个consul可执行文件。(这里我装在我的电脑,而不是刚才的docker容器)

命令可看文档:Consul 简介和快速入门

启动:

nohup ./consul agent -dev &

为了方便,我们也没有启动集群,生产环境建议使用consul集群。

UI查看

http://127.0.0.1:8500/

查看节点

./consul members

curl 127.0.0.1:8500/v1/catalog/nodes

查看kv值

curl -v http://127.0.0.1:8500/v1/kv/\?recurse

添加

curl -X PUT -d '{"weight":20,"max_fails":2,"fail_timeout":5}' http://127.0.0.1:8500/v1/kv/upstreams/test-server/192.168.x.xxx:9502

此处192.168.x.xxx是因为我创建的docker容器的宿主机ip。

删除

curl -X DELETE http://127.0.0.1:8500/v1/kv/upstreams/test-server/192.168.x.xxx:9502

我们可以通过添加和删除来测试,查看http://127.0.0.1:8008/来查看输出,也可以看看Nginx里的配置文件servers.conf,你会看到你操作consul,会动态改变Nginx的upstream,这样就实现了Nginx的动态扩容。

Image placeholder
weiyang86
未设置
  0人点赞

没有讨论,发表一下自己的看法吧

推荐文章
利用 consul+nginx-upsync 实现动态负载

这是前一段时间学习的课程上面的,自己实际操作了一下,详细操作及说明如下。如果Nginx遇到大流量和高负载,修改配置文件重启可能并不总是那么方便,因为恢复Nginx并重载配置会进一步增加系统负载,并很可

CentOS7 下使用 rsync+sersync 配置文件自动同步

为什么需要文件自动同步功能? 我们平时上传代码,可以通过ftp、sftp等将文件上传至服务器,耗时耗力,而且很容易出错。如果服务器数量少还好,一但服务器数量增加,压力可想而知。 这个时候我们可以使用各

Rust 标准库中的 async/await (async-std)

Rust对齐标准库中的async/await(async-std)简介现在的rust生态中,async/await在rust1.39中已经stable,其他库还有futures已经到0.3.x,还有就

安防摄像头RTSP/Onvif协议网页无插件直播视频流媒体服务器EasyNVR之按需直播如何有效利用最大上行带宽

介绍一般情况下,直播默认的播放方式是非按需直播,但很多情况下,不少用户会选择按需直播。按需直播能够减少带宽流量和服务器性能占用,最优的提高服务器的使用效率。下面我们来系统介绍下EasyNVR中按需直播

死磕Synchronized底层实现,面试你还怕什么?

关于 synchronized 的底层实现,网上有很多文章了。但是很多文章要么作者根本没看代码,仅仅是根据网上其他文章总结、照搬而成,难免有些错误;要么很多点都是一笔带过,对于为什么这样实现没有一个说

Talos网卡负载优化:基于个性化一致性哈希的负载均衡

本文将详细介绍基于个性化一致性哈希的流量均衡方法。 目录  业务增长带来的流量均衡需求基于一致性哈希的调度策略个性化一致性哈希的负载均衡流量均衡在Talos中的实现前文《小米消息队列的实践》介绍了小米

Linux 文件同步工具之 rsync

学习背景 1.最近公司的项目在使用jenkins做自动化构建,因为jenkins在构建时是比较耗性能的,便单独使用了一台服务器做构建服务器。但是个人觉得这样成本过高,单独拿一台服务器来构建并且该服务器

深入了解JavaScript async/await !

Asyncfunctions让我们以async这个关键字开始。它可以被放置在任何函数前面,像下面这样:asyncfunctionf(){ return1; }在函数前面的「async」这个单词表达了一

ES6问答-async函数

async函数 async是什么?它和Genernator函数外观上的区别是什么? constasyncReadFile=asyncfunction(){ constf1=awaitreadFile

Nginx 负载均衡

负载均衡策略 1.轮询(默认):每一个来自网络中的请求,轮流分配给内部的服务器,从1到N然后重新开始。此种负载均衡算法适合服务器组内部的服务器都具有相同的配置并且平均服务请求相对均衡的情况。 2.加

RTSP网络摄像头/海康大华硬盘录像机网页无插件直播方案EasyNVR如何实现RTMP/FLV/HLS/RTSP直播流分发

背景需求对于摄像机直播,客户反馈的最多就是实现web直播、摆脱插件,可以自定义集成等问题。我们熟悉的EasyNVR已经完美的解决了这些问题。然而对于web播放也存在一些问题,通常我们web播放RTMP

如何使网站支持https访问?nginx配置https证书

购买SSL证书要想使用https访问你的网址,首先得拥有颁发的SSL证书。我这里申请的是阿里云免费的,有效期为一年,过期后再重新申请。申请SSL证书购买后,可在阿里云的搜索框输入证书关键字进入到控制台

Nginx 之父被抓:Rambler集团声称他工作时间开发了NGINX,要求全部代码所有权

俄罗斯搜索引擎Rambler.ru声称拥有NGINX代码的全部所有权。俄罗斯警方近日突击搜查了F5Networks子公司NGINX的莫斯科办事处,NGINX公司开发了互联网上最受欢迎的Web服务器

Onvif/RTSP海康大华网络安防摄像机网页无插件直播方案EasyNVR中直播页面和视频列表页面的区别介绍

背景分析随着平安城市、智慧城市、雪亮工程、智能交通等各项建设的持续开展,安防逐渐得到普及,面对如此广阔的市场,对安防企业来说不仅仅是机遇更多的是挑战。现今大多数摄像头一直没能摆脱人工监控的传统监控方式

Onvif/RTSP海康大华网络安防摄像机网页无插件直播方案EasyNVR如何使用Excel将通道配置简单化?

进入移动互联网时代以来,企业微信公众号已成为除官网以外非常重要的宣传渠道,当3.2亿直播用户与9亿微信用户的势能累加,在微信上开启直播已成为越来越多企业的必然选择。EasyNVR核心在于摄像机的音视频

Onvif/RTSP海康大华网络安防摄像机网页无插件直播方案EasyNVR登陆用户名密码失效问题解决方案

背景分析随着互联网基础设施建设的发展,4G/5G/NB-IoT各种网络技术的大规模商用,视频随时随地可看、可控的诉求越来越多,互联网思维、架构和技术引入进传统监控行业里,成为新形势下全终端监控的基础需

RTSP、RTMP网络摄像头互联网无插件直播视频流媒体服务器EasyNVR在windows上无法启动问题排查

背景需求随着雪亮工程、明厨亮灶、手机看店、智慧幼儿园监控等行业开始将传统的安防摄像头进行互联网、微信直播,我们知道摄像头直播的春天了。将安防摄像头或NVR上的视频流转成互联网直播常用的RTSP、RTM

安防摄像头网页无插件直播流媒体服务器EasyNVR在IE浏览器下的 pointer-events- none前端兼容性调试

背景说明由于互联网的飞速发展,传统安防摄像头的视频监控直播与互联网直播相结合是大势所趋。传统安防的直播大多在一个局域网内,在播放的客户端上也是有所限制,一般都需要OCXWeb插件进行直播。对于安防监控

RTSP-ONVIF协议安防视频监控流媒体服务解决方案EasyNVR在Windows重启时提示“进程意外终止”问题解析

什么是ONVIFOpenNetworkVideoInterfaceForum,开放型网络视频接口论坛,以公开、开放的原则共同制定开放性行业标准。是一个提供开放网络视频接口的论坛组织。ONVIF规范描述

consul

//下载consul然后建立软连接 //启动 consulagent-server-bootstrap-expect1-data-dir/tmp/consul-node=ali_1-bind=127.

基于Redis实现Spring Cloud Gateway的动态管理

引言:SpringCloudGateway是当前使用非常广泛的一种API网关。它本身能力并不能完全满足企业对网关的期望,人们希望它可以提供更多的服务治理能力。但SpringCloudGateway并不

利用 samba 实现 Ubuntu18.04 与 Windows10 的文件共享

在Ubuntu18.04上安装samba服务 打开终端,使用下面指令安装samba服务。 $sudoaptinstallsamba $sudoaptinstallsmbclient 在Ubuntu1

nginx 如何实现 if 嵌套

nginx不支持if嵌套,也不允许在if中使用逻辑判断,会报如下错误: nginx:[emerg]"if"directiveisnotallowed 当业务需要多个条件判断时,可以借助中间变量来实

Go语言高级编程_6.5 负载均衡

6.5负载均衡 本节将会讨论常见的分布式系统负载均衡手段。 6.5.1常见的负载均衡思路 如果我们不考虑均衡的话,现在有n个服务节点,我们完成业务流程只需要从这n个中挑出其中的一个。有几种思路: 按顺

DPVS – 小米高性能负载均衡器

随着互联网的快速发展,负载均衡也承担着越来越重要的角色,对于小米这种快速发展中的年轻公司来说,负载均衡的稳定及高性能更是重中之重。本文将主要介绍小米基于DPDK的高性能负载均衡软件DPVS(DataP