在Elixir/Erlang中,`Node.connect`使用哪个端口?

16

可以使用iex来初始化一个Elixir节点:

iex --sname node1@10.99.1.50 --cookie foo

然后另一个人可以使用REPL连接此节点:

Node.connect(:"node1@10.99.1.50")

看起来连接是通过 TCP 协议完成的。然而,在 文档 中我没有找到指定使用哪个端口的参数。有人有关于这个问题的想法吗?

2个回答

14

连接节点由Erlang端口映射守护程序(epmd)处理,其默认在4369端口运行。根据文档:

可以指定不同的端口以允许多个epmd实例,在同一主机上共存,表示独立的节点群集。群集中的所有节点必须使用相同的epmd端口号。

实际节点打开随机(?)端口并将其与其sname一起向本地epmd公告。当您现在连接到'node1@10.99.1.50'时,您的Erlang虚拟机将请求远程epmd(默认端口为4369) ,该epmd运行在10.99.1.50上,以获取有关'node1'的信息。 它将回答实际端口号,您的进程将直接连接到该端口。


7
根据这篇文章Erlang分布,Erlang在TCP上使用端口4369。文章中还有更多信息。
对于防火墙:Erlang分布使用 4369 端口用于epmd,以及每个节点的随机端口。您可以通过使用Erlang内核应用程序环境设置inet_dist_listen_min和inet_dist_listen_max来限制这些随机端口的范围。您需要允许这些端口的 TCP连接,但只能来自集群中的其他主机。
您可能也会对此感兴趣:Chris McCoord的主题

2
端口4369仅用于通信实际端口。 - filmor
@filmor 看起来是正确的。感谢您的纠正。 - Sasha Fonseca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接