supervisor启动Celery后无法读取.env文件及firebase服务文件报错问题
根因分析
问题核心是supervisor启动进程时的默认运行环境与本地手动启动的环境存在两处差异:
- supervisor启动进程的默认工作目录不是你的项目根目录,所有相对路径寻址(包括.env文件、FCM服务账号文件)都会失败
- django-environ默认优先读取系统环境变量,若supervisor运行环境中已存在和.env同名的环境变量(哪怕值为空),会直接使用该空值而不会读取.env中你配置的有效值
解决方案
1. 修正supervisor配置
找到celery worker对应的supervisor配置文件(通常存放在/etc/supervisor/conf.d/目录下),新增两个配置项:
[program:celery-worker] # 保留你原有配置(command、user、日志路径等)不变,新增以下两项 directory = /你的项目根目录绝对路径 # 替换为存放manage.py、.env的目录 environment = PYTHONPATH="/你的项目根目录绝对路径"
修改完成后执行命令更新配置并重启服务:supervisorctl reread && supervisorctl update && supervisorctl restart celery-worker
2. 强制.env配置优先级(可选,若完成第一步仍有变量为空时操作)
修改settings.py中读取.env的代码,添加overwrite=True参数强制覆盖系统已存在的同名环境变量:
import environ BASE_DIR = Path(__file__).resolve().parent.parent env = environ.Env() # 新增overwrite=True参数 environ.Env.read_env((BASE_DIR / '.env').as_posix(), overwrite=True)
3. 修复FCM文件找不到问题
两种方案二选一即可:
- 方案一:初始化firebase时明确指定服务账号文件的绝对路径
import firebase_admin from firebase_admin import credentials # 替换为你的服务账号文件实际名称 cred = credentials.Certificate((BASE_DIR / 'fcm_service_account.json').as_posix()) firebase_admin.initialize_app(cred)
- 方案二:在supervisor的environment配置项中新增服务账号路径配置
environment = PYTHONPATH="/你的项目根目录绝对路径",GOOGLE_APPLICATION_CREDENTIALS="/你的项目根目录绝对路径/fcm_service_account.json"
内容的提问来源于stack exchange,提问作者Amanur Rahman
相关产品推荐
相关产品推荐

