2016-09-21 6 views
2

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

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

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

Может кто-нибудь указать мне в правильном направлении? Нужно ли мне как-то добавлять пользовательского слушателя Cowboy?

Я бы предпочел не запускать Nginx перед прослушиванием трафика IPv6.

Config Я пробовал:

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 {:phoenix, "~> 1.2.0"} и Ковбой {:cowboy, "~> 1.0"}

+0

Вы пытались что-то вроде '[::]: 4000'? См. [RFC 5952, раздел 6 «Примечания по объединению адресов IPv6 с номерами портов») (https://tools.ietf.org/html/rfc5952#section-6). –

+0

Спасибо за предложение, однако он не может разобрать целое число. Я обновлю вопрос с помощью немного дополнительной информации, включая трассировку стека. – TalkLittle

+0

Во-первых, приложение должно поддерживать IPv6. Похоже, что этого приложения нет. Свяжитесь со своим разработчиком (-ами). –

ответ

3
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 как «IPv6-IPv6-адрес».

Формат IP-кортежа - тип Erlang inet:ip6_address().

Смежные вопросы