You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化Django+Docker+AWS ECS后端的维护模式实现?

针对Django+ECS Fargate架构的维护模式优化方案

你的核心痛点是:现有基于ECS任务环境变量的维护模式切换需要重新部署任务,操作繁琐;数据库/S3方案有性能和成本损耗;ALB直接返回503缺少CORS头导致前端无法正常显示维护页。以下是几个贴合你架构的可行方案:

方案1:Nginx层面动态控制(推荐)

利用Nginx容器做请求拦截,无需修改Django代码或重新部署ECS任务,同时能自定义503页面和CORS头:

  1. 配置SSM参数存储:在AWS SSM Parameter Store创建字符串参数(如/your-app/maintenance_mode),值设为1(维护中)或0(正常)。给ECS任务的IAM角色添加读取该参数的权限。
  2. Nginx容器添加参数同步脚本:在Nginx容器内用定时任务(如cron)定期拉取SSM参数到本地文件(如/var/run/maintenance_flag),示例脚本:
    #!/bin/bash
    aws ssm get-parameter --name "/your-app/maintenance_mode" --query "Parameter.Value" --output text > /var/run/maintenance_flag
    
  3. 修改Nginx配置:根据本地文件判断是否返回503,并配置CORS头:
    server {
        # 原有代理配置...
    
        # 判断维护状态
        set $maintenance 0;
        if (-f /var/run/maintenance_flag) {
            set $maintenance `cat /var/run/maintenance_flag`;
        }
    
        if ($maintenance = 1) {
            return 503;
        }
    
        # 自定义503页面与CORS头
        error_page 503 /maintenance.html;
        location = /maintenance.html {
            root /usr/share/nginx/html;
            add_header Access-Control-Allow-Origin "https://your-angular-frontend.com"; # 替换为你的前端域名
            add_header Access-Control-Allow-Methods "GET,POST,OPTIONS";
            add_header Access-Control-Allow-Headers "Content-Type";
        }
    
        # 处理OPTIONS预检请求
        if ($request_method = OPTIONS) {
            add_header Access-Control-Allow-Origin "https://your-angular-frontend.com";
            add_header Access-Control-Allow-Methods "GET,POST,OPTIONS";
            add_header Access-Control-Allow-Headers "Content-Type";
            return 204;
        }
    }
    
  4. 切换维护模式:直接在AWS控制台或用CLI更新SSM参数值,Nginx会在下次同步后生效(可调整同步频率,比如10秒一次)。

方案2:Django中间件+SSM缓存优化

保留Django中间件的逻辑,但用SSM参数替代环境变量,加上本地缓存避免频繁调用SSM API:

修改中间件代码:

import os
import time
import boto3
from django.http import HttpResponse

class MaintenanceMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        self.ssm_client = boto3.client('ssm')
        self.cache_duration = 60  # 缓存1分钟,可按需调整
        self.last_fetch_time = 0
        self.maintenance_active = 0

    def __call__(self, request):
        current_time = time.time()
        # 超过缓存时间才重新拉取参数
        if current_time - self.last_fetch_time > self.cache_duration:
            try:
                param = self.ssm_client.get_parameter(Name='/your-app/maintenance_mode')
                self.maintenance_active = int(param['Parameter']['Value'])
                self.last_fetch_time = current_time
            except Exception:
                self.maintenance_active = 0

        if self.maintenance_active:
            response = HttpResponse(status=503)
            # 配置CORS头
            response['Access-Control-Allow-Origin'] = "https://your-angular-frontend.com"
            response['Access-Control-Allow-Methods'] = "GET,POST,OPTIONS"
            response['Access-Control-Allow-Headers'] = "Content-Type"
            return response
        return self.get_response(request)
  • 给ECS任务IAM角色添加SSM参数读取权限,切换维护模式时仅需更新SSM参数,最多1分钟后所有容器生效。

方案3:ALB+Lambda自定义503响应

解决ALB直接返回503缺少CORS头的问题,用Lambda生成带CORS的响应:

  1. 创建Lambda函数:返回带CORS头的503页面:
    def lambda_handler(event, context):
        return {
            'statusCode': 503,
            'headers': {
                'Access-Control-Allow-Origin': "https://your-angular-frontend.com",
                'Access-Control-Allow-Methods': "GET,POST,OPTIONS",
                'Access-Control-Allow-Headers': "Content-Type",
                'Content-Type': "text/html"
            },
            'body': "<html><body><h2>系统维护中,预计XX时间恢复,请稍后再试</h2></body></html>"
        }
    
  2. 配置ALB规则:添加一条优先级最高的规则,当需要维护时,将所有请求转发到该Lambda函数;恢复时禁用该规则即可。

方案对比

方案实现难度切换效率性能影响额外成本
Nginx+SSM中等快(同步频率决定延迟)极小可忽略(SSM调用成本极低)
Django中间件+SSM缓存低较快(缓存时长决定延迟)极小可忽略
ALB+Lambda中等即时无可忽略

内容的提问来源于stack exchange,提问作者0urz4g

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:34:57