Rails 4.2.0.beta2 - 无法连接到本地主机?

5

我按照RailsTutorial.org第三版(刚刚发布的版本)的说明,安装了Rails 4.2.0.beta2。我没有使用cloudIDE,而是在Windows 7主机上通过Vagrant使用Ubuntu Trusty 32和RVM。

我运行了rails _4.2.0.beta2_ new hello_app,然后粘贴了他的gemfile示例

之后,我运行了:

$ bundle install
$ rails s

服务器启动正常,但是当我尝试连接到 localhost:3000 时,出现了“服务器未找到”的错误。

更奇怪的是,我还有其他几个Rails入门项目正在使用Rails 4.0.3和4.1.6,我可以很好地连接到那里的服务器。

我错过了什么?为什么我创建了一个新的Rails项目,并使用了最新版本,但浏览器无法连接,而旧版本却可以正常工作?

此外,我尝试了wget http://0.0.0.0:3000,虽然连接并接收到了200响应,但长度未指定,而在另一个全新的Rails应用程序下,我会得到任何index.html的实际文件大小。


1
你的主机是否将端口3000转发到Vagrant虚拟机?从技术上讲,它们是不同的机器,因此是不同的网络节点。如果没有,你可能会连接到错误的机器。 - D-side
是的,@D-side。客户环境中的其他项目都能够正常工作。这似乎与下面最高评分的回答有关,但现在正在尝试找到一个更简洁的解决方案。 - Haltingpoint
4个回答

17

关于无法访问的服务器,来自Rails 4.2 发布说明

3.3 rails server的默认主机

由于Rack的更改,rails server现在默认侦听localhost而不是0.0.0.0。对于标准开发工作流程,这应该对工作流程影响很小,因为您自己的机器上,http://127.0.0.1:3000http://localhost:3000仍将像以前一样工作。

但是,由于此更改,您将无法从其他计算机访问Rails服务器(例如,您的开发环境位于虚拟机中,您希望从主机机器访问它),您需要使用rails server -b 0.0.0.0启动服务器以恢复旧行为。

如果这样做,请确保正确配置防火墙,以使您网络上的可信任计算机才能访问您的开发服务器。

"

127.0.0.1:3000 只允许在 3000 端口上从该地址进行连接,而 0.0.0.0:3000 则允许从 任何 地址在 3000 端口上进行连接。

自 Rails 4.2 版本起,默认仅接受来自本地主机的连接,因此只能从本地主机(例如 VM 内部)访问服务器;来自其他机器(例如 VM 的主机)的连接将无法工作。

您必须使用上述“旧行为”方法才能允许来自 VM 主机的连接。

"
关于未指定的内容长度,这取决于所使用的Web服务器。我假设它正在使用分块编码,该编码不发送内容长度。资源将具有内容长度,但HTML没有。

感谢提供额外的信息。根据您的帖子和katafrakt之前的帖子,这似乎是问题所在。话虽如此,解决方法很麻烦。有没有什么快捷方式可以让我在执行rails s时默认执行rails s -b 0.0.0.0 - Haltingpoint
1
更新:看起来如果我编辑Rack的/lib/rack/server.rb文件以还原这个提交rails s就像正常一样工作。是否有一种“更安全”的方法来用我的实际项目文件夹或RVM内的某些内容覆盖此位?我感觉有点不好意思修改主Rack文件,而且我猜它很容易被覆盖。 - Haltingpoint
请参考这个问题,虽然它是针对Rails 3的。尝试使用Host而不是Port - Substantial
1
这实际上是一个非常好的安全功能,特别是对于喜欢在咖啡馆和其他公共场所工作的人来说。它确保当你的Rails应用程序在本地主机上运行时,没有其他人可以访问它。 - Adrien Lamothe

4
Rails 4.2默认绑定到127.0.0.1:3000,而不是早期版本的0.0.0.0:3000。如果您有其他在配置中工作的Rails项目,请尝试使用明确主机启动服务器:rails s -b 0.0.0.0

尝试使用 rails s -b 0.0.0.0 命令可以让我通过浏览器访问它。但是每次都要输入这个命令有点麻烦。在快速搜索中没有找到相关信息,是否有一种简单的方法可以更改此默认设置?或者,是否有任何方法可以从虚拟机内部访问 http://127.0.0.1:3000 - Haltingpoint
我不知道任何非hackish的方法来完成它。 - katafrakt

3

一位名叫tostasqb的人在GitHub上发布了一个非常有趣的解决方法,可以使旧版本的行为(Rails版本< 4.2)成为默认设置。

只需编辑您的config/boot.rb文件并添加以下行:

require 'rubygems'
require 'rails/commands/server'

module Rails
  class Server
    alias :default_options_alias :default_options
    def default_options
      default_options_alias.merge!(:Host => '0.0.0.0')
    end
  end
end

0

修改你的Gemfile文件,让它看起来像这样,并运行bundle update。你指定的版本是明确的。如果我没有粘贴你的Gemfile,新的hello_world对我有用。

gem 'rails', '~> 4.2.0.beta2'
gem 'pg'
gem 'bootstrap-sass', '~> 3.2.0'
gem 'sass-rails', '~> 5.0.0.beta1'
gem 'font-awesome-sass', '~> 4.2.0'
gem 'sprockets-rails', '~> 3.0.0.beta1'
gem 'coffee-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.0.3'

我在使用 'pg' gem 时遇到问题,而且当我尝试不使用它时,出现了与之前相同的问题。PG 给了我一堆看起来与 PostgreSQL 相关的错误。我原本计划使用 sqlite3。 - Haltingpoint
此外,可以推测Hartl在发布之前进行了测试,而其他人似乎能够按照他的说明顺利进行该步骤。因此,我很好奇你为什么认为明确的版本声明是问题所在,并且改变它并引入新的gems是解决方案... - Haltingpoint
如果未安装Postgres,请删除gem。 - markhorrocks
Gemfile 的整个理念是它可以通过 bundle 自己更新。我猜想 gem 冲突是你的问题所在。 - markhorrocks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接