如何在Heroku生产环境中让Django应用的Celery任务自动执行?
Django生产环境中让Celery Worker自动运行的方案
一、使用Systemd(主流Linux发行版推荐)
这是目前Linux系统最通用的进程管理方案,能确保Celery Worker开机自启、意外退出后自动重启。
- 创建Systemd服务文件
在/etc/systemd/system/目录下新建celery.service文件,填入以下内容(根据你的实际环境替换占位符):
[Unit] Description=Celery Worker for Django App After=network.target redis.target # 使用RabbitMQ则替换为rabbitmq-server.target [Service] User=your_username # 运行Django的用户,如www-data或你的个人用户名 Group=your_group # 对应用户组 WorkingDirectory=/path/to/your/django/project # Django项目根目录 ExecStart=/path/to/venv/bin/celery -A appname worker -l info --pool=solo # 替换虚拟环境路径和你的appname Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
- 启用并启动服务
执行以下命令完成配置:
- 重新加载systemd配置:
sudo systemctl daemon-reload - 设置开机自启:
sudo systemctl enable celery.service - 启动服务:
sudo systemctl start celery.service - 验证状态:
sudo systemctl status celery.service
二、使用Supervisor
适合习惯用Supervisor管理多进程的场景,配置简单直观。
安装Supervisor
Debian/Ubuntu系统:sudo apt install supervisor
CentOS/RHEL系统:sudo yum install supervisor创建Celery配置文件
在/etc/supervisor/conf.d/目录下新建celery.conf,内容如下:
[program:celery] command=/path/to/venv/bin/celery -A appname worker -l info --pool=solo directory=/path/to/your/django/project user=your_username numprocs=1 autostart=true autorestart=true startsecs=10 stdout_logfile=/var/log/celery/celery.log stderr_logfile=/var/log/celery/celery_err.log
先创建日志目录并设置权限:sudo mkdir -p /var/log/celery && sudo chown your_username:your_group /var/log/celery
- 加载配置并启动
- 更新配置:
sudo supervisorctl reread - 加载新服务:
sudo supervisorctl update - 启动Celery:
sudo supervisorctl start celery - 查看状态:
sudo supervisorctl status celery
三、Docker容器化部署场景
如果你的Django应用用Docker部署,可以直接在docker-compose.yml中定义Celery服务,实现随容器自动启动:
version: '3.8' services: django_web: build: . command: gunicorn appname.wsgi:application --bind 0.0.0.0:8000 volumes: - .:/code depends_on: - redis - celery_worker celery_worker: build: . command: celery -A appname worker -l info --pool=solo volumes: - .:/code depends_on: - redis restart: always # 容器退出后自动重启
执行docker-compose up -d启动所有服务,Celery Worker会随容器自动运行,且Docker服务开机自启时会一并启动。
关键注意事项
- 确保你的消息中间件(Redis/RabbitMQ)也配置了开机自启,否则Celery Worker启动后无法连接Broker
- 生产环境若不需要单进程模式(
--pool=solo),可根据服务器CPU核心数调整进程数,例如--autoscale=4,2(最多4个工作进程,最少保留2个) - 定期清理Celery日志文件,避免占用过多磁盘空间
内容的提问来源于stack exchange,提问作者Roizy Kish
相关产品推荐
相关产品推荐

