Почему Puma привязывается только к tcp6? (через `рельсы`)

Совершенно новый сгенерированный проект Rails 4.2.0. Запустил rails s, вел себя, как и ожидалось, используя WEBrick:

vagrant@web1:~$ netstat -nlpt
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      27158/ruby2.1   
tcp6       0      0 ::1:3000                :::*                    LISTEN      27158/ruby2.1   

Добавил puma в Gemfile, запустил бандл, потом снова rails s; придумал Puma, но привязал только интерфейс tcp6, а не tcp:

vagrant@web1:~$ netstat -nlpt
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 ::1:3000                :::*                    LISTEN      27116/ruby2.1   

Любая подсказка, почему? Я безуспешно гуглил.

ОБНОВЛЕНИЕ:

Ходовая puma -b tcp://0.0.0.0:3000 работает. Однако добавление директивы bind в config/puma.rb и запуск rails s не приводит к:

bind 'tcp://0.0.0.0:3000'

Однако директивы threads/workers в моем файле конфигурации работают, поэтому я знаю, что файл конфигурации загружается и используется. (Даже добавлен оператор puts, чтобы быть уверенным.)

Файл конфигурации подхватывается, даже если я просто запускаю puma, привязываясь к правильному интерфейсу. Возможно, мне просто придется прибегнуть к запуску puma вместо rails s, хотя это раздражает и должно быть добавлено в мои документы разработчика.

ОБНОВЛЕНИЕ 2:

Я ошибался. Запуск rails s не вызывает config/puma.rb автоматически. Все еще расследуют...


person odigity    schedule 04.01.2015    source источник
comment
Это больше не проблема для меня, потому что я решил использовать puma для запуска приложения rails вместо rails s, что заставляет все работать, хотя я все еще думаю, что эта проблема должна быть исправлена. Причина, по которой я должен переключиться на puma, заключается в том, что файл конфигурации загружается: stackoverflow.com/questions/25225444/   -  person odigity    schedule 04.01.2015
comment
Другое решение, если вы используете это за обратным прокси-сервером apache / nginx, — просто использовать адрес IPv6.   -  person luismreis    schedule 25.07.2015


Ответы (2)


Ходовые рельсы, такие как:

rails s -b 0.0.0.0

работает на меня. Проблема в том, что «localhost» (адрес привязки по умолчанию) привязывается к IPv4 и IPv6, и v6 выбирается, если оба доступны. 0.0.0.0 принудительно использовать адрес IPv4 (также работает с 127.0.0.1).

person Fabien Sa    schedule 13.05.2016
comment
Для меня даже после запуска этой команды rails прослушивает tcp://0.0.0.0:3000 - person Michael Gabay; 29.10.2017
comment
@MichaelGabay Но это ожидаемо. Это решает проблему OP, заключающуюся в том, что запуск rails s прослушивает только tcp://::1:3000 (имеется в виду локальный хост, но только с использованием протокола IPv6). - person tanius; 08.12.2018

Проблема, которую вы видите, заключается в том, что Puma по умолчанию привязывается к localhost. Это было обработано базовым Rails TcpServer как обычное имя хоста и разрешено только к одному IP-адресу (версия IPv6 в вашем случае), но не к обеим версиям IPv4 и IPv6.

Это исправлено в выпуске Puma #782 и решено 18 июля 2016 г. с помощью этот патч. В текущих версиях сделано исключение специально для localhost, которое теперь привязывается как к разрешениям IPv4, так и к IPv6.

Для всех остальных доменов Puma по-прежнему будет привязываться к первому IP-адресу, возвращаемому системой разрешения имен. В этих случаях вы можете, по крайней мере, выбрать, хотите ли вы, чтобы Puma привязывалась к разрешению IPv4 или IPv6, добавив соответствующую запись в /etc/hosts.

person tanius    schedule 08.12.2018