web-dev-qa-db-ja.com

Erlangランタイム(またはRabbitMQ)がランダムなUDPポートでリッスンするのはなぜですか?

RabbitMQ3.7.8およびErlange21.1(centOS 6サーバー)への更新後、netstatは、beam.smpがすべてのインターフェイスのランダムUDPポートでリッスンしていることを示しています。

〜$ Sudo netstat -pnul | grepbeam 
 udp 0 0 0.0.0.0:45224 0.0.0.0:* 7320 /beam.smp

そのポートは再起動するたびに変化し、アプリを停止すると閉じられませんが、アプリを再開すると変化します。

〜$ Sudorabbitmqctlstop_app 
ノードrabbit @ Hostでのrabbitアプリケーションの停止... 
〜$ Sudo netstat -pnul | grepbeam 
 udp 0 0 0.0.0.0:45224 0.0.0.0:* 7320 /beam.smp
~$ Sudorabbitmqctlstart_app 
開始ノードrabbit @ Host ... 
 7つのプラグインで完了。
〜$ Sudo netstat -pnul | grepbeam 
 udp 0 0 0.0.0.0:51001 0.0.0.0:* 7320 /beam.smp
  • すべてのプラグインを無効にしてもこの動作は変わらないので、これはプラグインに関連していないと思います。
  • tcpdumpは、このポートでのアクティビティを表示しません。
  • RabbitMQのドキュメントでこれの痕跡を見つけることができません。
  • これに関連するものはインターネットで見つかりません
  • 「udp」の「rabbitmq-server」のコードをgrepしても、多くの情報は得られません。

主な質問は、このポートが何に使用されるかです。当然の結果として、これを構成することは可能ですか?

1
Julien

私には、これはsyslog_loggerモジュールによってバインドされたポートであり、このRabbitMQ依存関係に由来しているようです。

https://github.com/schlagert/syslog

デフォルトではRabbitMQノードで開始され、起動するとランダムなポートにバインドされるようです。

依存関係: https://github.com/rabbitmq/rabbitmq-server/blob/c1fb658ce13ae7f14919bd784eddd3dc77ab5144/Makefile#L139

ポートが開かれている行: https://github.com/schlagert/syslog/blob/ac8b9eecd593b8cc5a8b1de332d5d7d874e25aa9/src/syslog_logger.erl#L323-L32

ドキュメントによると、この機能はデフォルトで無効になっていますが、Erlangアプリケーションは起動しています。無効になっているときにアプリケーションを起動しない方がいいと思います。

自分で確認したい場合は、次のようにします。

Rabbit ErlangVMへのリモートシェルを起動します。

% Start remote console
erl -sname test -remsh rabbit@$HOSTNAME
% Get all the port infos from the Erlang VM
PortInfos = lists:map(fun erlang:port_info/1, erlang:ports()).
% print the result
rp(PortInfos).
% Investigate the list for one which has the {name, udp_inet} line
% something like this: 
 [{name,"udp_inet"},
  {links,[<0.77.0>]},
  {id,9568},
  {connected,<0.77.0>},
  {input,0},
  {output,0},
  {os_pid,undefined}]
% And from this you can get the linked process, and see that it is a syslog_logger process
rp(erlang:process_info(erlang:list_to_pid("<0.77.0>"))).

% The result will be something like this
[{registered_name,syslog_logger},
 {current_function,{gen_server,loop,7}},
 {initial_call,{proc_lib,init_p,5}},
 {status,waiting},
 {message_queue_len,0},
 {messages,[]},
 {links,[#Port<0.1196>,<0.76.0>]},
 {dictionary,[{'$initial_call',{syslog_logger,init,1}},
              {'$ancestors',[<0.76.0>,<0.75.0>]}]},
 {trap_exit,false},
 ......]

$initial_callの部分が表示され、どのモジュールであるかがわかります。

現在、この動作を制御できるようには見えません。コードは送信のみを行い、私が見ることができるようにモジュールには受信は実装されていません。

1
Lajos Gerecs