Home > Erlang探索 > epmd端口定制

epmd端口定制

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: 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.

  1. 百岁
    July 18th, 2013 at 23:55 | #1

    是否是要保证一个集群中的所有节点上empd的暴露端口都是一样的?

    [Reply]

  1. July 3rd, 2014 at 23:50 | #1