Nginx可通过OpenResty的Lua脚本结合Redis实现零配置热切换后端服务:先从URL、Host或Header提取路由标识,再用resty.redis动态查目标地址,配合lua_shared_dict缓存与兜底机制,在access_by_lua_block中完成路由决策并赋值变量供proxy_pass使用。

不用改配置、不用 reload,Nginx 就能根据 Redis 里的规则实时切换后端服务——关键靠 OpenResty 的 Lua 脚本能力,把路由逻辑从静态配置里“解放”出来。
从 URL 或请求头提取路由标识
动态路由的第一步是知道“这个请求该走哪条路”。常见做法有:
- 按路径提取:比如 /user/profile → 提取 user 作为服务名;可用 Lua 的
string.match或自定义split_path函数拆分 - 按 Host 头识别:如 admin.example.com → 映射为 admin-svc
- 按 Header 指定:如 X-Route-Key: payment-v2,适合灰度或人工干预场景
用 Lua 查询 Redis 获取目标地址
拿到服务标识后,直接查 Redis 获取对应后端地址。典型流程是:
- 构造 key,例如 route:user 或 upstream:payment-v2
- 用
resty.redis模块连接并查询,设置超时(建议 ≤ 100ms)和重试次数(通常 1 次) - 若返回值是 IP:Port(如 10.0.1.5:8080),直接用于转发;若是域名,需配合 resolver 使用
缓存结果 + 设置兜底机制
频繁查 Redis 会影响性能和稳定性,必须加缓存和容错:
- 用
lua_shared_dict声明共享内存区域(如 redis_cache 10m),缓存 TTL 推荐 3–10 秒 - 查询 Redis 失败或返回空时,优先读缓存中的 last_known 值,避免全量失效
- 缓存和 Redis 都不可用?可 fallback 到预设的默认 upstream(如 proxy_pass http://default_backend),或返回 503
在 Nginx 配置中串联整个流程
把逻辑嵌入到标准生命周期阶段,推荐组合方式:
-
access_by_lua_block:提取标识、查 Redis、写入
ngx.var.upstream_addr或自定义变量(如ngx.var.backend) - set_by_lua_block(可选):做轻量判断或格式转换,避免阻塞
- proxy_pass http://$backend:变量代理,Nginx 自动解析为真实地址
注意不要在 content_by_lua_block 中做路由决策,它发生在 proxy 之后,已错过转发时机。



















