代码之家  ›  专栏  ›  技术社区  ›  Flame_Phoenix

通过公共IP将Erlang Observer连接到远程计算机

  •  1
  • Flame_Phoenix  · 技术社区  · 6 年前

    背景

    我有一台生产中的机器正在运行一个elixir应用程序(不能访问iex,只能访问erl),我的任务是分析为什么我们要消耗这么多CPU。这里的想法是启动Observer,检查processes选项卡并查看具有最多缩减的流程。

    我怎么连接?

    要进行连接,我将从博客中学习以下教程:

    其说明如下:

    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

    问题

    从理论上讲,我应该可以在机器上使用观察者。然而,我收到的却是以下错误:

    协议__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. 二郎 -name MyAppAppNd
    2. 机器用户:火焰
    3. 机器公共IP:99.999.99.999(显然不是真实的)

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

    问题

    1. 我做错什么了?
    2. 我读到在旧版本的Erlang中,如果一台机器在不同的网络中,我就不能用观察器监视它(事实上,因为我想从本地主机监视这台机器),但在现代,我没有找到任何与此相关的信息。
    3. 如果这实际上是不可能的,我还有什么选择呢?
    1 回复  |  直到 6 年前
        1
  •  0
  •   Flame_Phoenix    6 年前

    解决方案

    经过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 tunel:

    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