为什么Puma只绑定到tcp6? (通过`rails s`)

时间:2015-01-04 17:47:41

标签: ruby-on-rails ipv6 puma

全新生成的Rails 4.2.0项目。 Ran 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   

向Gemfile添加puma,运行bundle,然后再次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指令正在工作,所以我知道配置文件正在加载和使用。 (甚至添加了一个put语句以确定。)

如果我只运行puma绑定到正确的接口,配置文件甚至会被接收。我可能只需要运行puma而不是rails s,即使它很烦人,也必须添加到我的开发人员文档中。

UPDATE2:

我错了。运行rails s不会自动获取config / puma.rb。还在调查......

2 个答案:

答案 0 :(得分:1)

像以下一样运行导轨:

rails s -b 0.0.0.0

适合我。问题是“localhost”(默认绑定地址)绑定在IPv4和IPv6上,如果两者都可用,则选择v6。 0.0.0.0强制使用IPv4地址(也适用于127.0.0.1)。

答案 1 :(得分:1)

您看到的问题是Puma默认绑定到localhost。基础的Rails TcpServer将其视为普通的主机名,并且只能解析为一个IP地址(在您的情况下为IPv6版本),而不能解析为IPv4和IPv6版本。

此问题于2016年7月18日在Puma issue #782solved中以this patch处理。在当前版本中,localhost专门有一个例外,它现在绑定到IPv4和IPv6分辨率。

对于所有其他域,Puma仍将绑定到系统名称解析返回的 first IP地址。在这些情况下,您至少可以通过向/etc/hosts添加适当的条目来选择是否要让Puma绑定到IPv4或IPv6分辨率。