gpt4 book ai didi

django - 您如何使用 AWS Elastic Beanstalk 运行工作程序?

转载 作者:行者123 更新时间:2023-11-28 19:35:04 25 4
gpt4 key购买 nike

我正在 AWS Elastic Beanstalk 上启动 Django 应用程序。我想运行后台任务或 worker 以运行 celery。

我找不到是否可能。如果是,如何实现?

这是我现在正在做的,但这每次都会产生事件类型错误。

container_commands:
01_syncdb:
command: "django-admin.py syncdb --noinput"
leader_only: true
50_sqs_email:
command: "./manage.py celery worker --loglevel=info"
leader_only: true

最佳答案

正如@chris-wheadon 在他的评论中建议的那样,您应该尝试在后台将 celery 作为守护进程运行。 AWS Elastic Beanstalk 使用 supervisord已经运行一些守护进程。因此,您可以利用它来运行 celeryd 并避免为此创建自定义 AMI。它对我来说效果很好。

我所做的是在 EB 将应用程序部署到该实例后,以编程方式将一个 celeryd 配置文件添加到该实例。棘手的部分是该文件需要为守护进程设置所需的环境变量(例如,如果您在应用程序中使用 S3 或其他服务,则需要设置 AWS 访问 key )。

下面是我使用的脚本副本,将此脚本添加到配置 EB 环境的 .ebextensions 文件夹中。

安装脚本在所有 EB 实例上的 /opt/elasticbeanstalk/hooks/appdeploy/post/ 文件夹 ( documentation ) 中创建一个文件。那里的任何 shell 脚本都将在部署后执行。放置在那里的 shell 脚本的工作方式如下:

  1. celeryenv变量中,virutalenv环境存放在遵循监督符号的格式。这是一个逗号环境变量的分隔列表。
  2. 然后脚本创建一个变量celeryconf,其中包含作为字符串的配置文件,其中包括先前解析的环境变量。
  3. 然后这个变量被传送到一个名为 celeryd.conf 的文件中,一个 celery 守护进程的 supervisord 配置文件。
  4. 最后,将新创建的配置文件的路径添加到主 supervisord.conf 文件,如果它还不存在的话。

这是脚本的副本:

files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash

# Get django environment variables
celeryenv=`cat /opt/python/current/env | tr '\n' ',' | sed 's/export //g' | sed 's/$PATH/%(ENV_PATH)s/g' | sed 's/$PYTHONPATH//g' | sed 's/$LD_LIBRARY_PATH//g'`
celeryenv=${celeryenv%?}

# Create celery configuraiton script
celeryconf="[program:celeryd]
; Set full path to celery program if using virtualenv
command=/opt/python/run/venv/bin/celery worker -A myappname --loglevel=INFO

directory=/opt/python/current/app
user=nobody
numprocs=1
stdout_logfile=/var/log/celery-worker.log
stderr_logfile=/var/log/celery-worker.log
autostart=true
autorestart=true
startsecs=10

; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 600

; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true

; if rabbitmq is supervised, set its priority higher
; so it starts first
priority=998

environment=$celeryenv"

# Create the celery supervisord conf script
echo "$celeryconf" | tee /opt/python/etc/celery.conf

# Add configuration script to supervisord conf (if not there already)
if ! grep -Fxq "[include]" /opt/python/etc/supervisord.conf
then
echo "[include]" | tee -a /opt/python/etc/supervisord.conf
echo "files: celery.conf" | tee -a /opt/python/etc/supervisord.conf
fi

# Reread the supervisord config
supervisorctl -c /opt/python/etc/supervisord.conf reread

# Update supervisord in cache without restarting all services
supervisorctl -c /opt/python/etc/supervisord.conf update

# Start/Restart celeryd through supervisord
supervisorctl -c /opt/python/etc/supervisord.conf restart celeryd

关于django - 您如何使用 AWS Elastic Beanstalk 运行工作程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14761468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com