You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法搭建Ejabberd集群求助:两台Ubuntu虚拟机集群连接失败

解决Ejabberd集群join_cluster时的{no_ping, ejabberd@Ubuntu-VB}错误

我之前在搭建Ejabberd集群时也碰到过一模一样的{no_ping, ejabberd@Ubuntu-VB}错误,这个问题本质是Erlang节点之间无法建立网络通信——毕竟Ejabberd的集群完全依赖Erlang的分布式节点机制。咱们一步步来排查解决:

  • 先确认主机名与网络可达性
    首先在VM2上尝试ping VM1的主机名Ubuntu-VB,如果ping不通,说明两台虚拟机之间的DNS解析有问题。最简单的解决办法是在VM2的/etc/hosts文件中添加VM1的IP映射,比如:

    192.168.1.100 Ubuntu-VB
    

    替换成你实际的VM1局域网IP。另外要确保两台VirtualBox虚拟机的网络模式一致,推荐用桥接模式,让它们处于同一个局域网网段内,避免NAT模式下的端口转发问题。

  • 验证Erlang Port Mapper Daemon(epmd)的连通性
    Erlang节点之间通信依赖epmd服务(默认端口4369)。在VM1上执行epmd -names,你应该能看到类似ejabberd的节点名称;然后在VM2上执行:

    epmd -host Ubuntu-VB -names
    

    如果能正常返回VM1的节点信息,说明epmd连通没问题;如果返回错误,检查两台机器的防火墙是否开放了4369端口(Ubuntu可以用ufw allow 4369/tcp临时开放测试)。

  • 确认.erlang.cookie的一致性与权限
    你已经复制了cookie文件,但要注意两个关键点:

    1. 两台机器的cookie内容必须完全一致(包括大小写,Erlang cookie是大小写敏感的),可以在两台机器上执行cat /var/lib/ejabberd/.erlang.cookie(如果ejabberd用ejabberd用户运行,路径可能是这个;如果用root运行则是~/.erlang.cookie)对比内容。
    2. cookie文件的权限必须是400,且所有者是ejabberd的运行用户,执行:
      chmod 400 /var/lib/ejabberd/.erlang.cookie
      chown ejabberd:ejabberd /var/lib/ejabberd/.erlang.cookie
      

    权限不对会导致Erlang节点拒绝连接。

  • 核对Ejabberd节点名称
    在VM1上执行ejabberdctl status,查看输出中的节点名称是否确实是ejabberd@Ubuntu-VB——有时候虚拟机的主机名可能和你预期的不一致,用hostname命令检查VM1的实际主机名,确保和你执行join_cluster时指定的节点名完全匹配。

  • 手动测试Erlang节点连接
    如果上面的步骤都没问题,咱们可以用Erlang shell直接测试节点连通性,排除Ejabberd本身的问题:
    在VM2上启动Erlang shell:

    erl -sname test@$(hostname) -setcookie $(cat /var/lib/ejabberd/.erlang.cookie)
    

    然后在shell中执行:

    net_adm:ping('ejabberd@Ubuntu-VB').
    

    如果返回pong,说明节点通信完全正常,再重新执行ejabberdctl --no-timeout join_cluster 'ejabberd@Ubuntu-VB'应该就能成功;如果返回pang,那还是回到前面的步骤排查网络或cookie问题。

内容的提问来源于stack exchange,提问作者Gopal Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:35:25