Как заставить Феникса слушать IPv6?

Я изо всех сил пытаюсь найти информацию о том, как заставить Phoenix (и Cowboy and Ranch) слушать IPv4 и IPv6.

Я работаю на VPS с Ubuntu 16.04. Он имеет адреса IPv4 и IPv6. При беге netstat -tulpn это показывает, что beam прослушивает только IPv4 с портами, указанными в конфиге Phoenix. В то время как другие процессы, такие как epmd, в состоянии слушать как IPv4, так и IPv6.

Я пытался указать порт как "::4000" в моем config.exs, но он вылетает из-за невозможности разобрать как целое число.

Может ли кто-нибудь указать мне правильное направление? Нужно ли как-то добавить пользовательский слушатель 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"}

2 ответа

Решение
config :my_app, MyApp.Endpoint,
  http: [port: 4000, ip: {0, 0, 0, 0, 0, 0, 0, 0}]

Это говорит Фениксу прослушивать все адреса 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],
Другие вопросы по тегам