ejabberd 21.07使用ejabberdctl注册用户提示unknown virtual host
问题根因排查与解决方案
第一步:验证运行中ejabberd实际加载的虚拟主机列表
不要直接依赖静态配置文件判断配置是否生效,先执行以下命令查看当前服务识别的合法虚拟主机:ejabberdctl registered_vhosts
如果返回结果中没有100.100.100.100,说明配置未正确加载,按第二步排查;如果存在该地址,直接跳第三步。
第二步:配置未加载的排查方案
- 检查yaml配置的缩进格式:ejabberd 21.07对yaml缩进要求极其严格,
hosts和auth_method必须为同级配置,缩进完全一致,子项缩进为2个空格,不能使用制表符。你当前给出的配置片段中auth_method的缩进明显大于hosts,属于典型错误,修正后示例:
hosts: - "100.100.100.100" auth_method: - sql - external
- 确认修改的是生效配置文件:不同安装方式的ejabberd配置路径不同,可执行
ps aux | grep ejabberd查看启动命令中--config参数指定的路径,确认你修改的是该路径下的配置文件。 - 完全重启服务生效:21.07版本的虚拟主机配置无法通过热重载生效,修改配置后必须执行全量重启:
systemctl restart ejabberd(systemd管理场景),重启后再次执行ejabberdctl registered_vhosts确认虚拟主机已加载。
提示:你当前的/etc/hosts配置无问题,虚拟主机匹配是字符串匹配,和域名解析无关,无需调整hosts配置。
第三步:虚拟主机已加载仍报错的排查方案
该问题由双认证配置触发,你当前设置的先sql后external的认证顺序会导致注册请求先被发往SQL模块,再发往外部认证脚本:
- 临时将
auth_method改为仅internal,尝试注册,如果注册成功,说明问题出在认证模块:- 调整认证顺序,将
external放到sql之前测试 - 检查外部认证脚本的逻辑,确认脚本可以正常处理host参数为
100.100.100.100的请求,没有错误返回导致ejabberd误判虚拟主机不存在。
- 调整认证顺序,将
内容的提问来源于stack exchange,提问作者Victoria
相关产品推荐
相关产品推荐

