AWS Elastic Beanstalk上Celery配置问题:无进程配置更新
在AWS Elastic Beanstalk上为Django 2配置Celery(同实例部署)
我来帮你搞定在AWS Elastic Beanstalk上给Django 2配置Celery的事儿,同实例部署的话,咱们一步步来,先从你现有的02_packages.config开始完善,再补全Celery的启动和项目配置。
1. 完善依赖安装配置(02_packages.config)
你现有的配置已经在处理pycurl和基础yum依赖,我帮你补全剩下的部分,确保Python 3环境下的编译工具、Redis(作为Celery的消息中间件)以及Celery本身都能安装到位:
files: "/usr/local/share/pycurl-7.43.0.tar.gz" : mode: "000644" owner: root group: root source: https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz packages: yum: python34-devel: [] libcurl-devel: [] gcc: [] # 编译pycurl必须的编译器 redis: [] # 用Redis当Celery的broker,性能比数据库好很多 commands: 01_download_pip3: command: "curl -O https://bootstrap.pypa.io/get-pip.py && python3 get-pip.py" test: "[ ! -f /usr/local/bin/pip3 ]" # 只有pip3不存在时才执行 02_install_pycurl: command: "cd /usr/local/share && tar xzf pycurl-7.43.0.tar.gz && cd pycurl-7.43.0 && python3 setup.py install --with-openssl" test: "[ ! -f /usr/local/lib/python3.4/site-packages/pycurl.so ]" 03_install_celery: command: "/usr/local/bin/pip3 install celery redis" # 直接安装Celery和Redis的Python依赖
2. 添加Celery启动脚本配置
接下来创建一个新的.ebextensions配置文件03_celery.config,用来配置Celery worker的启动和重启逻辑——毕竟EB部署或重启应用服务器时,得保证Celery也能跟着启动:
files: # 应用部署后启动Celery的脚本 "/opt/elasticbeanstalk/hooks/appdeploy/post/run_celery.sh": mode: "000755" owner: root group: root content: | #!/usr/bin/env bash # 获取EB的应用部署目录和虚拟环境路径 EB_APP_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir) EB_VIRTUAL_ENV=$(/opt/elasticbeanstalk/bin/get-config container -k virtual_env_dir) # 激活虚拟环境,确保用的是项目的Python环境 source $EB_VIRTUAL_ENV/bin/activate # 先杀掉现有的Celery进程,避免重复启动 pkill -f "celery worker" || true # 启动Celery worker,记得把your_django_project_name换成你实际的项目名(就是settings.py所在的文件夹名) cd $EB_APP_DEPLOY_DIR nohup celery -A your_django_project_name worker --loglevel=info > /var/log/celery-worker.log 2>&1 & # 应用服务器重启后启动Celery的脚本 "/opt/elasticbeanstalk/hooks/restartappserver/post/run_celery.sh": mode: "000755" owner: root group: root content: | #!/usr/bin/env bash EB_APP_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir) EB_VIRTUAL_ENV=$(/opt/elasticbeanstalk/bin/get-config container -k virtual_env_dir) source $EB_VIRTUAL_ENV/bin/activate pkill -f "celery worker" || true cd $EB_APP_DEPLOY_DIR nohup celery -A your_django_project_name worker --loglevel=info > /var/log/celery-worker.log 2>&1 &
3. 配置Django项目中的Celery参数
现在要在你的Django项目里配置Celery的相关设置,先打开settings.py,添加这些内容:
# Celery配置 CELERY_BROKER_URL = 'redis://localhost:6379/0' # 用本地的Redis作为消息中间件 CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # 结果也存在Redis里 CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TIMEZONE = 'UTC' # 可以换成你的时区,比如Asia/Shanghai
然后在项目根目录(和settings.py同一级)创建celery.py文件,内容如下:
import os from celery import Celery # 设置默认的Django配置模块 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_django_project_name.settings') app = Celery('your_django_project_name') # 从Django的settings里读取Celery配置,前缀用CELERY_ app.config_from_object('django.conf:settings', namespace='CELERY') # 自动发现所有Django app里的tasks.py文件 app.autodiscover_tasks()
最后,在项目的__init__.py里加一行,让Django启动时能加载Celery:
from .celery import app as celery_app __all__ = ('celery_app',)
4. 部署后验证
把这些.ebextensions下的配置文件和项目代码一起打包,重新部署到Elastic Beanstalk。部署完成后,你可以登录到EB实例验证Celery是否正常运行:
# 查看Celery的日志,看有没有报错 tail -f /var/log/celery-worker.log # 检查Celery进程是否在运行 ps aux | grep celery
几个注意点:
- 所有配置里的
your_django_project_name一定要换成你实际的Django项目名称,别直接用示例里的! - 如果不想用Redis,也可以用Django的数据库当broker,但生产环境不推荐,性能差不少
- 可以根据实例的CPU核心数调整Celery worker的并发数,比如在启动命令里加
--concurrency=4(4核实例就设4,按需调整)
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

