Ruby on rails 为什么Puma仅与tcp6结合?(通过“rails s”)

Ruby on rails 为什么Puma仅与tcp6结合?(通过“rails s”),ruby-on-rails,ipv6,puma,Ruby On Rails,Ipv6,Puma,全新生成的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

全新生成的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中,运行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-btcp://0.0.0.0:3000
有效。但是,将bind指令添加到config/puma.rb并运行
rails s
不会:

bind 'tcp://0.0.0.0:3000'
然而,我的配置文件中的threads/workers指令正在工作,因此我知道配置文件正在被加载和使用。(为了确保这一点,我们甚至添加了puts语句。)

如果我只运行
puma
,绑定到正确的接口,配置文件甚至会被拾取。我可能不得不求助于运行
puma
,而不是
rails
,尽管这很烦人,必须添加到我的开发者文档中

更新2:

我错了。运行rails s不会自动选择config/puma.rb。仍在调查…

运行轨道,如:

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

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

2016年7月18日,该患者接受了治疗。在当前版本中,专门为
localhost
设置了一个例外,它现在绑定到IPv4和IPv6解析


对于所有其他域,Puma仍将绑定到系统名称解析返回的第一个IP地址。在这些情况下,您至少可以通过向
/etc/hosts

添加适当的条目来选择Puma是绑定到IPv4还是IPv6解决方案这对我来说不再是问题,因为我决定使用
Puma
来运行rails应用程序,而不是
rails s
,这使得一切都能正常工作——尽管我仍然认为这个问题应该得到解决。我必须切换到
puma
的原因是为了获取配置文件:另一个解决方案是,如果在apache/nginx反向代理后面使用此选项,则只需使用IPv6地址即可。对我来说,即使在运行此命令后,rails也会监听tcp://0.0.0.0:3000@迈克尔加湾,但这是意料之中的。它解决了OP的问题,即运行
rails s
仅在
tcp://:1:3000
上侦听(表示本地主机,但仅使用IPv6协议)。