epmd端口定制
在前面一篇 Erlang epmd的角色以及使用 我们知道epmd是起到节点名称和地址的转换服务,绑定在周知端口4369.
但是这也会带来三个问题:
1. 因为是周知端口,所以通过查询目标机器上的4369,就可以知道这个机器上节点的情况。
2. 在同一机器可能会部署不同的Erlang集群,希望不要互相干扰。
3. 防火墙不允许过4369端口,或者不在开放端口之列表。
这就需要对epmd绑定的端口能够定制。
参见epmd的文档:
ERL_EPMD_PORT
This environment variable can contain the port number epmd will use. The default port will work fine in most cases. A different port can be specified to allow several instances of epmd, representing independent clusters of nodes, to co-exist on the same host. All nodes in a cluster must use the same epmd port number.
erlang虚拟机起到的时候,erlexec会做好这些epmd初始化操作:
//erlexec.c static void add_epmd_port(void) { char* port = get_env("ERL_EPMD_PORT"); if (port != NULL) { add_args("-epmd_port", port, NULL); } }
改变端口二种路子,二者效果一样。
1. ERL_EPMD_PORT=NNNN erl
2. erl -epmd_port NNNN
这里要注意的是,一旦本机采用定制的epmd port, 在访问其他节点时候也是用定制端口访问的。
参看代码:
%%erl_epmd.erl get_epmd_port() -> case init:get_argument(epmd_port) of {ok, [[PortStr|_]|_]} when is_list(PortStr) -> list_to_integer(PortStr); error -> ?erlang_daemon_port end. open({A,B,C,D}=EpmdAddr) when ?ip(A,B,C,D) -> gen_tcp:connect(EpmdAddr, get_epmd_port(), [inet]);
小结:源码面前无秘密。
祝玩得开心!
Post Footer automatically generated by wp-posturl plugin for wordpress.
是否是要保证一个集群中的所有节点上empd的暴露端口都是一样的?