使用 NGINX Plus API 动态配置上游服务器
使用 NGINX Plus API 动态配置上游服务器
利用 NGINX Plus API,在不重新加载配置或重新启动进程的情况下,动态重新配置 NGINX Plus 上游组中的服务器。
概述
使用 NGINX Plus,可以在不重新加载服务器和 NGINX 配置的情况下,即时修改服务器组中上游服务器的配置。这在以下情况下非常有用:
- 自动扩展,当需要添加更多服务器时
- 维护,当需要移除服务器、指定备用服务器或临时将服务器下线时
- 快速设置,当需要更改上游服务器设置,如服务器权重、活动连接、慢启动、故障超时
- 监控,当使用一个命令获取服务器或服务器组的状态时
这些更改通过 NGINX Plus REST API 接口与 API 命令完成。
注意: 在 NGINX Plus R12 及之前的版本中,动态配置是通过 upstream_conf
处理程序执行的。该 API(以及扩展状态 API)现已弃用,取而代之的是 NGINX Plus API。
先决条件
在使用动态配置功能之前,请确保具备以下环境:
- NGINX Plus R13 或更高版本
- 已创建应用程序或 Web 服务器的上游组,如《HTTP 负载均衡和 TCP/UDP 负载均衡》中所述
- 上游服务器组位于共享内存区域,如《与多个工作进程共享数据》中所述
启用动态配置
按照《将流量代理到一组服务器》中的说明创建上游服务器组。
http {
# ...
upstream appservers {
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 backup;
}
server {
# 将请求代理到上游组的位置
location / {
proxy_pass http://appservers;
health_check;
}
}
}
在上游块中包含 zone
指令。zone
指令配置共享内存中的一个区域,并设置区域名称和大小。服务器组的配置保存在此区域中,因此所有工作进程都使用相同的配置。
http {
# ...
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 backup;
}
}
通过在服务器块中的专用位置块中包含 api
指令,将 NGINX API 启用为读写模式。
我们强烈建议限制对位置和 PATCH/POST/DELETE 方法的访问。此示例使用 allow
和 deny
指令,允许来自本地主机地址(127.0.0.1)的访问,并拒绝所有其他地址的访问。它还通过 HTTP 基本认证限制了对 PATCH/POST/DELETE 方法的访问。
server {
location /api {
limit_except GET {
auth_basic "NGINX Plus API";
auth_basic_user_file /path/to/passwd/file;
}
api write=on;
allow 127.0.0.1;
deny all;
}
}
完整示例:
http {
# ...
# 服务器组的配置
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 backup;
}
server {
# 将请求代理到上游组的位置
location / {
proxy_pass http://appservers;
health_check;
}
# 用于动态配置请求的位置
location /api {
limit_except GET {
auth_basic "NGINX Plus API";
auth_basic_user_file /path/to/passwd/file;
}
api write=on;
allow 127.0.0.1;
deny all;
}
}
}
使用 API 进行动态配置
NGINX Plus REST API 支持以下 HTTP 方法:
- GET:显示有关上游组或其中单个服务器的信息
- POST:将服务器添加到上游组
- PATCH:修改特定服务器的参数
- DELETE:从上游组中删除服务器
NGINX Plus API 的端点和方法在 NGINX 模块参考中有描述。此外,API 具有内置的 Swagger 规范,可用于探索 API 并了解每个资源的功能。Swagger 文档可在 http://NGINX-host/swagger-ui/ 访问。
要动态更改上游组的配置,请发送带有适当 API 方法的 HTTP 请求。以下示例使用 curl 命令,但支持使用任何机制进行 HTTP 请求。所有请求体和响应都是 JSON 格式。
URI 按以下顺序指定了以下信息:
- 处理请求的节点的主机名或 IP 地址(在以下示例中为 127.0.0.1)
- api 指令出现的位置(api)
- API 版本(9)
- 上游组的名称,以其在 NGINX Plus 配置层次结构中的位置表示为斜杠分隔的路径(http/upstreams/appservers)
例如,要将新服务器添加到 appservers 上游组,请发送以下 curl 命令:
curl -X POST -d '{ \
"server": "10.0.0.1:8089", \
"weight": 4, \
"max_conns": 0, \
"max_fails": 0, \
"fail_timeout": "10s", \
"slow_start": "10s", \
"backup": true, \
"down": true \
}' -s 'http://127.0.0.1/api/9/http/upstreams/appservers/servers'
要从上游组中删除服务器:
curl -X DELETE -s 'http://127.0.0.1/api/9/http/upstreams/appservers/servers/0'
要为组中的第一个服务器设置 down 参数(ID 为 0):
curl -X PATCH -d '{ "down": true }' -s 'http://127.0.0.1/api/9/http/upstreams/appservers/servers/0'
交互式示例:
您可以以只读模式在 https://demo.nginx.com/swagger-ui/ 探索 NGINX Plus API 的 Swagger 界面。
配置动态配置的持久性
在《启用 API》中的基本配置中,使用 API 进行的更改仅存储在共享内存区域中。当重新加载 NGINX Plus 配置文件时,这些更改将被丢弃。
为了使更改在配置重新加载时持久化,将上游服务器列表从 upstream 块移动到一个专门用于存储服务器状态的文件中,并使用 state 指令进行定义。Linux 发行版的建议路径是 /var/lib/nginx/state/,FreeBSD 发行版的建议路径是 /var/db/nginx/state/。
http {
# ...
upstream appservers {
zone appservers 64k;
state /var/lib/nginx/state/appservers.conf;
# 所有服务器在状态文件中定义
# 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 backup;
}
}
请注意,只能使用 API 接口的配置命令来修改状态文件;不要直接修改文件(例如使用文本编辑器)。
参考资料
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-health-check/