Django生产环境启动Celery/Supervisor实例时遇ERROR (spawn error)求助
我已经摸清楚在Django生产服务器上用Supervisor部署Celery的流程了,但刚才执行sudo supervisorctl start app-celery启动的时候,居然返回了app-celery: ERROR (spawn error)的错误,实在搞不懂哪里出问题了。
我的Supervisor配置文件/etc/supervisor/conf.d/app-celery.conf内容如下:
[program:app-celery]
command=/home/zorgan/app/env/bin/celery worker -A draft1 --loglevel=INFO
directory=/home/zorgan/app/draft1
numprocs=1
stdout_logfile=/var/log/supervisor/celery.log
stderr_logfile=/var/log/supervisor/celery.log
autostart=true
autorestart=true
startsecs=10
我整理的排查&解决步骤
1. 先手动跑Celery,确认命令本身没问题
别先盯着Supervisor纠结,先直接在终端里运行Celery命令,看看是不是Celery本身就启动不了:
cd /home/zorgan/app/draft1 /home/zorgan/app/env/bin/celery worker -A draft1 --loglevel=INFO
如果这一步就报错,那优先解决Celery的基础问题——比如Django配置错误、依赖缺失、settings模块路径不对之类的。
2. 检查权限和路径是否靠谱
- 看看日志文件
/var/log/supervisor/celery.log的权限:确保运行Celery的用户(比如你的zorgan)能读写这个文件,要是权限不够就给目录改权限:sudo chown -R zorgan:zorgan /var/log/supervisor/ - 确认
directory配置的/home/zorgan/app/draft1确实存在,而且zorgan用户能正常访问这个目录。
3. 给配置补点关键项
你的配置里少了几个容易被忽略但很重要的项,建议补上:
user=zorgan:指定用zorgan用户运行Celery,别用root,安全又不容易出权限问题- 日志分割相关配置:防止日志文件无限变大占用磁盘
- 优雅停止的等待时间:给Celery足够时间处理完当前任务再停止
修改后的配置参考:
[program:app-celery] command=/home/zorgan/app/env/bin/celery worker -A draft1 --loglevel=INFO directory=/home/zorgan/app/draft1 numprocs=1 stdout_logfile=/var/log/supervisor/celery.log stderr_logfile=/var/log/supervisor/celery.log stdout_logfile_maxbytes=10MB stdout_logfile_backups=5 stderr_logfile_maxbytes=10MB stderr_logfile_backups=5 autostart=true autorestart=true startsecs=10 stopwaitsecs=60 user=zorgan
4. 去看Supervisor的详细日志找线索
Supervisor本身的日志里会有更具体的错误原因,比如命令路径写错了、环境变量缺失之类的,直接查看:
tail -f /var/log/supervisor/supervisord.log
我上次就是在这里发现是环境变量没设置,导致Celery找不到Django的settings文件。
5. 补全必要的环境变量
如果你的Celery需要特定的环境变量(比如指定Django的生产环境配置),可以在配置里加上environment项:
environment=DJANGO_SETTINGS_MODULE="draft1.settings.production",PYTHONPATH="/home/zorgan/app/draft1"
6. 别忘了重新加载配置
改完配置后,一定要让Supervisor重新读取配置,再尝试启动:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start app-celery
内容的提问来源于stack exchange,提问作者Zorgan

