[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