Nginx 的 upstream(上游服务器组)配置本质是静态的:后台节点扩容缩容时只能手工改配置并重启服务,无法做到实时感知。本文讲解入口网关服务注册发现的场景与意义,并基于 OpenResty + Lua 演示一套支持动态添加、删除、监控 upstream 节点的方案。OpenResty 是 Nginx 与 Lua 结合的高性能 Web 平台,内置大量 Lua 库与第三方模块,免去手工编译 Lua 模块的繁琐。
典型场景:入口流量经 Nginx 网关通过 upstream 负载均衡分发给后台 real server(App server 1、App server 2)。当集群新增一台 App server 3 时,希望流量能自动(非手工)分发给新节点,这就需要动态配置 upstream。
节点将自身信息(负载情况、服务状态、连接信息、服务名称等)实时上报给管理中心,管理中心收集节点状态后,根据策略动态调整 Nginx 的 upstream 配置:
如果 upstream 靠手工调整(改配置 + 重启服务),无法做到自动化与实时触发。在 K8s 场景中,etcd 作为服务注册发现的 KV 存储,保存后台节点服务(服务名称、连接方式等)注册信息;入口网关(Nginx)监听 etcd 数据变化动态调整 upstream 配置——这就是 K8s 动态入口网关的理论原理。
| 方式 | 说明 |
|---|---|
| Nginx + Lua(OpenResty) | 用 Lua 开发动态调用接口 |
| 开源组件 | confd 工具、11-Nginx基础概述-upsync-module 模块 |
| 独立入口网关替换 | Kong、Traefik 等云原生网关 |
Nginx 默认配置模块对动态 upstream 支持有限,本文演示基于 OpenResty 的方案。
文字说明:后台 Real Server 节点(含新增节点)实时向管理中心上报负载、状态等自身信息;管理中心根据策略调用网关 HTTP 接口对动态 upstream 进行 add(添加)/ del(删除)调整;网关按更新后的节点池做负载均衡调度,用户流量据此动态分流。
文字说明:OpenResty 主配置 11-Nginx基础概述.conf 引用 ngx_lua 目录下的三个 Lua 脚本——upsops.lua(提供动态调节 upstream 节点信息的接口)、upstream.lua(负载均衡策略)、节点信息获取脚本。对外同时提供根访问路径(反向代理到 81/82/83 三份虚拟主机,用 balancer_by_lua_file 修改默认负载均衡策略)与 location=/ups(动态更新 upstream 节点信息)两类入口。
upsops.lua、upstream.lua、节点信息获取脚本;balancer_by_lua_file 修改默认负载均衡策略)和 location=/ups(动态更新 upstream 节点信息的接口)。down_server 函数控制:upstream 后台 real server 至少保留一台主机,不允许删到零台;启动 OpenResty(800 端口)后访问测试:
整个过程全部通过调用 HTTP API 接口实现;真实动态发现时,管理或注册中心只需通过 HTTP API 即可动态调整 upstream 配置。
down_server 函数约束后台 real server 至少保留一台主机,避免误删导致后端整体不可用。docs/运维/04-Nginx/。