在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
相关产品推荐
相关产品推荐

