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

两台Ubuntu实例搭建Ejabberd集群时遇{no_ping}错误求助

解决Ejabberd集群join_cluster时出现{no_ping,'ejabberd@1.1.1.1'}的问题

嗨,我之前也踩过类似的Erlang节点通信坑,这个no_ping错误本质就是两台Ejabberd背后的Erlang节点没法建立连接,给你梳理几个关键排查点和解决办法,一步步来:

1. 先搞定网络连通性基础

Erlang分布式节点要通信,得用到4369端口(epmd服务)和动态分配的1024-65535范围内的端口。先在节点2上测试能不能ping通节点1的IP:

ping 1.1.1.1

如果ping不通,先调整VirtualBox网络配置:

  • 别用NAT模式!NAT会做地址转换,虚拟机之间没法直接通信,换成桥接模式或者内部网络(内部网络要手动给两台机设静态IP)
  • 临时关掉Ubuntu的防火墙试试,避免端口被拦截:
sudo ufw disable

要是不想关防火墙,就开放必要端口:

sudo ufw allow 4369/tcp
sudo ufw allow 4369/udp
sudo ufw allow in from 节点2的IP to any port 1024:65535/tcp

2. 绕开Ejabberd,先测试纯Erlang节点通信

有时候问题不在Ejabberd,而是Erlang本身的分布式配置。咱们先单独验证:

  • 节点1上启动一个测试Erlang节点:
erl -name test@1.1.1.1 -setcookie 你的Cookie值
  • 节点2上启动另一个测试节点:
erl -name test2@节点2的IP -setcookie 你的Cookie值

然后在节点2的Erlang shell里输入:

net_adm:ping('test@1.1.1.1').

要是返回pong,说明Erlang分布式通信没问题,问题出在Ejabberd的配置;要是返回pang,那先把Erlang的连通性搞定再说。

3. 检查Ejabberd配置的细节

  • .erlang.cookie的权限必须严格:这个文件必须是600权限,否则Erlang会拒绝使用它,执行:
sudo chmod 600 /var/lib/ejabberd/.erlang.cookie  # 路径可能因系统不同,找不到就全局搜索一下
  • ejabberdctl.cfg配置要准确对应:节点1的ERLANG_NODE是ejabberd@1.1.1.1,节点2的是ejabberd@节点2的IP,INET_DIST_INTERFACE必须设成对应节点的实际IP,不能用127.0.0.1
  • ejabberd.yml的hosts配置补全:你现在只设了"xyz-VirtualBox",最好把两台节点的IP也加上,比如:
hosts:
  - "xyz-VirtualBox"
  - "1.1.1.1"
  - "节点2的IP"

另外,在两台节点的/etc/hosts里互相添加解析条目,避免主机名解析失败:
节点1的/etc/hosts添加:

节点2的IP  xyz-VirtualBox-2

节点2的/etc/hosts添加:

1.1.1.1  xyz-VirtualBox

4. 彻底重启服务再尝试集群加入

改完配置后,别只执行start,要彻底停掉再启动:
节点1:

ejabberdctl stop
ejabberdctl start

节点2:

ejabberdctl stop
ejabberdctl start
ejabberdctl --no-timeout join_cluster ejabberd@1.1.1.1

要是还是不行,去看Ejabberd的日志(一般在/var/log/ejabberd/ejabberd.log),里面会有更详细的报错,比如epmd没启动、端口被占用之类的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:09:18