[rabbitmq-discuss] Plz give me help about EPMD: Non-local peer connected

Tim Watson tim at rabbitmq.com
Fri Jul 6 18:34:07 BST 2012


Hi there,

On 06/07/2012 06:53, 何斌 wrote:
> Hi all,
>
> I installed RabbotMQ & tried to start it.
>
> But I always got error as following:
>

Ok so first of all, let's see if we can get you to start a stand alone 
distributed Erlang node successfully. Normally stack traces like that 
occur when the host environment isn't set up quite right (from Erlang's 
perspective).

We need to be able to run `erl -sname rabbit` on the command line and 
see the Erlang emulator start successfully. It should look something 
like this:

##############

t4 at malachi:systest $ erl -sname rabbit
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:2:2] [async-threads:0] 
[hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
(rabbit at malachi)1>

##############

Can you start Erlang like that successfully? I'm assuming not, but 
please let us know.

I'm also interested in understanding what your hosts configuration 
(e.g., /etc/hosts) looks like. On some Operating Systems (such as CentOS 
for example), failing to set an explicit host name prevents you from 
starting a distributed Erlang node.

> {error_logger,{{2012,7,6},{13,32,21}},"Protocol: ~p: register error:
> ~p~n",["inet_tcp",{{badmatch,{error,epmd_close}},[{inet_tcp_dist,listen,1,[{file,"inet_tcp_dist.erl"},{line,70}]},{net_kernel,start_protos,4,[{file,"net_kernel.erl"},{line,1314}]},{net_kernel,start_protos,3,[{file,"net_kernel.erl"},{line,1307}]},{net_kernel,init_node,2,[{file,"net_kernel.erl"},{line,1197}]},{net_kernel,init,1,[{file,"net_kernel.erl"},{line,357}]},{gen_server,init_it,6,[{file,"gen_server.erl"},{line,304}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,227}]}]}]}
> {error_logger,{{2012,7,6},{13,32,21}},crash_report,[[{initial_call,{net_kernel,init,['Argument__1']}},{pid,<0.20.0>},{registered_name,[]},{error_info,{exit,{error,badarg},[{gen_server,init_it,6,[{file,"gen_server.erl"},{line,320}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,227}]}]}},{ancest
> ors,[net_sup,kernel_sup,<0.9.0>]},{messages,[]},{links,[#Port<0.90>,<0.17.0>]},{dictionary,[{longnames,false}]},{trap_exit,true},{status,running},{heap_size,987},{stack_size,24},{reductions,551}],[]]}
> {error_logger,{{2012,7,6},{13,32,21}},supervisor_report,[{supervisor,{local,net_sup}},{errorContext,start_error},{reason,{'EXIT',nodistribution}},{offender,[{pid,undefined},{name,net_kernel},{mfargs,{net_kernel,start_link,[[rabbitmqprelaunch1077,shortnames]]}},{restart_type,permanent},{shutdown,2000},{child_type,worker}]}]}
> {error_logger,{{2012,7,6},{13,32,21}},supervisor_report,[{supervisor,{local,kernel_sup}},{errorContext,start_error},{reason,shutdown},{offender,[{pid,undefined},{name,net_sup},{mfargs,{erl_distribution,start_link,[]}},{restart_type,permanent},{shutdown,infinity},{child_type,supervisor}]}]}
> {error_logger,{{2012,7,6},{13,32,21}},std_info,[{application,kernel},{exited,{shutdown,{kernel,start,[normal,[]]}}},{type,permanent}]}
> {"Kern el pid
> terminated",application_controller,"{application_start_failure,kernel,{shutdown,{kernel,start,[normal,[]]}}}"}
>
> Crash dump was written to: erl_crash.dump
> Kernel pid terminated (application_controller)
> ({application_start_failure,kernel,{shutdown,{kernel,start,[normal,[]]}}})
>
>
> I ran it on a server with public IP 183.*.*.* .
>
> In Erlang src, I found that epmd checks connection src.
>
>        /* Determine if connection is from localhost */
>        if (getpeername(s->fd,(struct sockaddr*) &si,&st) ||
>            st < sizeof(si)) {
>            /* Failure to get peername is regarded as non local host */
>            s->local_peer = EPMD_FALSE;
>        } else {
>            /* Only 127.x.x.x and connections from the host's IP address
>               allowed, no false positives */
>            s->local_peer =
> (((((unsigned) ntohl(si.sin_addr.s_addr)) & 0xFF000000U) ==
>                 0x7F000000U) ||
> (getsockname(s->fd,(struct sockaddr*) &di,&st) ?
>                 EPMD_FALSE : si.sin_addr.s_addr == di.s in_addr.s_addr));
>        }
>        dbg_tty_printf(g,2,(s->local_peer) ? "Local peer connected" :
>                       "Non-local peer connected");
>
>
> But unfortunately, si.sin_addr.s_addr was 183.*.*.*, while
> di.sin_addr.s_addr was 127.0.0.1
>
> My log:Checking peer address, getsockname ret: 0, si_addr=0xb7??????,
> di_addr=0x7f000001
>
>

I could be wrong, but I suspect this is a red herring. You can restart 
epmd with -d to get debugging information as well, but I suspect this 
isn't relevant.

Is there any way to force RabbitMQ server connect epmd via a specified
> address?
>

I'm not really sure what you mean by this, but I'm fairly confident that 
it is not necessary to even attempt to do something like that. Erlang 
should be able to start up nodes with `-sname <name>` or `-name 
<name>@<host>` and if either doesn't work, a little tweaking of the host 
configuration should solve it.

Based on your original comment (starting rabbitmq but always getting an 
error) my understanding is that you're trying to start rabbit on this 
machine and it fails. AFAIK when a distributed Erlang node connects to 
EPMD on the localhost it should be treated as such. The rabbitmq-server 
script starts rabbit up with `-sname rabbit` which implies that the node 
name will be rabbit@<hostname> so you should make sure that `erl -sname 
rabbit` works first of all.


More information about the rabbitmq-discuss mailing list