蓝绿部署实现服务零停机更新,新手也能操作
为什么需要蓝绿部署
线上服务更新最怕停机。
传统做法是先停服、再更新、再重启,用户会看到“服务不可用”的错误。
蓝绿部署的思路是同时维护两套完全一样的环境——蓝色环境(当前运行版本)和绿色环境(新版本),通过负载均衡器(例如 Nginx)瞬间切换流量,实现零停机更新。
准备工作
- 两台服务器(或同一台服务器的两个端口):蓝色环境运行当前版本,绿色环境准备部署新版本。如果没有两台服务器,在同一台机器上用不同端口(例如 :8081 和 :8082)模拟即可。
- Nginx 反向代理:安装 Nginx,用于接收外部请求并转发到蓝色或绿色环境。
- 应用代码:确保蓝色环境当前版本正常,绿色环境打包好新版代码(例如 WAR/JAR 或静态文件)。
- 健康检查端点:在应用里实现一个简单的
/health接口,返回 200 表示服务正常。
核心步骤:配置 Nginx + 切换流量
第一步:部署两套环境
假设蓝色环境运行在 192.168.1.10:8081,绿色环境准备部署在 192.168.1.10:8082。
启动绿色环境的新版本应用,确保能通过 curl http://192.168.1.10:8082/health 返回 200。
第二步:配置 Nginx,默认指向蓝色环境
编辑 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf),添加如下内容:
upstream backend {
server 192.168.1.10:8081; # 蓝色环境
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
重启 Nginx:sudo systemctl restart nginx。
此时所有流量都到蓝色环境。
第三步:验证蓝色环境正常工作
访问 http://example.com 或 curl http://localhost,确认返回的是当前版本内容。
第四步:切换到绿色环境(零停机)
只需修改 Nginx upstream 配置,将 server 指向绿色环境:
upstream backend {
server 192.168.1.10:8082; # 绿色环境(新版本)
}
重新加载 Nginx(不中断现有连接):sudo nginx -s reload。
第五步:验证新版本
再次访问服务,确认页面内容变为新版本。
如果出现问题,立即执行第六步回滚。
第六步:回滚方案(至关重要)
如果新版本有 bug,只需把 upstream 改回蓝色环境并 reload Nginx。
因为蓝色环境仍在运行,没有任何代码变动,回滚只需几秒钟,且不会停机。
避坑指南
- Session 丢失:蓝绿切换后,用户 session 可能丢失。解决方式:将 session 存储到 Redis 等外部缓存,两套环境共享同一个 Redis。
- 数据库迁移:新版本数据库结构变更时,需要向前兼容。先执行只加字段不删字段的迁移,待所有环境都更新后再清理旧字段。
- DNS 缓存:如果使用域名,DNS TTL 可能造成切换延迟。建议在切换前将 TTL 调低(例如 60 秒),切换后再调回正常值。
- 健康检查:切换前务必确保绿色环境
/health返回 200,否则流量切过去会导致大量报错。可以在 Nginx 里配置proxy_next_upstream来跳过不健康节点,但新手上路更推荐手动确认。 - 静态资源缓存:如果前端资源有版本号或 hash,切换后用户浏览器可能仍使用旧缓存。可配置强制刷新或在 URL 加版本参数。
效果验证与常见问题
怎么确认切换时没有停机?
在切换过程中持续用 curl 访问服务,同时观察返回的内容。如果连续返回正常,没有 502/503,就表示零停机成功。也可以借助压力测试工具(ab、wrk)并发访问,看切换瞬间是否有请求失败。
问:为什么切换后访问的还是旧版本?
可能原因:Nginx 配置未重新加载,或者浏览器缓存。先执行 sudo nginx -s reload,再强制清除浏览器缓存或用 curl 不带缓存参数 curl -H 'Cache-Control: no-cache' http://example.com。
问:如何快速回滚?
只要蓝色环境没有被关闭,直接修改 upstream 指向蓝色并 reload。所以建议在切换后保留蓝色环境至少 24 小时,确认新版本稳定后再回收。
问:没有两台服务器怎么办?
同一台机器上使用不同端口即可。注意端口不能被占用,且 Nginx 监听 80 端口,两个应用分别监听 8081 和 8082。
总结
蓝绿部署的核心是用空间换时间——多维护一套环境,换来秒级切换和零停机。
本文从零开始演示了 Nginx 反向代理下的完整流程,包括配置、切换、回滚和常见坑点。
如果你正在处理服务零停机更新的需求,建议先在测试环境演练几遍,再应用到生产。
遇到异常时,优先检查健康检查和 Nginx reload 是否生效,然后快速回滚到上一版本,保证线上稳定。