Apache Airflow 2.3.0 daemon模式启动webserver报错求助
问题现象
在Oracle Linux上部署Apache Airflow 2.3.0版本时出现启动差异问题:
- 前台启动:在两个独立终端分别执行
airflow scheduler、airflow webserver命令启动服务,所有功能运行正常,自定义OAuth登录认证逻辑可正常生效。 - Daemon(守护进程)模式启动:执行
airflow scheduler -D、airflow webserver -D命令时,仅scheduler服务可正常启动,webserver启动失败抛出错误,错误截图如下:
现有配置与已尝试排查
已参照官方安全配置文档修改webserver_config.py,启用OAuth认证能力,新增自定义认证提供者,继承AirflowSecurityManager类实现对应新提供者的用户信息校验逻辑,配置代码如下:
from airflow.www.security import AirflowSecurityManager class BaseSecurityManagerTQ(AirflowSecurityManager): def get_oauth_user_info(self, provider, resp): if provider == "TQ": me = self.appbuilder.sm.oauth_remotes[provider].get('/connect/userinfo') data = me.json() ans = { "username": "tq_" + data.get('name', ""), "email": data.get("email", ""), } return ans else: return {} FAB_SECURITY_MANAGER_CLASS = "webserver_config.BaseSecurityManagerTQ"
已尝试的排查操作:
- 使用
importlib库导入自定义安全模块 - 参考公开社区中daemon模式启动故障的相关排查方案操作,问题未解决,需要可行的修复方案。
故障原因与修复步骤
故障核心原因是Airflow daemon模式启动时的工作目录、Python模块搜索路径、环境变量继承逻辑和前台启动场景不一致,导致webserver进程加载自定义安全类失败,按以下步骤修复即可:
- 清理残留异常文件
之前启动失败会残留pid、错误日志锁文件,先执行命令删除:rm -rf $AIRFLOW_HOME/*.pid $AIRFLOW_HOME/*.err - 确认模块路径配置正确
- 确保
webserver_config.py存放在$AIRFLOW_HOME根目录下,Airflow启动时默认会将该目录加入Python搜索路径 - 不要使用相对路径引用自定义类,
FAB_SECURITY_MANAGER_CLASS配置保持绝对模块路径格式即可,即当前配置的"webserver_config.BaseSecurityManagerTQ";如果自定义类存放在其他独立脚本中,需要将脚本所在目录追加到系统PYTHONPATH环境变量中。
- 确保
- 配置daemon模式环境变量加载
前台启动时进程会继承当前shell的所有环境变量,但daemon模式启动不会加载当前shell的临时环境变量,需要将Airflow运行所需的所有环境变量(包括AIRFLOW_HOME、OAuth密钥、自定义PYTHONPATH等)写入$AIRFLOW_HOME/airflow.env文件,每行一个配置,格式为变量名=变量值。 - 校验文件权限
确认执行启动命令的用户对$AIRFLOW_HOME目录、所有自定义代码文件有可读权限,daemon模式不会继承当前shell的临时提权权限,权限不足会直接导致类加载失败。 - 启动验证
先执行airflow webserver前台启动,确认无报错后按Ctrl+C终止进程,再执行airflow webserver -D启动守护进程即可。
排查辅助:如果上述操作后仍启动失败,直接查看
$AIRFLOW_HOME/logs/webserver/目录下最新的日志文件,搜索ImportError、ModuleNotFoundError关键字即可定位具体的加载失败原因。
内容的提问来源于stack exchange,提问作者suribe06
相关产品推荐
相关产品推荐

