Я изо всех сил пытаюсь найти информацию о том, как заставить Phoenix (и Cowboy и 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"}
[::]:4000
? См. RFC 5952, раздел 6, Примечания по комбинированию адресов IPv6 с номерами портов. - person Ron Maupin   schedule 21.09.2016