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

多IP主机上Erlang节点以本地地址启动的跨机通信实现咨询

问题分析与解决方法

这个问题其实戳中了Erlang节点通信的核心规则:节点名称里的主机标识(@后面的部分)必须是远程节点能解析并直接访问到的地址,你当前用127.0.0.1启动M1的节点,这个回环地址只有M1本机能访问,M2根本没法通过这个地址连接到M1的Erlang节点,哪怕M1有其他局域网IP也没用。下面给你两种可行的解决方案,以及关于域名使用的建议:

方案一:使用远程可访问的IP启动节点

直接用M1上M2能连通的IP地址来启动Erlang节点,步骤如下:

  1. 在M1上重新启动节点,替换回环地址为M2能访问的IP(比如192.168.5.47):
    nik@nik-PC:~/erlsrc/test_mk$ erl -name 'test@192.168.5.47' -setcookie cook
    
  2. 在M2上保持节点启动不变,直接ping新的节点名称:
    (test2@127.0.0.1)1> net_adm:ping('test@192.168.5.47').
    pong
    
    (如果还是pang,先检查M2能不能ping通192.168.5.47,以及两台机器的防火墙是否开放了Erlang通信端口:默认需要开放4369端口,以及Erlang节点随机分配的端口范围)

方案二:使用域名/主机名启动(更推荐)

用域名或主机名代替IP会更灵活,尤其是当机器IP可能变化的场景下,步骤如下:

  1. 配置主机名解析:如果没有内网DNS服务器,直接修改两台机器的/etc/hosts文件:
    • 在M2的/etc/hosts中添加一行:
      192.168.5.47 m1-node
      
    • 在M1的/etc/hosts中添加一行:
      192.168.5.250 m2-node
      
  2. 在M1上用主机名启动节点:
    nik@nik-PC:~/erlsrc/test_mk$ erl -name 'test@m1-node' -setcookie cook
    
  3. 在M2上用主机名启动节点:
    nik2@nik2-PC:~$ erl -name 'test2@m2-node' -setcookie cook
    
  4. 在M2上ping节点:
    (test2@m2-node)1> net_adm:ping('test@m1-node').
    pong
    
    这种方式的好处是,后续哪怕M1的IP变更,只需要修改hosts文件或DNS解析,不需要重新调整Erlang节点的启动命令,维护成本更低。

额外注意事项

  • 两台节点的-setcookie参数值必须完全一致,这是Erlang节点间身份认证的关键,你当前已经设置为cook,这部分没问题。
  • 如果M1有多个IP,选择哪一个IP/主机名,取决于你希望M2通过哪个网络链路访问M1,只要保证M2能连通对应的IP即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:12:33