redis - 如何在 DigitalOcean 应用平台上部署 Celery Worker

标签 redis django-celery digital-ocean-apps

我正在尝试将 celery + redis 添加到 DO 应用程序平台上托管的 django 应用程序中。我知道我需要解决一个问题,记录如下: https://www.digitalocean.com/community/questions/is-there-an-issue-with-celery-on-app-platform

我的问题是我什至无法达到这一点。 Django celery 和 celerybeat 在本地工作正常,即我可以安排和运行后台任务。 我使用以下命令启动 celery worker :

celery -A my_project.celery worker -l info

celery 击败 worker 使用:

celery -A my_project beat -l info

我不知道如何在 DO App 平台上执行此操作。

一些教程只是简单地说您需要在 DO 中创建一个工作线程。这到底是什么意思?我不需要以某种方式运行这些命令吗?我是否需要另一个虚拟环境,或者工作人员是否会使用我的 django 应用程序中的相同虚拟环境(就像在本地运行时一样)。当我尝试在 DO 上创建工作人员时,它希望我创建另一个应用程序。

有人能给我举一个例子来说明这一切是如何运作的吗?

非常感谢

最佳答案

由于很多原因,你不能直接在 digital ocean 服务器上执行此操作,你需要使用主管来启动、监控和重新启动 celery 服务。 我假设您使用 redis 作为消息代理,因此您可以 ssh 进入您的服务器并通过运行下面的命令启动

sudo apt update
sudo apt install redis-server
redis-cli ping

输入最后一个命令后,控制台应输出 PONG 这是为了确保 redis 启动并运行。

下一阶段 现在你需要安装一个主管来监视、启动、停止或重新启动服务器上你想要的任何服务,在这种情况下,我们关心的服务是 celery_worker 和 celery_beat。 因此运行下面的命令来安装supervisor

sudo apt-get install supervisor

安装完成后运行以下命令

sudo service supervisor status

你应该得到这样的输出

supervisor.service - Supervisor process control system for UNIX
Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-05-19 15:27:28 UTC; 1min 16s ago
     Docs: http://supervisord.org
 Main PID: 592 (supervisord)
   CGroup: /system.slice/supervisor.service
           └─592 /usr/bin/python /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf

May 19 15:27:28 djangobin-ubuntu systemd[1]: Started Supervisor process control system for UNIX.
May 19 15:27:28 djangobin-ubuntu supervisord[592]: 2018-05-19 15:27:28,830 CRIT Supervisor running a
May 19 15:27:28 djangobin-ubuntu supervisord[592]: 2018-05-19 15:27:28,831 WARN No file matches via 
May 19 15:27:28 djangobin-ubuntu supervisord[592]: 2018-05-19 15:27:28,847 INFO RPC interface 'super
May 19 15:27:28 djangobin-ubuntu supervisord[592]: 2018-05-19 15:27:28,847 CRIT Server 'unix_http_se
May 19 15:27:28 djangobin-ubuntu supervisord[592]: 2018-05-19 15:27:28,848 INFO supervisord started

现在确保您位于根目录中(您可以通过运行ls进行检查,并且您应该看到类似这样的目录bin boot dev etc home lib lib32 lib64 libx32 Lost+found media mnt opt proc root 运行 sbin snap srv sys tmp usr)。 在根目录中,您将使用以下命令创建配置文件

echo_supervisord_conf > ./djangobin.conf

使用下面的命令将新文件移动到supervisor目录

sudo mv djangobin.conf /etc/supervisor/conf.d/

使用以下命令打开文件

nano /etc/supervisor/conf.d/djangobin.conf

此文件包含大量内容和部分,但我们不需要全部内容来完成我们想要做的事情,因此您必须删除除部分名称 [supervisord] 之外的所有内容。 删除不相关的部分后,文件现在应该如下所示

[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)

接下来我们将添加我们希望主管监控的程序 所以你可以复制并粘贴下面的内容

[program:celery_worker]
command=/home/your_user/venv/bin/celery -A project worker -l info
directory=/home/your_user/django_project
autostart=true
autorestart=true
stderr_logfile=/var/log/celery.err.log
stdout_logfile=/var/log/celery.out.log


[program:celery_beat]
command=/home/your_user/venv/bin/celery -A project beat -l info
directory=/home/your_user/django_project
autostart=true
autorestart=true
stderr_logfile=/var/log/celery_beat.err.log
stdout_logfile=/var/log/celery_beat.out.log
  • 这里的“your_user”是指您在ubuntu服务器上创建的用户,该用户有权访问您的django项目
  • 这里的“project”是指直接包含settings.py和wsgi.py文件的应用文件夹
  • 此处的“django_project”指的是包含所有源代码的项目文件夹
  • “venv”是您创建的 virtualenv 的名称

现在保存并关闭该文件 然后运行下面的命令

sudo supervisorctl reread

你应该得到这样的输出

celery_beat: available
celery_worker: available

然后运行

 sudo supervisorctl update

你应该得到这样的输出

celery_beat: added process group
celery_worker: added process group

任何时候你对 djangobin.conf 文件进行更改时,都运行上述两个命令

现在使用以下命令检查 celery 是否正在运行

sudo supervisorctl status

你应该得到这样的输出

celery_beat                      RUNNING   pid 6027, uptime 1:44:03
celery_worker                    RUNNING   pid 6028, uptime 1:44:03

您可以使用以下命令将 celery_worker 日志输出到控制台,就像在开发服务器上一样

tail celery_worker stderr

现在,只要您启动、停止或重新启动服务器,主管将始终确保您的所有 celery 服务均已启动并运行

结束

我用下面的文章作为引用,你也可以引用https://www.codementor.io/@overiq/deploying-django-project-to-digitalocean-xt5s538tp

关于redis - 如何在 DigitalOcean 应用平台上部署 Celery Worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70578693/

相关文章:

postgresql 对外部表 pg_redis_fdw 的权限被拒绝

laravel-5 - 将驱动程序从同步升级到 Redis 后,Laravel 5.1 邮件队列无法正常工作

node.js - 套接字通信

python - celery 任务装饰器抛出 "TypeError: ' 模块对象不可调用”

c# - 无法加载/usr/bin/dotnet : exec format error

python - 如何在DigitalOcean App平台中禁用CORS策略并允许从任何地址访问?

ruby-on-rails - 从 PhantomJS 读取挂起的工作

python - Celery 为每个失败的任务发送邮件

python - django + celery 离线时的处理

php - 如何在 digitalocean 应用程序上正确部署 laravel nova