蓝绿部署实现服务零停机更新,新手也能操作

为什么需要蓝绿部署

线上服务更新最怕停机。
传统做法是先停服、再更新、再重启,用户会看到“服务不可用”的错误。
蓝绿部署的思路是同时维护两套完全一样的环境——蓝色环境(当前运行版本)和绿色环境(新版本),通过负载均衡器(例如 Nginx)瞬间切换流量,实现零停机更新。

准备工作

  1. 两台服务器(或同一台服务器的两个端口):蓝色环境运行当前版本,绿色环境准备部署新版本。如果没有两台服务器,在同一台机器上用不同端口(例如 :8081 和 :8082)模拟即可。
  2. Nginx 反向代理:安装 Nginx,用于接收外部请求并转发到蓝色或绿色环境。
  3. 应用代码:确保蓝色环境当前版本正常,绿色环境打包好新版代码(例如 WAR/JAR 或静态文件)。
  4. 健康检查端点:在应用里实现一个简单的 /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.comcurl 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 是否生效,然后快速回滚到上一版本,保证线上稳定。

分享到:
上一篇
网站灰度发布平滑更新版本:零基础Nginx分流实操教程
下一篇
服务器异地多活容灾架构搭建:零基础完整教程
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意