【问题标题】:Hooking up into running heroku phoenix application连接到正在运行的 heroku phoenix 应用程序
【发布时间】:2021-06-11 22:08:06
【问题描述】:

前一天晚上我在家里的两台机器上修改 Elixir 运行代码,但是当我醒来时,我问自己我真的可以使用heroku run 命令做同样的事情吗?

我认为理论上如果设置正确应该是完全可能的。显然heroku run iex --sname name 执行并允许我访问 shell(没有功能的退格键,这很烦人),但我还没有访问我的应用程序。

每次我执行命令时,它都会给我不同的机器。我想这就是 Heroku 实现沙盒的方式。我还试图找到一种方法来确定我的应用程序机器的地址,但还没有运气。

我是否可以像在本地执行 iex -S mix phoenix.server 那样与运行代码的测功机连接以评估其上的表达式?

【问题讨论】:

  • 不清楚你的问题是什么,你能编辑一下让它更清楚吗?
  • 谢谢,我想我在回答中解决了你的问题
  • 我不是这个意思。我不想通过 http 协议进行通信。我想以相同的方式连接到它 erlang 机器相互连接以进行合作。
  • 我可能误解了您的问题(仍在学习 Elixir),但一次性 dyno 彼此之间被防火墙隔离,因此任何类型的进程间通信都不起作用。

标签: heroku elixir distributed-computing phoenix-framework


【解决方案1】:

很遗憾,这是不可能的。 要互连 Erlang VM 节点,您需要打开 EPMD 端口 (4369)。 Heroku 不允许打开自定义端口,因此这是不可能的。
如果您想在 Phoenix 服务器和 Elixir 节点之间建立连接,您必须:

同一台机器上的两个节点:

  1. 使用iex --name phoenix@127.0.0.1 -S mix phoenix.server 启动 Phoenix
  2. 开始iex --name other_node@127.0.0.1
  3. 使用来自 other_node 的 Node.ping 建立连接:
    iex(other_node@127.0.0.1)1> Node.ping(:'phoenix@127.0.0.1')
    (应该返回 :pong 而不是 :pang

不同机器上的两个节点

  1. 使用一些外部地址启动 Phoenix
    iex --name phoenix@195.20.2.2 --cookie someword -S mix phoenix.server
  2. 启动第二个节点
    iex --name other_node@195.20.2.10 --cookie someword
  3. 使用来自 other_node 的 Node.ping 建立连接:
    iex(other_node@195.20.2.10)1> Node.ping(:'phoenix@195.20.2.2')
    (应该返回 :pong 而不是 :pang

两个节点应该通过他们通常在网络上看到的地址相互联系。 (不同网络时完整的外部IP,192.168.X.X在同一本地网络,127.0.0.1在同一机器上)

如果它们在不同的机器上,它们也必须设置相同的 cookie 值,因为默认情况下它会在您的主目录中自动生成 cookie。你可以通过运行来查看它:
cat ~/.erlang.cookie

最后你必须确保你的 EPMD 端口4369 是打开的,因为 Erlang VM 使用它进行节点间数据交换。 作为旁注,如果您将其保持打开状态,请确保您的 cookie 尽可能私密,因为如果有人知道它,他就可以对您的机器拥有绝对的权力。

【讨论】:

  • 如果我有窗户怎么办?我如何检查那个 cookie?
  • 通常在C:/Windows/.erlang.cookieC:/.erlang.cookie 下。但实际上你不需要知道它。您可以使用命令行参数设置两者
  • 我不需要,但我想知道。
【解决方案2】:

当您执行heroku run 时,它将启动一个新的one-off dyno,这是一个临时实例,在您完成heroku run 会话时将被取消配置。此测功机不是网络测功机,无法通过 Heroku 的路由层接收入站 HTTP 请求。

来自文档:

One-off dynos can never receive HTTP traffic, since the routers only route traffic to dynos named web.N.

https://devcenter.heroku.com/articles/one-off-dynos#formation-dynos-vs-one-off-dynos

如果您希望 phoenix 应用程序接收 HTTP 请求,您必须将其设置为在 Web dyno 上运行。

【讨论】:

    【解决方案3】:

    您已经有一段时间没有提出这个问题了,但有人可能会觉得这个答案很有价值。

    从 2021 年起,Heroku 允许转发多个端口,这允许 remsh 进入正在运行的 ErlangVM 节点。这取决于您如何部署应用程序,但一般来说,您需要:

    1. 为您的节点命名和 cookie(即--name "myapp@127.0.0.1" --cookie "secret"
    2. 准确告诉节点应该绑定到哪个端口,这样您就知道要转发哪个端口(即--erl "-kernel inet_dist_listen_min 9000 -kernel inet_dist_listen_max 9000"
    3. 通过运行heroku ps:forward 9001:4369,9000 转发 EPMD 和节点端口
    4. Remsh 进入您的节点:ERL_EPMD_PORT=9001 iex --cookie "secret" --name console@127.0.0.1 --remsh "myapp@127.0.0.1"

    最终你应该用这样的东西来启动你的服务器(如果你还在使用 Mix 工具):MIX_ENV=prod elixir --name "myapp@127.0.0.1" --cookie "secret" --erl "-kernel inet_dist_listen_min 9000 -kernel inet_dist_listen_max 9000" -S mix phx.server --no-halt

    如果您使用的是 Releases,Elixir 团队已经为您完成了大部分设置。

    要验证 EPMD 端口是否已正确转发,请尝试运行 epmd -port 9001 -names。输出应该是:

    epmd: up and running on port 4369 with data:
    name myapp@127.0.0.1 at port 9000
    

    你可以按照我的笔记来了解我如何为 Dockerized 版本做这件事(还有一点忙):https://paveltyk.medium.com/elixir-remote-shell-to-a-dockerized-release-on-heroku-cc6b1196c6ad

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-04
      • 2015-09-24
      • 2017-05-22
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 2018-10-21
      相关资源
      最近更新 更多