生产环境下使用Supervisor运行Celery遇到的问题
解决Supervisor部署Celery时的权限、端口与版本冲突问题
看起来你在部署Celery的过程中踩了几个典型的坑——权限不足、Python版本不匹配、端口占用,咱们一步步来解决:
一、先搞定非root运行时的日志权限错误
你遇到的IOError: [Errno 13] Permission denied: '/var/log/supervisor/supervisord.log',本质是普通用户chiefir没有读写/var/log/supervisor/目录的权限。操作起来很简单:
- 先确认目录的所有者:
ls -ld /var/log/supervisor/ - 如果是root独占,修改权限让你的用户能访问:
sudo chown -R chiefir:chiefir /var/log/supervisor/ sudo chmod -R 755 /var/log/supervisor/ - 顺便检查Celery的日志目录
/home/chiefir/logs/celery/,确保它存在且有权限:mkdir -p /home/chiefir/logs/celery/ chown -R chiefir:chiefir /home/chiefir/logs/celery/
二、解决Python版本不一致的问题
你的Django项目用Python3.5,但apt装的Supervisor默认绑定系统的Python2.7,这会导致Supervisor调用的Celery是Python2环境的,和你的项目依赖不兼容。解决办法是让Supervisor直接调用你Python3环境里的Celery:
- 先找到你Python3虚拟环境(或者全局Python3)里的Celery绝对路径:
# 先激活你的项目虚拟环境 source /home/chiefir/polo/Cosmo/venv/bin/activate which celery # 输出应该类似 /home/chiefir/polo/Cosmo/venv/bin/celery - 修改两个Celery的Supervisor配置文件:
- 打开
/etc/supervisor/conf.d/mycelery.conf,把command改成绝对路径:command=/home/chiefir/polo/Cosmo/venv/bin/celery worker -A cosmetics_crawler_project --loglevel=INFO - 同样修改
mycelerybeat.conf的command:command=/home/chiefir/polo/Cosmo/venv/bin/celery beat -A cosmetics_crawler_project --schedule /var/lib/celery/beat.db --loglevel=INFO
- 打开
- 别忘了给Celery Beat的调度文件目录授权:
sudo mkdir -p /var/lib/celery/ sudo chown -R chiefir:chiefir /var/lib/celery/
三、处理root运行时的端口占用问题
当你用root启动supervisord时提示端口占用,是因为已经有一个supervisord进程在后台运行了。按以下步骤处理:
- 先排查当前运行的supervisord进程:
ps aux | grep supervisord - 停止现有进程:
# 用supervisorctl正常关闭 sudo supervisorctl shutdown # 如果不行就直接杀进程:sudo kill [进程ID] - 用指定配置文件的方式启动(避免root运行的安全警告):
sudo supervisord -c /etc/supervisord.conf
四、关于Supervisor的安装方式:不要混合apt和pip
apt安装的Supervisor绑定Python2.7是正常的(Debian/Ubuntu的系统包通常和系统Python绑定),不要同时用apt和pip安装,这会导致版本冲突和混乱。如果你想要Supervisor用Python3运行,可以彻底切换到pip安装:
- 先卸载apt版本的Supervisor:
sudo apt remove --purge supervisor sudo apt autoremove - 用Python3的pip安装:
sudo pip3 install supervisor - 生成新的配置文件:
echo_supervisord_conf > /etc/supervisord.conf - 修改配置文件的
[include]部分,确保包含你的Celery配置:
这种方式下Supervisor会用Python3运行,和你的项目环境一致,但同样要处理日志、socket目录的权限问题(参考第一步的权限设置)。[include] files = /etc/supervisor/conf.d/*.conf
最后验证部署
做完上面的步骤后,重新加载配置并检查状态:
# 重新读取配置 supervisorctl reread # 更新进程 supervisorctl update # 查看所有进程状态 supervisorctl status
如果还有问题,直接查看Celery的日志排查:
tail -f /home/chiefir/logs/celery/celery.log tail -f /home/chiefir/logs/celery/celerybeat.log
内容的提问来源于stack exchange,提问作者Chiefir
相关产品推荐
相关产品推荐

