通过 public IP 将 erlang observer 连接到远程机器
Connecting erlang observer to remote machine via public IP
背景
我有一台生产中的机器 运行正在使用 elixir 应用程序(无法访问 iex,只能访问 erl),我的任务是 运行ning 分析我们为什么消耗这么多CPU。这里的想法是启动观察器,检查进程选项卡并查看减少最多的进程。
我如何连接?
要连接,我正在遵循博客中的教程:
他们的使用说明如下:
- 使用 cookie 和名称在生产机器中启动应用程序
- 从本地运行:
ssh user@public_ip "epmd -names"
获取应用的名称和使用的端口
- 从本地创建到远程机器的ssh隧道:
ssh -L 4369:user@public_ip:4369 -L 42877:user@public_ip:42877 user@public_ip
(4369默认是epmd端口,42877是app的端口)
- 使用节点名称从本地连接到远程计算机:
erl -name "user@app_name" -setcookie "mah_cookie" -hidden -run observer
问题
现在理论上我应该可以在机器上使用观察器了。相反,我遇到了以下错误:
Protocol ‘inet_tcp’: register/listen error: 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
其中:
- 二郎
-name
: my_app_name
- 机器用户:flame
- 机器publicip:99.999.99.999(显然不是真实的)
所以它告诉我,未知主机??我很困惑,因为 99.999.99.999 是机器本身的 public IP!
问题
- 我做错了什么?
- 我读到在旧版本的 erlang 中,如果它们在不同的网络中,我无法使用观察器监视一台机器(是这种情况,因为我想从我的本地主机监视这台机器)但我没有在现代查找有关此的任何信息。
- 如果这实际上是不可能的,我有什么选择?
解决方案
经过 3 天的不停搜索,我终于找到了一些有用的东西。
总而言之,我把我所做的一切都放在这里。
本地机器中的所有步骤:
- 从远程服务器获取端口:
> ssh remote-user@remote-ip "epmd -names"
epmd: up and running on port 4369 with data:
name super_duper_app at port 43175
- 使用以下端口创建 ssh 隧道:
ssh remote-user@remote-ip -L4369:localhost:4369 -L43175:localhost:43175
- 在您本地计算机的另一个终端上,运行 一个 iex 终端,其中包含远程服务器中的应用正在使用的 cookie。然后连接到它并启动观察者:
iex --name observer@127.0.0.1 --cookie super_duper_cookie
Node.connect :"super_duper_app@127.0.0.1"
> true
:observer.start
启动观察器后,select 节点菜单中的机器。
可能的挫折
如果您已经尝试过但没有成功,您可以检查以下几点:
- 检查您本地计算机上的 EPMD 端口是否空闲,如果没有,则终止使用它的进程并释放它。
- 检查您的 ssh 隧道密钥和配置的权限。正如@Roberto Aloi 指出的那样 link 可能很有用:https://unix.stackexchange.com/questions/14160/ssh-tunneling-error-channel-1-open-failed-administratively-prohibited-open
背景
我有一台生产中的机器 运行正在使用 elixir 应用程序(无法访问 iex,只能访问 erl),我的任务是 运行ning 分析我们为什么消耗这么多CPU。这里的想法是启动观察器,检查进程选项卡并查看减少最多的进程。
我如何连接?
要连接,我正在遵循博客中的教程:
他们的使用说明如下:
- 使用 cookie 和名称在生产机器中启动应用程序
- 从本地运行:
ssh user@public_ip "epmd -names"
获取应用的名称和使用的端口 - 从本地创建到远程机器的ssh隧道:
ssh -L 4369:user@public_ip:4369 -L 42877:user@public_ip:42877 user@public_ip
(4369默认是epmd端口,42877是app的端口) - 使用节点名称从本地连接到远程计算机:
erl -name "user@app_name" -setcookie "mah_cookie" -hidden -run observer
问题
现在理论上我应该可以在机器上使用观察器了。相反,我遇到了以下错误:
Protocol ‘inet_tcp’: register/listen error: 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
其中:
- 二郎
-name
: my_app_name - 机器用户:flame
- 机器publicip:99.999.99.999(显然不是真实的)
所以它告诉我,未知主机??我很困惑,因为 99.999.99.999 是机器本身的 public IP!
问题
- 我做错了什么?
- 我读到在旧版本的 erlang 中,如果它们在不同的网络中,我无法使用观察器监视一台机器(是这种情况,因为我想从我的本地主机监视这台机器)但我没有在现代查找有关此的任何信息。
- 如果这实际上是不可能的,我有什么选择?
解决方案
经过 3 天的不停搜索,我终于找到了一些有用的东西。 总而言之,我把我所做的一切都放在这里。
本地机器中的所有步骤:
- 从远程服务器获取端口:
> ssh remote-user@remote-ip "epmd -names"
epmd: up and running on port 4369 with data:
name super_duper_app at port 43175
- 使用以下端口创建 ssh 隧道:
ssh remote-user@remote-ip -L4369:localhost:4369 -L43175:localhost:43175
- 在您本地计算机的另一个终端上,运行 一个 iex 终端,其中包含远程服务器中的应用正在使用的 cookie。然后连接到它并启动观察者:
iex --name observer@127.0.0.1 --cookie super_duper_cookie
Node.connect :"super_duper_app@127.0.0.1"
> true
:observer.start
启动观察器后,select 节点菜单中的机器。
可能的挫折
如果您已经尝试过但没有成功,您可以检查以下几点:
- 检查您本地计算机上的 EPMD 端口是否空闲,如果没有,则终止使用它的进程并释放它。
- 检查您的 ssh 隧道密钥和配置的权限。正如@Roberto Aloi 指出的那样 link 可能很有用:https://unix.stackexchange.com/questions/14160/ssh-tunneling-error-channel-1-open-failed-administratively-prohibited-open