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

在AWS部署Celery咨询:解决Django长任务504超时问题

解决方案:AWS上Django+Celery的部署与守护进程管理

一、AWS上Celery与消息中间件的部署位置

1. 消息中间件(Redis/AWS SQS)

  • 选Redis的话,直接用AWS ElastiCache for Redis托管服务即可,无需自行搭建服务器。记得将Redis集群部署在与Django应用同VPC的区域,配置安全组允许Django和Celery访问,降低网络延迟。
  • 选AWS SQS更省心,完全托管无需维护服务器。只需给Django和Celery的运行实例配置IAM权限,允许它们读写队列即可,适合需要弹性扩容或不想维护Redis的场景。

2. Celery Worker的部署位置

分两种场景选择:

  • 低负载场景:可与Django应用部署在同一个Elastic Beanstalk(EB)的EC2实例上,节省资源。
  • 高负载/需要隔离的场景:单独创建EB环境专门运行Celery Worker,与Web环境分离,避免计算任务拖慢Web服务,还能单独给Worker环境配置自动扩容。
  • 若不用EB,也可单独开启EC2实例运行Worker,或用ECS/EKS容器化部署——但你的任务最长达10分钟,Lambda不太适配,无需考虑。

二、Elastic Beanstalk上用supervisord管理Celery守护进程

1. Celery服务运行位置

如果是同实例部署,就和Django在同一个EB EC2实例上运行;如果是独立Worker环境,就部署在Worker环境的EC2实例上,逻辑简单直接。

2. 用supervisord配置Celery的具体步骤

EB自带supervisord,无需自定义AMI,直接通过.ebextensions配置文件即可完成配置:

第一步:在Django项目根目录创建.ebextensions文件夹

第二步:创建配置文件.ebextensions/celery.config,内容如下:

files:
  "/etc/supervisord.d/celery.ini":
    mode: "000755"
    owner: root
    group: root
    content: |
      [program:celery]
      command=/opt/python/run/venv/bin/celery -A 你的Django项目名 worker --loglevel=info
      directory=/opt/python/current/app
      user=wsgi
      numprocs=1
      stdout_logfile=/var/log/celery-worker.log
      stderr_logfile=/var/log/celery-worker.log
      autostart=true
      autorestart=true
      startsecs=10
      stopwaitsecs=600 ; 你的任务最长10分钟,留足时间等待任务完成再终止Worker
      killasgroup=true
      priority=998

commands:
  01_restart_supervisord:
    command: "supervisorctl reread && supervisorctl update && supervisorctl restart celery"
    ignoreErrors: true

记得将你的Django项目名替换为实际项目名称(即celery -A后面的名称)。

第三步:配置细节说明

  • command:EB的虚拟环境固定路径为/opt/python/run/venv/bin/,项目代码存储在/opt/python/current/app,直接套用路径即可。
  • user=wsgi:使用EB默认的wsgi用户运行,避免权限问题。
  • stopwaitsecs=600:必须设置,否则EB重启实例时会直接终止Celery,导致长任务中断。
  • autostart和autorestart:确保实例启动或Worker崩溃时自动重启,无需手动干预。

第四步:部署到EB

将.ebextensions文件夹与项目代码一起打包部署,EB会自动创建supervisord配置、重启supervisord并启动Celery Worker。

3. 验证Celery运行状态

连接到EB的EC2实例,执行以下命令即可查看状态:

# 查看Celery进程状态
supervisorctl status celery

# 实时查看Celery日志
tail -f /var/log/celery-worker.log

三、额外注意事项

  • IAM权限:使用SQS时,给EB实例的IAM角色添加AmazonSQSFullAccess(或更细粒度的权限);使用ElastiCache Redis时,安全组需开放6379端口,允许EC2实例访问。
  • 任务结果存储:如果需要保存任务结果,可使用ElastiCache Redis或DynamoDB,在Celery配置中指定result_backend即可。
  • 弹性扩容:任务量较大时,给Worker环境开启Auto Scaling,根据队列长度自动增加实例,无需手动应对负载高峰。

内容的提问来源于stack exchange,提问作者Daniel Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:30:49