【问题标题】:Rails 4.2.0.beta2 - Can't connect to LocalHost?Rails 4.2.0.beta2 - 无法连接到 LocalHost?
【发布时间】:2014-12-21 15:08:34
【问题描述】:

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

做了rails _4.2.0.beta2_ new hello_app,然后粘贴到his gemfile sample

之后,我跑了:

$ bundle install
$ rails s

服务器启动正常,但是当我尝试连接到 localhost:3000 时,我得到“未找到服务器”

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

我在这里缺少什么?为什么我用最新版本创建了一个新的 Rails 项目时,我的浏览器无法连接,但它在旧版本上运行良好?

另外,我尝试了wget http://0.0.0.0:3000,当它连接并收到 200 响应时,长度未指定,而在旧版本下的另一个全新 Rails 应用程序中,我会得到 index.html 的实际文件大小.

【问题讨论】:

  • 您的主机是否将 3000 端口转发到您的 Vagrant 盒子?从技术上讲,这些是不同的机器,因此是不同的网络节点。如果没有,你就打错了机器。
  • 是的@D-side。来宾环境中的其他项目能够正常工作。这似乎主要与下面评分最高的响应有关,但现在正试图找到一个不那么笨重的解决方案。

标签: ruby-on-rails ruby ruby-on-rails-4 railstutorial.org ruby-on-rails-4.2


【解决方案1】:

一个名叫tostasqb 的人在github 上发布了一个非常有趣的解决方法,以使旧行为(Rails 版本

只需编辑您的 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

【讨论】:

    【解决方案2】:

    关于无法访问的服务器,来自 Rails 4.2 release notes

    3.3 rails 服务器的默认主机

    由于 Rack 的变化,rails 服务器现在默认侦听 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 默认只接受来自 localhost 的连接,因此您只能从 localhost 访问服务器(例如,在 VM 内部);来自另一台机器(例如 VM 的主机)的连接将无法正常工作。

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


    关于未指定的内容长度,这取决于使用的网络服务器。我假设它使用不发送内容长度的分块编码。资产有内容长度,但没有 HTML。

    【讨论】:

    • 感谢您提供更多信息。根据您的帖子和 katafrakt 之前的帖子,这似乎是问题所在。也就是说,解决方法是 PITA。当我做rails s时,默认情况下让它做rails s -b 0.0.0.0的任何快捷方式?
    • 更新:看起来如果我编辑 Rack 的 /lib/rack/server.rb 文件以恢复 this commit rails s 正常工作。是否有一种“更安全”的方法可以用我的实际项目文件夹或 RVM 中的内容覆盖此位?我觉得像这样修改主 Rack 文件有点脏,我猜它很容易被覆盖。
    • 请参阅this question,尽管它适用于 Rails 3。尝试使用 Host 而不是 Port
    • 这其实是一个非常不错的安全功能,特别适合那些喜欢在咖啡馆和其他公共场所工作的人。它确保在 localhost 上运行时没有其他人可以访问您的 Rails 应用程序。
    【解决方案3】:

    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 让我可以通过浏览器访问它。但是,每次都必须打字是一种痛苦。在快速谷歌搜索中找不到这个,但是有没有一种简单的方法来改变这个默认值?或者,有什么方法可以从 VM 内部访问http://127.0.0.1:3000
    • 我不知道有任何非骇客的方式来完成它。
    【解决方案4】:

    将您的 gemfile 修改为类似的内容并运行包更新。您指定的版本是明确的。如果我没有粘贴到您的 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。
    • 另外,大概是 Hartl 在发表之前测试了一些东西,其他人似乎能够在这一步很好地遵循他的指示。所以我很好奇为什么你认为明确的版本声明是问题,而改变这一点+引入新的宝石是解决方案......
    • 如果没有安装 Postgres,请移除 gem。
    • gemfile 的整个想法是它使自己与 bundle 保持同步。我只是猜测 gem 冲突是你的问题。
    猜你喜欢
    • 2017-06-12
    • 2016-11-05
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 2021-05-22
    • 2012-11-30
    相关资源
    最近更新 更多