连接到运行heroku凤凰应用程序

时间:2016-03-05 10:08:35

标签: heroku elixir distributed-computing phoenix-framework

前一天晚上,我在家里的两台机器上修补Elixir运行代码,但是当我醒来时,我问自己我可以使用heroku run命令实际执行相同操作吗?

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

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

我是否可以实际连接运行代码的dyno来评估表达式,就像在本地执行iex -S mix phoenix.server一样?

3 个答案:

答案 0 :(得分:3)

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

同一台计算机上的两个节点:

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

    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
    4. 两个节点应该在他们通常在网络上看到的地址上相互联系。 (不同网络时的完整外部IP,192.168.X.X在同一本地网络时,127.0.0.1在同一台计算机上时

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

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

答案 1 :(得分:0)

执行heroku run时,它将启动一个新的one-off dyno,这是一个在完成One-off dynos can never receive HTTP traffic, since the routers only route traffic to dynos named web.N.会话后取消配置的临时实例。此dyno不是Web dyno,无法通过Heroku的路由层接收入站HTTP请求。

来自文档:

{{1}}

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

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

答案 2 :(得分:0)

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

截至 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. 重新进入您的节点: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