【问题标题】:How do I make my ruby on rails app respond to external requests (visible to the public on the internet)?如何让我的 ruby​​ on rails 应用程序响应外部请求(互联网上对公众可见)?
【发布时间】:2014-03-13 03:35:23
【问题描述】:

问题: 我的 rails 应用程序(在我的本地机器上)只响应从同一台机器发送到 localhost、127.0.0.1 或我的内部 IP 地址的请求。当我尝试使用我的互联网 IP 或从我的网络内部或外部的任何其他机器上点击它时,它只是超时。我在 Mac OS 10.9.1、ruby 1.9.3、rails 4.0.0 上。

我已经做了很多搜索,但我只能找到人们没有转发他们的端口或绑定正确的 ip 的问题。

以下是我调查过的领域:

端口 - 我尝试了几个不同的端口。我将路由器配置为转发我尝试过的每个端口,但得到了相同的结果。我想也许路由器有问题,所以我用 Java 构建了一个简单的服务器,并绑定了我与我的 rails 应用程序绑定的所有相同端口。果然,当我使用我的互联网 IP 访问 Java 应用程序时,它工作得很好,所以路由器/防火墙/端口转发不是问题。此外,我在端口 80 上运行了一个 apache 服务器,并且从未出现任何问题。我关闭了 apache 并为我的 rails 应用尝试了端口 80,但这并没有解决问题。

Rails 服务器 - 我从 WEBrick 开始,我想也许里面有一些设置阻止了外部请求。我广泛搜索了谷歌,并没有发现任何关于这件事的信息。为了安全起见,我安装了 Thin 并得到了与 WEBrick 完全相同的结果。一件有趣的事情是,当 Rails 服务器启动时,外部请求需要很长时间才能超时,但服务器控制台根本没有显示任何输出。但是,如果我尝试在不启动服务器的情况下发送相同的请求,它会立即失败。

用户权限 - 我用 root 启动了服务器(我在这里开始只是在黑暗中拍摄),它没有任何效果。

环境 - 我最初是在开发环境中开始的,因为我正在开发,但只是为了好玩,我尝试从生产环境开始,它也没有任何区别。

请帮助我聪明的人

更新: 我在我的 Ubuntu 机器上安装了该应用程序,它没有这个问题!所以这表明问题可能与 Mac OS 有关。

已解决: 事实证明,在 Mac OS 的 System Preferences -> Security & Privacy -> Firewall 中,它以某种方式设置为阻止与 Ruby 1.9.3 的传入连接。我一定是前一段时间不小心设置的。

【问题讨论】:

  • 您需要永久解决方案吗?你想用它做什么?
  • 是的,永久解决方案会更好。我正在开发一些服务,而其他人正在开发客户端,从任何地方都能看到它肯定会很方便。即使不可能,我也想了解请求被丢弃/忽略的位置。
  • 很高兴您解决了您的问题!感谢分享您的解决方案。

标签: ruby-on-rails ruby networking external public


【解决方案1】:

对于任何本地服务器,您都需要在防火墙上正确配置端口转发。正如 CaptChrisD 所说,测试必须由外部 IP/浏览器完成(如果您拥有服务器,ssh 在上面,然后w3m 进行测试)。

我已经有同样的症状(服务器启动 => 超时,服务器停止 => 失败)并且起源是防火墙配置的问题。我认为这是你的问题。

使用 MacOS,Pow 真的很棒:安装简单,无需配置(无需 /etc/hosts...)。此外,它们为您提供external access to your virtualhosts 的钩子(但您仍然需要在防火墙上进行端口转发)。

否则,还有其他解决方案,如Forward,无需防火墙配置(30 天免费试用)。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    这可能是相关的:Rails 3.1 on Ubuntu 11.10 under VirtualBox very slow

    您提到的缓慢与 webrick 的使用相结合,让我觉得您遇到了一些反向 DNS 查找的糟糕情况。快速的第一步是破解 /etc/hosts 以绕过此查找。

    我在 Ubuntu 上处理的情况在短期内通过入侵 /etc/hosts 得到了解决。您可以执行此快速破解,以查看它是否确实只是 webrick 的反向 DNS 查找。编辑 /etc/hosts 并为外部用户的 IP 地址添加一行,如下所示:

    156.123.48.55 TestPerson
    

    将 IP 地址替换为测试仪的 IP 地址。既然你说你可以让外部请求访问 Apache 服务器的 80 端口,你可以在必要时从 Apache 访问日志中获取他们的 IP 地址,否则只需询问测试人员。

    您也可以尝试使用其他网络服务器,例如 unicorn,这可能会有所帮助。将“gem unicorn-rails" 添加到您的 Gemfile,运行 bundle install,然后(根据他们的文档),rails server 将直接使用独角兽。

    【讨论】:

    • 就像我提到的,我已经尝试过 Thin,但继续尝试 Unicorn 也无济于事。主机文件技巧也没有为我做任何事情,但感谢您提出一些我尚未尝试过的建议。
    • 当,听起来和我之前的问题很相似。对不起,我帮不上忙:(
    【解决方案3】:

    问题是您可能正在尝试从本地计算机(或本地网络上的任何计算机,防火墙后面的计算机)请求页面到您的公共 IP 期望结果......除非您设置通过防火墙的路由这个(通常在消费级路由器上不可用...linksys、dlink 等)

    如果您使用 pow 之类的东西,请转发端口 80,或者将 3000 用于网络积木默认端口到您的本地计算机

    然后让本地局域网以外的人请求您的外部(公共)IP

    【讨论】:

    • 好主意,但这不是问题所在。我可以使用公共 ip 从本地网络很好地访问我的 apache 服务器。另外,可以肯定的是,我确实有一个朋友请求了 rails 页面(他正在开发客户端)并且他得到了相同的结果。
    猜你喜欢
    • 2015-09-20
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2015-08-30
    • 2016-04-10
    • 2020-09-20
    • 2010-12-28
    • 2013-07-23
    相关资源
    最近更新 更多