تنظیم و راه اندازی celery در محیط production

باسلام و درود، در این مطلب با روش نصب و کانفیگ celery روی سرور لینوکسی در محیط اسقرار یا همون production در خدمتتان هستم.

۱- پیش فرض ها برای نصب celery روی لینوکس (اوبونتو)

انتظار میره شما یه اپلیکیشن Djangoدارید که داخل اون از celeryهم استفاده کرده اید و کانفیگ های celeryاز جمله تنظیم Broker و غیره را انجام داده اید، و در این آموزش قصدمان فقط راه اندازی celery در محیط production هست (یا همون daemonize کردن celery)

در مستندات خود celery، سه روش برای Daemonize کردن celeryمعرفی شده است، این روش ها عبارت هستند از:

 init-scriptInit-script: celerybeat و using systemd. در این آموزش من روش systemd رو معرفی و آموزش داده ام 🙂

۲- ساخت userو Group برای celery

در ابتدا، اقدام به ساخت user و Group برای celeryمی کنیم به هر دو نیز نام celery را اختصاص می دهیم.

sudo groupadd celery
sudo useradd -g celery celery

۳- ساخت فایل های راه اندازی (کانفیگ) سلری

ابتدا فولدر های pid و log رو می سازیم، ابتدا دستور زیر را بزنید تا فایل برای ویرایش باز شود:

sudo nano /etc/tmpfiles.d/celery.conf

حال دو خط زیر را به آن اضافه می کنید:

d /var/run/celery 0755 celery celery -
d /var/log/celery 0755 celery celery -

حال باید ابتدا دو دایرکتوری فوق را بسازیم و سطح دسترسی کاربر celeryکه قبلتر ساخته بودیم را به این دو دایرکتوری درست کنیم:

sudo mkdir /var/log/celery
sudo chown -R celery:celery /var/log/celery
sudo chmod -R 755 /var/log/celery

sudo mkdir /var/run/celery
sudo chown -R celery:celery /var/run/celery
sudo chmod -R 755 /var/run/celery

حال نوبت به ساخت فایل کانفیگ celery رسیده است:

 sudo nano /etc/conf.d/celery

محتویات فایل به شرح زیر باید باشد (حواستان به سه متغیر CELERY_APP_NAMECELERYD_CHDIR, و CELERY_BIN باشد و آنها را با مقادیر درست جایگزین کنید):

# Name of nodes to start
# here we have a single node
CELERYD_NODES="w1"
# or we could have three nodes:
#CELERYD_NODES="w1 w2 w3"

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/home/sadegh-khan/proj/.env/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="proj"

# Where to chdir at start.
CELERYD_CHDIR="/home/sadegh-khan/proj/"


# How to call manage.py
CELERYD_MULTI="multi"

# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=8"

# - %n will be replaced with the first part of the nodename.
# - %I will be replaced with the current child process index
#   and is important when using the prefork pool to avoid race conditions.
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"


# you may wish to add these options for Celery Beat
CELERYBEAT_PID_FILE="/var/run/celery/beat.pid"
CELERYBEAT_LOG_FILE="/var/log/celery/beat.log"

۴ – ساخت فایل systemd برای celery

خب رسیدیم و مرحله ساخت فایل systemd برای راه اندازی celeryدر محیط production ، برای این منظور ابتدا دستور زیر را بزنید:

/etc/systemd/system/celery.service

محتویات فایل فوق به صورت زیر باید نوشته شود:

[Unit]
Description=Celery Service
After=network.target

[Service]
Type=forking
User=celery
Group=celery
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/home/sadegh-khan/proj
ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \
  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \
  --pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \
  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'

[Install]
WantedBy=multi-user.target

و همچنین ساخت celerybeat.service با دستور زیر :

/etc/systemd/system/celerybeat.service:

محتویات به شرح زیر باشد:

[Unit]
Description=Celery Beat Service
After=network.target

[Service]
Type=simple
User=celery
Group=celery
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/opt/celery
ExecStart=/bin/sh -c '${CELERY_BIN} -A ${CELERY_APP} beat  \
    --pidfile=${CELERYBEAT_PID_FILE} \
    --logfile=${CELERYBEAT_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'
Restart=always

[Install]
WantedBy=multi-user.target

حال نوبت به اجرای سرویس ساخته شده رسیده است:

sudo systemctl daemon-reload

sudo systemctl start celery
sudo systemctl start celerybeat

sudo systemctl enable celery
sudo systemctl enable celerybeat

و در انتها بررسی وضعیت سرویس ساخته و اجرا شده:

sudo systemctl status celery