Django 配置 Celery 并部署

本文将讲解 Ubuntu 下 Celery 的部署。

概览
Celery 有多种配置方式,本文将采用 Redis 作为 Result Backend、RabbitMQ 作为消息分发服务器的方式来进行
所用到的关键版本信息
Python: 3.6
Celery:4.2
Ubuntu: 16.04
Django: 2.1

依赖层面 —— 安装相关依赖

Django 下使用 Celery 需要以下方面的依赖

Celery

Celery 的安装可以直接查阅 官方文档,由于本文直接采用了推荐配置,所以无需安装其他依赖,直接执行下面的命令即可

1
pip install -U Celery

Backend

按照 官方文档 所述,想要记录 Celery 的执行结果,还需要配置 Result Backend。官方提供了一个插件 django-celery-results 可以很轻松的使用 Django 的 DataBase 或者 Cache 提供这个 Backend。

执行下面的命令即可安装

1
pip install django_celery_results

RabbitMQ

官方文档中关于 Broker 的选择提供了三种 —— RabbitMQRedisAmazon SQS,本文选择使用了无需多余配置的 RabbitMQ

关于 RabbitMQ官方文档 也有很详细的 安装教程

安装

根据官方文档,Installing on Debian and Ubuntu 中所述,最佳方式 是通过配置 apt 包来进行。

/etc/apt/sources.list.d/ 目录下新建 bintray.rabbitmq.list 文件,内容为

1
2
# See below for supported distribution and component values
deb https://dl.bintray.com/rabbitmq/debian $distribution main

然后执行下面的命令安装即可

1
2
sudo apt-get update
sudo apt-get install rabbitmq-server

配置

配置主要是三项:用户、权限、虚拟主机

配置使用的是 rabbitmqctl,以下以一个用户名为 test 密码为 Test 的用户与一个名称为 testhost 的虚拟主机为例

1
2
3
4
5
6
# 新建用户
rabbitmqctl add_user test Test
# 新建虚拟主机
rabbitmqctl add_vhost testhost
# 设置权限
rabbitmqctl set_permissions -p testhost test ".*" ".*" ".*"

常用命令组链接

Django 代码层面 —— 配置 Celery

在 Django 的 settings.py 所在目录下新建 celery.py 文件,内容如下

假设此 Django 应用名称为 proj

proj/proj/celery.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'smu_reserve.settings')

app = Celery('proj')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

并在此目录下的 __init__.py 文件中导入Celery

proj/proj/init.py

1
2
3
4
5
6
7
8
from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

最后到 settings.py 文件中进行配置

proj/proj/settings.py

1
2
3
4
5
6
7
8
9
# 在 INSTALLED_APPS 中添加
INSTALLED_APPS = [
# ...
'django_celery_results',
]

# 在文件中添加下面的两行配置
CELERY_RESULT_BACKEND = 'django-cache'
CELERY_BROKER_URL = 'amqp://test:[email protected]:5672/testhost'

CELERY_RESULT_BACKEND 用于选择 Result Backend,如果已经配置了 Django 的 Cache 建议选择 django-cache,否则需要选择 django-db

CELERY_BROKER_URL 用于配置 Broker 的通信网址,这里按照刚才设置的 RabbitMQ 的账号密码主机进行网址构造:amqp://用户名:密码@127.0.0.1:5672/主机名

配置完成后,需要执行下面的命令来使 django_celery_results 的数据库配置生效

1
./manage.py migrate django_celery_results

最后,添加一个 Task 用于测试。

选择一个应用的目录(以 ap 为例),在下面创建 tasks.py 文件,输入以下内容

proj/ap/tasks.py

1
2
3
4
5
6
from __future__ import absolute_import
from celery import shared_task

@shared_task
def add(x, y):
return x + y

以后可以通过下面的命令来测试是否正常

1
./manage.py shell
1
2
3
from ap.tasks import add
res = add.delay(1, 1)
res.get()

服务器配置层面 —— 服务器持久化 Celery

官方文档 给了三种方式来进行持久化,本文选择 systemd 方式。

首先到官方 Github 下载 systemd 支持文件,将 celery.conf 重命名并放置为 /etc/conf.d/celery,将 celery.service 放置为 /etc/systemd/system/celery.service

EnvironmentFile 所对应地址修改为下载的 celery.conf 文件所放置地址(如果按照上面我写的放置了那么这里不用修改),将 WorkingDirectory 对应的目录修改为 Django 项目目录,将 UserGroup 修改为一个非 root 的用户和用户组。

修改配置文件 /etc/conf.d/celeryCELERY_APP 为 Django 项目名称;CELERY_BIN 为 celery 应用可执行文件地址,直接安装是 /usr/bin/celery,而通过 Virtualenv 安装则是相关环境目录下的 bin/celery 文件;CELERYD_PID_FILECELERYD_LOG_FILE 分别是进程文件和日志文件,需要注意的是这些文件所在目录需要存在并且可以被上面设定的用户所修改。

然后执行下面的命令即可开启 Celery

1
systemctl start celery

可以通过下面的命令检测是否开启成功

1
systemctl status celery