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

为什么需要蓝绿部署

线上服务更新最怕停机。
传统做法是先停服、再更新、再重启,用户会看到“服务不可用”的错误。
蓝绿部署的思路是同时维护两套完全一样的环境——蓝色环境(当前运行版本)和绿色环境(新版本),通过负载均衡器(例如 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
系统公告

高考专属福利来袭|凭准考证免费领香港 CN2 云服务器

值高考落幕之际,泽御云开启考生专属回馈 + 产品限时特惠双重活动,助力学子暑期学习建站 高考 考生专属福利 全体应届高考生,凭高考准考证即可免费申领【香港 CN2 轻量云服务器,4 核 4G AMD 处理器】,免费使用周期 30 天,可用于搭建个人站点、编程实操、技术实训,祝各位考生金榜题名,前程似锦! 泽御云资质齐全合规自营机房,线路覆盖香港 CN2、国内 BGP、内蒙电信、美国精品线路,售后全天候技术支持。 官方网站:www.zeyuyun.com,活动限时有效,优惠逾期不再保留。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意