nginx蓝绿发布通过配置upstream分组与current_env入口实现秒级无中断切换,依赖reload热重载,支持脚本自动化及灰度权重控制。

用 Nginx 实现后端服务的蓝绿发布,核心是让流量在两套独立环境(蓝/绿)之间秒级切换,全程不中断、可回滚。它不依赖复杂平台,靠配置+ reload 就能完成,适合中小团队快速落地。
准备两套隔离的后端服务
蓝环境(当前稳定版)和绿环境(待上线新版本)必须完全独立部署,包括应用、数据库连接、配置文件等。例如:
- 蓝服务监听 192.168.1.10:8080
- 绿服务监听 192.168.1.11:8080
确保绿环境已部署完成,并通过内部接口或健康检查(如 /health)验证可用性。不要等到切流时才发现启动失败。
配置 upstream 分组并定义默认路由
在 Nginx 配置中明确区分两个环境,再用一个统一入口指向当前生产版本:
- 定义
upstream blue_env和upstream green_env,各自包含对应后端地址 - 创建
upstream current_env,初始只包含蓝环境服务器(如server 192.168.1.10:8080) - 主 server 块中
proxy_pass http://current_env,所有请求都走这个逻辑入口
这样做的好处是:切换只需改 current_env 的内容,不影响其他配置,也避免硬编码在 location 中。
通过脚本或手动方式切换流量
上线时,把 current_env 指向绿环境;回滚时,再切回蓝环境。推荐用脚本自动化,例如:
- 用
sed替换配置文件中current_env内的 server 地址 - 执行
nginx -t校验语法 - 执行
nginx -s reload热重载,毫秒级生效
切流前后建议加简单检查:curl 对应健康接口、观察 Nginx access 日志确认请求是否已进入新环境。
进阶:支持灰度与动态控制
如果需要小流量验证,可在同一 upstream 中同时加入蓝、绿节点,并设置 weight:
-
server 192.168.1.10:8080 weight=90(蓝) -
server 192.168.1.11:8080 weight=10(绿)
验证无误后逐步调高绿端权重至 100,同时将蓝端设为 weight=0(Nginx 1.9.1+ 支持)或移除。也可配合 map 指令,根据请求头(如 X-Deploy-Phase: green)做条件路由,实现更灵活的测试路径。











