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

在AWS Elastic Beanstalk部署django-rq与rqscheduler的技术求助

我之前帮好几个开发者解决过AWS Elastic Beanstalk上部署Django-RQ和RQScheduler的问题,结合你的需求,给你整理一套完整的实操方案,应该能顺利搞定:

第一步:创建并配置ElastiCache Redis实例

Django-RQ和RQScheduler依赖Redis作为消息队列存储,所以首先得在AWS上搭好Redis服务:

  • 登录AWS控制台,进入ElastiCache服务,选择Redis引擎
  • 创建新的Redis集群:
    • 先选集群模式禁用(小规模场景单实例足够,后续可按需扩容)
    • 节点类型选t2.micro(测试环境用,生产可根据负载调整)
    • 关键配置:修改安全组,确保ElastiCache的安全组允许你的EB环境EC2实例访问(开放6379端口给EB的EC2安全组)
    • 记下Redis的主端点(格式类似my-redis.abc123.0001.usw2.cache.amazonaws.com:6379)
第二步:配置Django项目的Redis连接

在Django的settings.py里添加django-rq的配置,把Redis地址指向ElastiCache的端点:

# settings.py
import os

# Django-RQ 队列配置
RQ_QUEUES = {
    'default': {
        'HOST': os.environ.get('REDIS_HOST', 'localhost'),
        'PORT': os.environ.get('REDIS_PORT', 6379),
        'DB': 0,
        'PASSWORD': os.environ.get('REDIS_PASSWORD', ''),
        'DEFAULT_TIMEOUT': 360,
    }
}

# RQScheduler 定时任务配置
RQ_SCHEDULER_INTERVAL = 60  # 每隔60秒检查一次待执行的定时任务

然后通过EB的环境变量注入Redis信息:

  • 进入EB控制台,找到你的应用环境 → 配置 → 软件 → 环境属性
  • 添加以下变量:
    • REDIS_HOST:ElastiCache主端点的地址部分(不带端口)
    • REDIS_PORT:固定填6379
    • 如果你的Redis设置了密码,额外添加REDIS_PASSWORD
第三步:在EB中配置Worker和Scheduler进程

EB默认只启动Django的Web进程,我们需要手动添加rqworker和rqscheduler的启动配置,推荐用Procfile的方式:

在Django项目根目录创建Procfile文件,内容如下(替换your_project_name为你的Django项目名称,也就是wsgi.py所在的文件夹名):

web: gunicorn your_project_name.wsgi:application --bind 0.0.0.0:$PORT
worker: python manage.py rqworker default
scheduler: python manage.py rqscheduler

如果Procfile不生效,也可以用.ebextensions配置文件兜底:
创建.ebextensions/workers.config,内容:

container_commands:
  01_add_worker_process:
    command: |
      echo "worker: python manage.py rqworker default" >> Procfile
  02_add_scheduler_process:
    command: |
      echo "scheduler: python manage.py rqscheduler" >> Procfile
第四步:验证部署结果

部署完成后,通过EB日志确认进程状态:

  • 进入EB控制台 → 环境 → 日志 → 请求日志 → 下载完整日志
  • 搜索rqworker和rqscheduler,如果看到类似以下日志,说明启动成功:
    worker.1 | Listening on default...
    scheduler.1 | Scheduler started with PID 1234
    

也可以写个测试任务验证:

# tasks.py
from django_rq import job

@job
def test_background_task():
    print("后台任务执行成功!")

在视图中触发任务:

from django.http import HttpResponse
from .tasks import test_background_task

def trigger_task(request):
    test_background_task.delay()
    return HttpResponse("任务已触发!")

访问该视图后,查看Worker日志,若能看到任务执行的输出,说明整个链路正常。

常见问题排查
  • Worker连不上Redis:检查ElastiCache安全组是否开放6379端口给EB的EC2实例,Redis端点和环境变量是否配置正确
  • 定时任务不执行:确认RQ_SCHEDULER_INTERVAL设置合理,Scheduler进程正常启动,定时任务是否通过django_rq.get_scheduler().schedule()正确添加
  • EB进程启动失败:检查Procfile中的命令路径是否正确(比如gunicorn的位置、manage.py的路径)

内容的提问来源于stack exchange,提问作者Saumya gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:43:56