如何让菲尼克斯监听IPv6



我正在努力寻找有关获得凤凰(以及牛仔和牧场)在IPv4和IPv6上侦听的信息。

我在VPS上运行Ubuntu 16.04。它有IPv4和IPv6地址。当运行netstat -tulpn时,显示beam只侦听IPv4,端口在Phoenix config中指定。而其他进程,如epmd,可以同时监听IPv4和IPv6。

我已经尝试在我的config.exs中指定一个端口,如"::4000",但由于无法解析为整数而崩溃。

谁能给我指个正确的方向?我是否需要以某种方式添加一个定制的Cowboy侦听器?

我宁愿不运行Nginx在前面听IPv6流量。

Config I tried:

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映射的IPv6地址"。

IP元组格式为Erlang类型inet:ip6_address()

根据https://hexdocs.pm/phoenix/endpoint.html,您也可以只使用:inet6

config :my_app, MyApp.Endpoint,
  http: [:inet6, port: 4000],

最新更新