Django结合Celery实现守护进程配置问题求助
解决Celery守护进程配置与定时任务的问题
首先必须给你点个赞——你已经搞定了Celery和Django的核心配置(celery.py和__init__.py),这部分完全没问题!接下来咱们一步步把守护进程和定时任务的配置捋清楚,帮你解决卡点:
一、先纠正几个小误区 & 理清文件位置
你提到的几个文件有个小笔误和位置注意点:
- 不存在
/etc/defaults/celery,正确的是/etc/default/celery(少个s),这是Celery Worker的全局配置文件 /etc/init.d/celeryd是Worker的系统启动脚本,放在系统初始化目录/etc/default/celerybeat是Celery Beat(定时任务调度器)的全局配置文件- 你的
celery.py和__init__.py放在项目根目录(和manage.py同目录)是对的,不用改
二、配置/etc/default/celery(Worker全局核心配置)
这个文件用来存Worker的环境变量和基础设置,DJANGO_SETTINGS_MODULE就放在这里,内容如下(替换成你的实际路径):
# 加载Django配置模块(和你celery.py里的设置完全一致) export DJANGO_SETTINGS_MODULE="project.settings" # Celery二进制文件的绝对路径(如果用虚拟环境,必须写虚拟环境里的celery路径,比如/var/www/your_proj/venv/bin/celery) CELERY_BIN="/path/to/your/virtualenv/bin/celery" # 你的Celery应用名称(和celery.py里的app = Celery('project')保持一致) CELERY_APP="project" # 项目根目录的绝对路径(就是manage.py所在的文件夹,比如/var/www/your_project) CELERYD_CHDIR="/absolute/path/to/your/project/root" # Worker节点数量,根据服务器CPU核心数调整,比如2或4 CELERYD_NODES="worker1" # Worker的额外参数:并发数、超时时间等,按需调整 CELERYD_OPTS="--concurrency=4 --time-limit=300" # 日志和PID文件路径,要确保celery用户有读写权限 CELERYD_LOG_FILE="/var/log/celery/%n.log" CELERYD_PID_FILE="/var/run/celery/%n.pid" # 运行Celery的用户和组(先确保系统存在celery用户:sudo adduser --system --group celery) CELERYD_USER="celery" CELERYD_GROUP="celery" # 自动创建日志和PID目录(避免手动创建的麻烦) CELERY_CREATE_DIRS=1
三、配置/etc/init.d/celeryd(Worker系统启动脚本)
这个脚本用来启动、停止、重启Celery Worker,直接用下面的模板适配你的配置即可:
#!/bin/sh ### BEGIN INIT INFO # Provides: celeryd # Required-Start: $network $local_fs $remote_fs # Required-Stop: $network $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: celery task worker daemon ### END INIT INFO # 加载全局配置文件 DEFAULT_FILE="/etc/default/celery" test -f $DEFAULT_FILE && . $DEFAULT_FILE # 定义核心变量 CELERY_BIN="${CELERY_BIN:-celery}" CELERYD_NODES="${CELERYD_NODES:-worker1}" CELERYD_CHDIR="${CELERYD_CHDIR:-/var/www/your_project}" CELERYD_OPTS="${CELERYD_OPTS:---concurrency=4}" CELERYD_LOG_FILE="${CELERYD_LOG_FILE:-/var/log/celery/%n.log}" CELERYD_PID_FILE="${CELERYD_PID_FILE:-/var/run/celery/%n.pid}" CELERYD_USER="${CELERYD_USER:-celery}" CELERYD_GROUP="${CELERYD_GROUP:-celery}" CELERY_CREATE_DIRS="${CELERY_CREATE_DIRS:-0}" # 启动Worker start() { echo "Starting celeryd..." if [ $CELERY_CREATE_DIRS -eq 1 ]; then mkdir -p $(dirname $CELERYD_LOG_FILE) $(dirname $CELERYD_PID_FILE) chown $CELERYD_USER:$CELERYD_GROUP $(dirname $CELERYD_LOG_FILE) $(dirname $CELERYD_PID_FILE) fi $CELERY_BIN multi start $CELERYD_NODES \ -A $CELERY_APP \ --pidfile=$CELERYD_PID_FILE \ --logfile=$CELERYD_LOG_FILE \ --chdir=$CELERYD_CHDIR \ $CELERYD_OPTS \ --uid=$CELERYD_USER --gid=$CELERYD_GROUP } # 停止Worker stop() { echo "Stopping celeryd..." $CELERY_BIN multi stopwait $CELERYD_NODES \ --pidfile=$CELERYD_PID_FILE } # 重启Worker restart() { stop start } # 查看Worker状态 status() { $CELERY_BIN multi status $CELERYD_NODES \ --pidfile=$CELERYD_PID_FILE } # 命令匹配逻辑 case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit 0
配置完后给脚本加执行权限并设置开机自启:
sudo chmod +x /etc/init.d/celeryd sudo update-rc.d celeryd defaults
四、配置/etc/default/celerybeat(定时任务调度器配置)
Celery Beat用来触发定时任务,配置文件内容如下:
# 同样加载Django配置模块 export DJANGO_SETTINGS_MODULE="project.settings" # Celery二进制路径(和Worker的保持一致) CELERY_BIN="/path/to/your/virtualenv/bin/celery" # Celery应用名称 CELERY_APP="project" # 项目根目录绝对路径 CELERYBEAT_CHDIR="/absolute/path/to/your/project/root" # Beat调度文件路径(存储定时任务执行记录,确保celery用户有权限) CELERYBEAT_OPTS="--schedule=/var/run/celery/celerybeat-schedule --loglevel=INFO"
接着创建/etc/init.d/celerybeat启动脚本:
#!/bin/sh ### BEGIN INIT INFO # Provides: celerybeat # Required-Start: $network $local_fs $remote_fs # Required-Stop: $network $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: celery task scheduler daemon ### END INIT INFO DEFAULT_FILE="/etc/default/celerybeat" test -f $DEFAULT_FILE && . $DEFAULT_FILE # 定义核心变量 CELERY_BIN="${CELERY_BIN:-celery}" CELERYBEAT_PID_FILE="/var/run/celery/celerybeat.pid" CELERYBEAT_LOG_FILE="/var/log/celery/celerybeat.log" # 启动Beat start() { echo "Starting celerybeat..." mkdir -p $(dirname $CELERYBEAT_PID_FILE) $(dirname $CELERYBEAT_LOG_FILE) chown $CELERYD_USER:$CELERYD_GROUP $(dirname $CELERYBEAT_PID_FILE) $(dirname $CELERYBEAT_LOG_FILE) $CELERY_BIN beat -A $CELERY_APP \ --pidfile=$CELERYBEAT_PID_FILE \ --logfile=$CELERYBEAT_LOG_FILE \ --chdir=$CELERYBEAT_CHDIR \ $CELERYBEAT_OPTS \ --uid=$CELERYD_USER --gid=$CELERYD_GROUP --detach } # 停止Beat stop() { echo "Stopping celerybeat..." if [ -f $CELERYBEAT_PID_FILE ]; then kill $(cat $CELERYBEAT_PID_FILE) rm $CELERYBEAT_PID_FILE fi } # 重启Beat restart() { stop start } # 查看Beat状态 status() { if [ -f $CELERYBEAT_PID_FILE ]; then if kill -0 $(cat $CELERYBEAT_PID_FILE) 2>/dev/null; then echo "celerybeat is running" else echo "celerybeat PID file exists but process is not running" fi else echo "celerybeat is not running" fi } # 命令匹配逻辑 case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit 0
同样加执行权限和开机自启:
sudo chmod +x /etc/init.d/celerybeat sudo update-rc.d celerybeat defaults
五、关于DJANGO_SETTINGS_MODULE的补充
你不需要单独写export DJANGO_SETTINGS_MODULE="settings",而是要写成export DJANGO_SETTINGS_MODULE="project.settings"(和celery.py里的配置完全一致),并且把这条语句放在/etc/default/celery和/etc/default/celerybeat里,这样Worker和Beat启动时就能正确加载Django配置了。
六、配置每日定时任务(后续步骤)
等守护进程跑起来后,你可以在Django的app里创建tasks.py,用crontab设置每日早间的抓取任务:
from celery import shared_task from celery.schedules import crontab from celery.task import periodic_task # 每天早上8点执行数据抓取 @periodic_task(run_every=crontab(hour=8, minute=0)) def daily_data_scrape(): print("Starting daily data scrape...") # 这里写你的数据抓取逻辑,比如调用你的爬虫函数 # scrape_data_from_sites() print("Daily data scrape completed!")
或者在celery.py里统一配置定时任务:
app.conf.beat_schedule = { 'daily-scrape-task': { 'task': 'your_app.tasks.daily_data_scrape', 'schedule': crontab(hour=8, minute=0), }, } app.conf.timezone = 'Asia/Shanghai' # 一定要设置时区,避免定时任务时间偏差
七、测试与排障小技巧
- 先手动启动Worker测试:
sudo /etc/init.d/celeryd start,然后看日志排查问题:tail -f /var/log/celery/worker1.log - 启动Beat后查看日志:
tail -f /var/log/celery/celerybeat.log - 如果遇到权限报错,给日志和PID目录赋权:
sudo chown -R celery:celery /var/log/celery /var/run/celery - 确保虚拟环境路径正确,
CELERY_BIN必须指向虚拟环境里的celery,不能用系统全局的celery
内容的提问来源于stack exchange,提问作者juju
相关产品推荐
相关产品推荐

