蓝绿部署完整新手指南(Nginx 与实时告警)

发布: (2025年12月9日 GMT+8 22:49)
8 min read
原文: Dev.to

Source: Dev.to

介绍

欢迎阅读本 蓝绿部署(Blue‑Green Deployment)完整指南——这是一种被 Netflix、Amazon、Facebook 等公司广泛使用的强大部署策略,能够实现 零停机部署。本项目演示了如何使用自动故障切换和实时 Slack 报警,构建一个可投入生产的蓝绿部署系统。

代码仓库: HNG DevOps on GitHub

你将学到的内容

  • 什么是蓝绿部署以及它为何重要
  • 如何使用 Nginx 实现自动故障切换
  • 如何构建实时监控与报警系统
  • 如何实现零停机部署
  • 如何将 Slack 通知集成到 DevOps 报警中

前置条件

  • 对 Docker 有基本了解
  • 熟悉命令行操作
  • 具备基本的 Web 服务器知识(有帮助但非必需)

什么是蓝绿部署?

问题:传统部署方式

当你部署网站的新版本时,通常会执行以下步骤:

  1. 停止旧版本
  2. 部署新版本
  3. 启动新版本

在这些步骤期间,站点会 宕机,用户会看到错误,可能导致收入损失。

解决方案:蓝绿部署

维护 两个相同的环境

  • BLUE(生产) – 当前为用户提供服务
  • GREEN(预备) – 新版本待上线

部署工作流:

  1. 将新版本部署到 GREEN
  2. 对 GREEN 进行彻底测试
  3. 瞬间 将流量从 BLUE 切换到 GREEN
  4. 若出现问题,瞬间 切回 BLUE

结果: 零停机

现实类比

把演唱会想象成有两个舞台:

  • 舞台 1(蓝):乐队正在演出,观众在观看
  • 舞台 2(绿):下一支乐队正在搭建并进行音响检查

当需要切换时,将舞台旋转 180°。观众看到的就是舞台 2(绿)。如果新乐队出现问题,立即旋转回舞台 1。

项目概览

本项目实现了一个 可投入生产的蓝绿部署系统,具备以下核心功能。

核心功能

自动故障切换

  • Nginx 检测到 Blue 实例故障时
  • 自动将所有流量路由到 Green
  • 用户请求零失败

实时报警

  • Python 监控程序监听 Nginx 日志
  • 立即检测故障切换事件
  • 向 Slack 发送报警
  • 监控错误率

零停机部署

  • 将新版本部署到非活动实例
  • 瞬间切换流量
  • 如有需要,几秒内回滚

结构化日志

  • 每个请求都记录元数据(池、发布版本、响应时间)

理解核心概念

1. 蓝绿部署 vs. 负载均衡

负载均衡 将流量分配到多个实例:

请求 1 → 蓝
请求 2 → 绿
请求 3 → 蓝
请求 4 → 绿

蓝绿部署(本项目) 将所有流量指向单一主实例,另一个实例作为热备份:

所有请求 → 蓝(主)
               绿(备份,待机)

如果蓝宕机:
所有请求 → 绿(备份成为活跃)

2. Nginx Upstream 配置

Nginx 将流量路由到多个后端服务器(upstream)。本项目使用:

upstream app {
    server app_blue:3000 max_fails=1 fail_timeout=5s;
    server app_green:3000 backup max_fails=1 fail_timeout=5s;
}

关键指令

  • server app_blue:3000 – 主服务器
  • backup – 仅在主服务器故障时使用
  • max_fails=1 – 发生一次错误即标记为失败
  • fail_timeout=5s – 5 秒后重新尝试

3. 故障切换机制

当请求失败时:

  1. Nginx 先尝试 Blue 实例
  2. 若 Blue 返回 5xx 错误或超时,Nginx 将其标记为失败
  3. Nginx 再次尝试请求的 Green(备份)实例
  4. 用户收到来自 Green 的成功响应
  5. 随后的请求全部转向 Green

结果: 用户永远不会看到错误页面。

架构概览

系统架构图

                Internet
                   |
                   v
            +--------------+
            |    Nginx     |
            |  (Port 8080) |
            +--------------+
                   |
    +--------------+--------------+
    |                             |
    v                             v
+----------+                +----------+
| App Blue | (Primary)      |App Green | (Backup)
|Port 3000 |                |Port 3000 |
+----------+                +----------+
    |                             |
    +-------------+---------------+
                  |
                  v
          +--------------+
          | Nginx Logs   |
          +--------------+
                  |
                  v
        +------------------+
        | Alert Watcher    |
        | (Python)         |
        +------------------+
                  |
                  v
          +--------------+
          |    Slack     |
          +--------------+

组件拆解

1. Nginx 代理

  • 角色: 流量路由与负载均衡器
  • 职责: 路由所有进入请求,检测后端故障,执行自动故障切换,记录带元数据的结构化日志

2. App Blue(主实例)

  • 环境变量
    APP_POOL=blue
    RELEASE_ID=blue-release-1.0.0
    PORT=3000

3. App Green(备份实例)

  • 环境变量
    APP_POOL=green
    RELEASE_ID=green-release-1.0.0
    PORT=3000

4. Alert Watcher(Python)

  • 角色: 实时日志监控与报警
  • 职责: 监听 Nginx 访问日志,解析结构化日志条目,检测故障切换事件,监控错误率,向 Slack 发送报警

技术栈

组件技术用途
反向代理Nginx (Alpine)流量路由与故障切换
应用Python/Flask演示 Web 应用
监控Python 3.11日志监控与报警
报警Slack Webhooks实时通知
容器化Docker打包所有服务
编排Docker Compose管理多容器部署

项目搭建步骤

步骤 1:克隆仓库

git clone https://github.com/cypher682/hng13-stage-3-devops.git
cd hng13-stage-3-devops

步骤 2:了解项目结构

hng13-stage-3-devops/
├── docker-compose.yml       # 容器编排
├── nginx.conf.template      # Nginx 配置模板
├── entrypoint.sh            # Nginx 启动脚本
├── watcher.py               # Python 日志监控脚本
├── requirements.txt         # Python 依赖
├── .env.example             # 环境变量示例
├── test-failover.sh         # 故障切换测试脚本
└── public/                  # 静态 HTML 文件

步骤 3:配置环境变量

复制示例文件并进行编辑:

cp .env.example .env
# 应用配置
PORT=3000
ACTIVE_POOL=blue

# Docker 镜像
BLUE_IMAGE=yimikaade/wonderful:latest
GREEN_IMAGE=yimikaade/wonderful:latest

# 发布标识
RELEASE_ID_BLUE=blue-release-1.0.0
RELEASE_ID_GREEN=green-release-1.0.0

# Slack 集成
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...

步骤 4:启动服务

docker compose up -d

步骤 5:测试故障切换

运行提供的脚本模拟故障,并观察自动故障切换及 Slack 报警:

./test-failover.sh

现在,你已经拥有一个功能完整的蓝绿部署环境,具备自动故障切换、结构化日志以及实时 Slack 报警。祝部署愉快!

Back to Blog

相关文章

阅读更多 »

什么是 DevOps?

引言 如果在网上搜索“什么是 DevOps?”,你会找到许多复杂的定义。在本文中,我们将从基础解释 DevOps。DevOps = De...

Jenkins 在 AWS + Docker

Jenkins 在 AWS + Docker 的封面图片 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-upload...