如何让 Phoenix 监听 IPv6?
How to get Phoenix to listen on IPv6?
我正在努力寻找有关让 Phoenix(以及 Cowboy 和 Ranch 就此而言)同时侦听 IPv4 和 IPv6 的信息。
我运行正在 VPS 上 Ubuntu 16.04。它同时具有 IPv4 和 IPv6 地址。
当 运行ning netstat -tulpn
显示 beam
仅在 IPv4 上侦听,端口在 Phoenix 配置中指定。
而其他进程,如 epmd
,能够同时侦听 IPv4 和 IPv6。
我尝试在我的 config.exs
中指定像 "::4000"
这样的端口,但由于无法解析为整数而崩溃。
有人能指出我正确的方向吗?我需要以某种方式添加自定义 Cowboy 侦听器吗?
我宁愿不必 运行 Nginx 在前面监听 IPv6 流量。
我试过的配置:
config :my_app, MyApp.Endpoint,
http: [port: "[::]:4000"]
堆栈跟踪(看起来 Phoenix 只需要一个整数端口):
** (Mix) Could not start application my_app: MyApp.start(:normal, []) returned an error: shutdown: failed to start child: MyApp.Endpoint
** (EXIT) shutdown: failed to start child: Phoenix.Endpoint.Server
** (EXIT) an exception was raised:
** (ArgumentError) argument error
:erlang.binary_to_integer("[::]:4000")
(phoenix) lib/phoenix/endpoint/server.ex:32: Phoenix.Endpoint.Server.to_port/1
(phoenix) lib/phoenix/endpoint/server.ex:28: Phoenix.Endpoint.Server.default/3
(phoenix) lib/phoenix/endpoint/server.ex:17: anonymous fn/5 in Phoenix.Endpoint.Server.init/1
(elixir) lib/enum.ex:1623: Enum."-reduce/3-lists^foldl/2-0-"/3
(phoenix) lib/phoenix/endpoint/server.ex:15: Phoenix.Endpoint.Server.init/1
(stdlib) supervisor.erl:294: :supervisor.init/1
(stdlib) gen_server.erl:328: :gen_server.init_it/6
(stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
这也是凤凰{:phoenix, "~> 1.2.0"}
和牛仔{:cowboy, "~> 1.0"}
config :my_app, MyApp.Endpoint,
http: [port: 4000, ip: {0, 0, 0, 0, 0, 0, 0, 0}]
这告诉 Phoenix 监听所有 IPv6 地址。它还在 IPv4 上侦听。
我最初认为这只是 IPv6,因为 netstat -tulpn
显示 beam
只有 tcp6
而不是 tcp
。但经过测试,很明显它也在 IPv4 上作为 "IPv4-mapped IPv6 address."
监听
IP 元组格式为 Erlang 类型 inet:ip6_address()。
根据 https://hexdocs.pm/phoenix/endpoint.html,您也可以只使用 :inet6
。这对我有用:
config :my_app, MyApp.Endpoint,
http: [:inet6, port: 4000],
我正在努力寻找有关让 Phoenix(以及 Cowboy 和 Ranch 就此而言)同时侦听 IPv4 和 IPv6 的信息。
我运行正在 VPS 上 Ubuntu 16.04。它同时具有 IPv4 和 IPv6 地址。
当 运行ning netstat -tulpn
显示 beam
仅在 IPv4 上侦听,端口在 Phoenix 配置中指定。
而其他进程,如 epmd
,能够同时侦听 IPv4 和 IPv6。
我尝试在我的 config.exs
中指定像 "::4000"
这样的端口,但由于无法解析为整数而崩溃。
有人能指出我正确的方向吗?我需要以某种方式添加自定义 Cowboy 侦听器吗?
我宁愿不必 运行 Nginx 在前面监听 IPv6 流量。
我试过的配置:
config :my_app, MyApp.Endpoint,
http: [port: "[::]:4000"]
堆栈跟踪(看起来 Phoenix 只需要一个整数端口):
** (Mix) Could not start application my_app: MyApp.start(:normal, []) returned an error: shutdown: failed to start child: MyApp.Endpoint
** (EXIT) shutdown: failed to start child: Phoenix.Endpoint.Server
** (EXIT) an exception was raised:
** (ArgumentError) argument error
:erlang.binary_to_integer("[::]:4000")
(phoenix) lib/phoenix/endpoint/server.ex:32: Phoenix.Endpoint.Server.to_port/1
(phoenix) lib/phoenix/endpoint/server.ex:28: Phoenix.Endpoint.Server.default/3
(phoenix) lib/phoenix/endpoint/server.ex:17: anonymous fn/5 in Phoenix.Endpoint.Server.init/1
(elixir) lib/enum.ex:1623: Enum."-reduce/3-lists^foldl/2-0-"/3
(phoenix) lib/phoenix/endpoint/server.ex:15: Phoenix.Endpoint.Server.init/1
(stdlib) supervisor.erl:294: :supervisor.init/1
(stdlib) gen_server.erl:328: :gen_server.init_it/6
(stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
这也是凤凰{:phoenix, "~> 1.2.0"}
和牛仔{:cowboy, "~> 1.0"}
config :my_app, MyApp.Endpoint,
http: [port: 4000, ip: {0, 0, 0, 0, 0, 0, 0, 0}]
这告诉 Phoenix 监听所有 IPv6 地址。它还在 IPv4 上侦听。
我最初认为这只是 IPv6,因为 netstat -tulpn
显示 beam
只有 tcp6
而不是 tcp
。但经过测试,很明显它也在 IPv4 上作为 "IPv4-mapped IPv6 address."
IP 元组格式为 Erlang 类型 inet:ip6_address()。
根据 https://hexdocs.pm/phoenix/endpoint.html,您也可以只使用 :inet6
。这对我有用:
config :my_app, MyApp.Endpoint,
http: [:inet6, port: 4000],