两台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.1ejabberd.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
相关产品推荐
相关产品推荐

