点赞
评论
收藏
分享
举报
API 动态更新 Upstream
发表于2022-08-19 17:17

浏览 2.5k

今天和大家聊聊 API 动态更新 Upstream 功能,它可以动态的添加、修改、或移除上游服务器组中的节点,且无需重新加载服务器或 NGINX 配置,下面就详细来看一下吧。

解决了什么问题?


通常情况下,我们要更新 Upstream 的 Server 成员及属性信息,我们需要如下步骤:

1、更新 Upstream 的配置,需要编辑 NGINX 的配置文件,如下代码:

http {
# 创建upstream group(包含server成员)
upstream appservers {
zone appservers 64k;
server appserv1.example.com weight=5;
server appserv2.example.com:8080 fail_timeout=5s;
server reserve1.example.com:8080 backup;
server reserve2.example.com:8080 down;
}
}


2、配置更新后,重载配置,以保证配置生效,如上操作无法实现动态更新,即时性较差。
而通过 API 动态更新 Upstream,就可以解决如上的问题。

哪些场景会用到该功能呢?

  • 自动扩容:当需要往 Upstream group 中添加更多的 server 时;
  • 服务器成员维护:当你需要移除一个 server,或指定一个 server 为备份服务器时,或暂时关闭一个 server 停止提供服务时;
  • 快速设置服务器属性:诸如当你需要改变服务器权重、活动连接、缓慢启动、故障超时等属性需求时。
  • 服务器状态监控:当需要用一个命令来获得服务器或服务器组的状态时。


如何启用动态 Upstream API


通过以下代码配置 Upstream 列表以及反向代理,并且开启 API 动态:


用 API 指令开启 / 关闭 NGINX API, write=on 表示以读写模式打开。write 默认不写,代表 off,仅支持查询操作。


动态 API 更新 Upstream 应用例子


1、动态添加 Server

可以以 IP 地址形式动态添加 server,执行如下命令:

curl -v -X POST -s http://192.168.40.111:8181/zxlapi/7/http/upstreams/cluster1/servers -d '{"server": "192.168.40.135:8080"}'|jq .


返回结果如下图:



也可以以域名方式动态添加:

curl -v -X POST -s http://192.168.40.111:8181/zxlapi/7/http/upstreams/cluster1/servers -d '{"server": "serv110.tmzy.com:8080"}'|jq .


以域名方式添加的 server 不同之处在于,域名方式添加的 server 会作为父 server 存在,它也会占用一个 server id, 其下可能关联一个或更多个子 server。

2、动态修改 server

修改命令参考如下:

curl -v -X PATCH -s http://192.168.40.111:8181/zxlapi/7/http/upstreams/cluster1/servers/6 -d '{"backup": false, "weight": 10 }' |jq .


  • 修改后随即会返回修改的 server 的基本信息,不包括健康状况,请求响应等信息。
  • 注意,以域名形式添加的 server,父 server 和子 server 都支持修改,互不影响。


3、动态删除 server

删除命令参考如下:

curl -X DELETE -s http://192.168.40.111:8181/zxlapi/7/http/upstreams/cluster1/servers/1 |jq .


  • 以 IP 形式添加的 server,执行删除命令后,随即返回结果就可以看见成功删除了一条。
  • 以域名形式添加的 server,执行删除父 server 命令后,父 server 和其下所有子 server 会一并删除。
  • 以域名形式添加的 server,执行删除子 server 命令后,要进行提示校验,不允许删除子 server。


4、查询 server

命令参考如下:

curl -v http://192.168.40.111:8181/zxlapi/7/http/upstreams/cluster1/servers/ server_id | jq .


以域名方式添加的子 server 的查询返回结果如下:会比 IP 形式添加的 server 多出 parent 和 host 两个字段。



5、动态配置的持久化

通过 API 所做的更改,在配置文件被重新加载时,这些改变会被丢弃, 那想让动态修改永久生效怎么办?可以通过 state 指令来实现动态配置的持久化。

http {
# ...
upstream appservers {
zone appservers 64k;
state /var/lib/nginx/state/appservers.conf;

# All servers are defined in the state file
# server appserv1.example.com weight=5;
# server appserv2.example.com:8080 fail_timeout=5s;

}
}


注意:state 状态文件只能通过 API 方式进行修改,不要去直接修改该文件。

已修改于2023-03-09 07:59
本作品系原创
创作不易,留下一份鼓励
TMLake

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(1)

按点赞数排序

按时间排序

这个api动态修改upstream是开源版提供的还是plus提供的啊

赞同

0

回复举报

发表于2022-10-11 11:14



回复gbk
回复
关于作者
TMLake
这家伙很懒还未留下介绍~
2
文章
0
问答
0
粉丝
相关文章
API作为应用程序编程接口,可以使用不同的编程语言进行API的开发,另外接口的表现形式也不同,现在最常用的接口形式有以下这些:1、HTTP接口(RESTful)基于HTTP协议开发的接口现在应用是最为广泛的,这类API使用起来简单明了,因为它是轻量级的、跨平台、跨语言的,但凡是第三方提供的API都会有HTTP版本的接口。RESTfulAPI也是基于HTTP协议的,只不过RESTful它并不是一种规范,它是一种设计准则,用不同的HTTP动词(GET、POST、DELETE、PUT等)来表达不同的请求。2、RPC接口RPC技术是指远程过程调用,它本质上是一种Client/Server模式,可以像调用本地方法一样去调用远程服务器上的方法,它支持多种协议(如:HTTP、TCP、UDP、自定协议)和多种数据传输方式(如:Json、XML、Binary、Protobuf等)。3、WebService接口WebService其实是一种概念,我们可以将以WEB形式提供的服务称为WebService,所以像RESTful、XML-RPC、SOAP等都可以当成是WebService的一种实
点赞 2
浏览 1.1k
之前写了篇文章用openresty实现了一个动态路由,虽然说是动态的,但是实际上还是需要将upstream在配置文件中写好,还是相当于静态的。最近工作中有这方面的需求,upstream是完全动态,由客户端来指定,开始的时候有一些错误,最后通过resolver指定dns服务来完成,具体流程如下。1.开始踩坑nginx的配置如下:worker_processes1; events{ worker_connections1024; } http{ server{ listen8001; server_namelocalhost; location/{ set$upstream_host$http_upstream_host; echo$http_upstream_host; proxy_passhttp://$upstream_host;
点赞 1
浏览 2.1k
upstream模块(100%)nginx模块一般被分成三大类:handler、filter和upstream。前面的章节中,读者已经了解了handler、filter。利用这两类模块,可以使nginx轻松完成任何单机工作。而本章介绍的upstream,将使nginx将跨越单机的限制,完成网络数据的接收、处理和转发。数据转发功能,为nginx提供了跨越单机的横向处理能力,使nginx摆脱只能为终端节点提供单一功能的限制,而使它具备了网路应用级别的拆分、封装和整合的战略功能。在云模型大行其道的今天,数据转发使nginx有能力构建一个网络应用的关键组件。当然,一个网络应用的关键组件往往一开始都会考虑通过高级开发语言编写,因为开发比较方便,但系统到达一定规模,需要更重视性能的时候,这些高级语言为了达成目标所做的结构化修改所付出的代价会使nginx的upstream模块就呈现出极大的吸引力,因为他天生就快。作为附带,nginx的配置提供的层次化和松耦合使得系统的扩展性也可能达到比较高的程度。言归正传,下面介绍upstream的写法。upstream模块接口从本质上说,upstream属于ha
点赞 0
浏览 1.5k