ngx_http_upstream_conf_module是nginx官方1.9.11起内置的动态管理模块,通过http接口实现upstream服务器的增删、上下线等热更新操作,无需reload或重启,但需预定义zone且不持久化变更。

ngx_http_upstream_conf_module 是 Nginx 官方在 1.9.11 版本引入的模块,用于通过 HTTP 接口动态管理 upstream 配置(如添加、删除、启用/禁用服务器),**无需 reload 或重启 Nginx 进程**。它本质是一个内置的配置管理 API,配合 upstream 模块使用,是实现真正“热更新”负载节点的关键组件。
前提条件与启用方式
该模块默认不编译进大多数预编译包(如 Ubuntu apt 或 CentOS yum 安装的 nginx),需确认是否启用:
- 运行
nginx -V 2>&1 | grep -o with-http-upstream-conf-module,有输出表示已启用; - 若无,需从源码重新编译:配置时加入
--with-http-upstream-conf-module; - Nginx 版本必须 ≥ 1.9.11,推荐使用 1.20+ 稳定版;
- 仅支持 http 块下的 upstream,不支持 stream 模块或嵌套 upstream。
配置 upstream 并暴露管理接口
在 http{} 块中定义一个带 zone 的 upstream,并启用 conf 模块接口:
upstream backend {
zone backend 64k; # 必须声明 zone,大小按预期服务器数估算(每台约 1KB)
server 10.0.1.10:8080;
server 10.0.1.11:8080;
}
<p>server {
listen 8081;
location /upstream_conf {
upstream_conf; # 启用该 location 的管理能力
allow 127.0.0.1; # 强烈建议限制访问来源
allow 10.0.0.0/8; # 按需放开内网管理 IP
deny all;
}
}</p>
注意:`zone` 是核心——它把 upstream 状态存于共享内存,使 conf 接口能实时读写;没有 zone,upstream_conf 将返回 500 错误。
常用动态操作示例
所有操作均通过 HTTP 请求完成,方法为 GET(查询)或 POST(变更),参数以 query string 传递:
-
查看当前 upstream 状态:
curl "http://localhost:8081/upstream_conf?upstream=backend" -
新增一台服务器:
curl "http://localhost:8081/upstream_conf?add=&upstream=backend&server=10.0.1.12:8080" -
下线某台(标记为 down):
curl "http://localhost:8081/upstream_conf?down=&upstream=backend&server=10.0.1.10:8080" -
恢复上线:
curl "http://localhost:8081/upstream_conf?up=&upstream=backend&server=10.0.1.10:8080" -
永久移除服务器(从配置中删除):
curl "http://localhost:8081/upstream_conf?remove=&upstream=backend&server=10.0.1.11:8080"
成功响应为纯文本(如 OK),失败则返回对应 HTTP 状态码(400/404/500)及错误说明。
注意事项与局限性
该模块功能实用但存在明确边界,生产使用前需清楚:
- 不支持修改 server 的 weight、max_fails、fail_timeout 等参数,仅支持增删和上下线;
- 所有变更立即生效,但不会持久化到 nginx.conf —— 重启后恢复原始配置,需自行同步落盘(例如用脚本更新配置文件 + reload,或结合外部配置中心);
- 不触发健康检查重置,已标记为 down 的节点不会自动恢复,除非显式调用
up=; - 并发写入同一 upstream 时无锁保护,高频率变更建议加客户端限速或队列;
- 无法动态创建新 upstream 名称,只能操作已预定义的 zone。
它不是替代配置管理的银弹,而是运维自动化链路中“秒级生效”的关键一环,适合与服务发现(如 Consul、Nacos)或发布系统集成。











