蓝绿发布通过Nginx代理双upstream实现零停机部署:蓝色为当前稳定版,绿色为待上线版;利用map变量或外部配置文件动态切换流量,并依赖健康检查与快速回滚保障可靠性。

通过 Nginx 代理实现蓝绿发布,核心是用两套独立的后端服务环境(蓝色、绿色),配合 Nginx 动态切换 upstream 流量入口,做到零停机、可回滚的版本发布。
准备两个隔离的后端集群
蓝绿发布依赖两套完全独立、可并行运行的服务实例:
- 蓝色环境(blue):当前稳定运行的生产版本,例如部署在 192.168.1.10:8080 和 192.168.1.11:8080
- 绿色环境(green):待上线的新版本,例如部署在 192.168.1.20:8080 和 192.168.1.21:8080
- 两者配置、数据库连接、中间件依赖需保持兼容;建议使用相同域名但不同端口或路径做健康检查隔离
在 Nginx 中定义双 upstream 并启用健康检查
在 nginx.conf 或站点配置中声明两个 upstream 块,推荐开启 health_check(需 nginx plus)或用开源版的被动健康检查 + 自定义探针:
upstream backend_blue {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}
upstream backend_green {
server 192.168.1.20:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.21:8080 max_fails=3 fail_timeout=30s;
}
若使用开源 Nginx,可通过 proxy_next_upstream 配合应用层 /health 端点实现基础可用性兜底。
用变量或配置文件控制流量路由
避免硬编码切换,推荐以下任一方式灵活控制当前生效环境:
-
方案一:基于 map 指令动态映射 upstream
在 http 块中定义:
map $host $backend_upstream {<br> default backend_blue;<br> ~*\.green\.example\.com$ backend_green;<br> }
然后 location 中用proxy_pass http://$backend_upstream;,通过子域名(如 blue.example.com / green.example.com)预验证新版本 -
方案二:外部配置驱动(推荐生产)
将 upstream 名称存入单独配置文件(如/etc/nginx/conf.d/current-env.conf),内容为:set $active_backend backend_blue;
在主配置中 include 该文件,并用proxy_pass http://$active_backend;。发布时仅需更新此文件 + reload Nginx
执行发布与验证流程
标准蓝绿操作步骤:
- 将新版本部署到绿色环境,确保所有实例就绪且 /health 返回 200
- 修改 Nginx 的路由指向(改 map 规则或更新 current-env.conf),执行
nginx -t && nginx -s reload - 立即验证绿色环境:检查日志、监控指标(5xx、延迟)、关键业务链路(如登录、下单)
- 若异常,3 秒内改回蓝色配置并 reload,即完成回滚
- 确认无误后,旧蓝色环境可下线或留作下一轮绿色环境复用
不复杂但容易忽略:务必确保会话(session)和缓存逻辑与蓝绿无关——避免用户因路由切换丢失状态;静态资源建议分离至 CDN,后端 API 应无状态。


















