前一天晚上,我在家里的两台机器上修补Elixir运行代码,但是当我醒来时,我问自己我可以使用heroku run
命令实际执行相同操作吗?
我认为理论上如果设置正确应该是完全可能的。显然heroku run iex --sname name
执行并让我访问shell(没有功能退格,这很烦人),但我还没有访问我的应用程序。
每次执行命令时,它都给了我不同的机器。我想这就是Heroku如何实现沙箱。我也试图找到一种方法来确定我的应用程序机器的地址,但还没有运气。
我是否可以实际连接运行代码的dyno来评估表达式,就像在本地执行iex -S mix phoenix.server
一样?
答案 0 :(得分:3)
不幸的是,这是不可能的。
要互连Erlang VM节点,您需要 EPMD端口(4369
)才能打开。
Heroku不允许打开自定义端口,因此无法实现
如果您想在Phoenix服务器和Elixir节点之间建立连接,您必须:
同一台计算机上的两个节点:
iex --name phoenix@127.0.0.1 -S mix phoenix.server
iex --name other_node@127.0.0.1
iex(other_node@127.0.0.1)1> Node.ping(:'phoenix@127.0.0.1')
:pong
而不是:pang
)不同计算机上的两个节点
iex --name phoenix@195.20.2.2 --cookie someword -S mix phoenix.server
iex --name other_node@195.20.2.10 --cookie someword
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尽可能私密,因为如果有人知道,他可以对你的机器拥有绝对的权力。
答案 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 节点。这取决于您如何部署应用程序,但一般而言,您需要:
--name "myapp@127.0.0.1" --cookie "secret"
)--erl "-kernel inet_dist_listen_min 9000 -kernel inet_dist_listen_max 9000"
)heroku ps:forward 9001:4369,9000
转发 EPMD 和节点端口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