通过公共IP将erlang观察者连接到远程机器

时间:2019-01-28 11:56:19

标签: ssh erlang elixir

背景

我在生产中的一台机器运行一个elixir应用程序(无法访问iex,只能访问erl),我的任务是进行分析为什么我们要消耗大量CPU。这里的想法是启动观察器,检查“进程”选项卡,并查看减少最多的进程。

我该如何连接?

要连接,我正在关注博客中的教程:

他们的说明如下:

  1. 使用Cookie和名称在生产机器中启动应用程序
  2. 从本地运行:ssh user@public_ip "epmd -names"获取应用程序的名称和使用的端口
  3. 从本地创建到远程计算机的ssh隧道:ssh -L 4369:user@public_ip:4369 -L 42877:user@public_ip:42877 user@public_ip(默认情况下,4369是epmd端口,42877是应用程序的端口)
  4. 使用节点名称erl -name "user@app_name" -setcookie "mah_cookie" -hidden -run observer
  5. 从本地连接到远程计算机

问题

现在从理论上讲,我应该能够在机器上使用观察器。但是,我却遇到以下错误:

  

协议“ inet_tcp”:注册/收听错误:epmd_close

因此,在浏览了互联网的阴暗面之后,我决定使用sudo journalctl -f检查计算机的所有日志,然后发现了这一点:

channel 3: open failed: administratively prohibited: open failed
my_app_name sshd[8917]: error: connect_to flame@99.999.99.999: unknown host (Name or service not known)
/scripts/watchdog.sh")
my_app_name CRON[9985]: pam_unix(cron:session): session closed for user flame

位置:

  1. erlang -name:my_app_name
  2. 机器用户:火焰
  3. 机器公共ip:99.999.99.999(显然不是真实的)

所以它告诉我,未知主机??我很困惑,因为99.999.99.999是机器本身的公共IP!

问题

  1. 我在做什么错了?
  2. 我读到,在旧版本的erlang中,如果观察者位于不同的网络中,则无法使用观察器监视机器(之所以如此,是因为我想从本地主机监视该机器),但是我找不到任何机器有关现代的信息。
  3. 如果实际上这不可能,那么我有什么选择?

1 个答案:

答案 0 :(得分:0)

解决方案

经过3天的不间断搜索,我终于找到了行之有效的方法。 总而言之,我将所做的一切都放在这里。

本地计算机上的所有步骤:

  1. 从远程服务器获取端口:
> ssh remote-user@remote-ip "epmd -names"
epmd: up and running on port 4369 with data:
name super_duper_app at port 43175
  1. 使用端口创建ssh隧道:

ssh remote-user@remote-ip -L4369:localhost:4369 -L43175:localhost:43175

  1. 在本地计算机上的另一个终端上,运行带有远程服务器中应用程序正在使用的cookie的iex终端。然后连接到它并启动观察器:
iex --name observer@127.0.0.1 --cookie super_duper_cookie
Node.connect :"super_duper_app@127.0.0.1"
> true
:observer.start

启动观察器后,从“节点”菜单中选择机器。

可能的挫折

如果您尝试过此方法但没有成功,则可以检查以下几项内容:

  1. 检查本地计算机上的EPMD端口是否空闲,如果没有,请使用该端口终止进程并释放它。
  2. 检查ssh隧道密钥和配置的权限。正如@Roberto Aloi指出的那样,此链接可能有用:https://unix.stackexchange.com/questions/14160/ssh-tunneling-error-channel-1-open-failed-administratively-prohibited-open