【问题标题】:Can't connect to Rails server running on EC2 from public IP无法从公共 IP 连接到 EC2 上运行的 Rails 服务器
【发布时间】:2015-04-27 23:09:38
【问题描述】:

我最近遇到了我的 AWS EC2 实例的问题。问题是我无法通过公共 IP 访问我的 Rails 服务器,但我可以访问 localhost 并且服务器会响应。

这就是我正在做的事情:

  • 创建新的 EC2 实例(t2.micro,ubuntu 免费层)
  • 安全组的端口 22、80、3000 对所有人开放 (0.0.0.0)
  • SSH到EC2实例,安装rails(我一直用this安装)
  • 安装后启动 rails 服务器,它在 3000 端口上运行
  • 运行“wget localhost:3000”,它会返回 index.html,耶!
  • 进入我的网页浏览器,输入EC2实例公网IP和端口3000(IP:3000),提示无法连接:(
  • kill rails 服务器,在 80 端口重启,wget 工作,但无法通过公网 IP 连接
  • 作为一个健全性检查,我安装了 nginx 并运行它,并且可以通过公共 IP 在端口 80 上看到 nginx 起始页......好困惑......

所以我认为这与我安装 Rails 的方式有关,但我尝试了使用该安装脚本以外的方法,但遇到了同样的问题......我什至尝试过创建一个完全新的 AWS 账户以防万一我搞砸了我原来账户中的设置但没有任何运气。我以前能够让 Rails 在 EC2 实例上运行得很好(事实上,我现在有使用相同安全组的 EC2 实例在我的 AWS 账户上运行,并且可以很好地访问这些公共 IP),但现在我只是在敲我的头靠墙...任何帮助将不胜感激!

编辑:现在,我已经将 nginx 配置为访问我的 Rails 服务器......至少现在可以使用......虽然我仍然很好奇为什么我不能直接访问我的 Rails 服务器......

【问题讨论】:

  • 您可能还需要打开 Ubuntu 的防火墙以允许端口 80 和/或 3000。serverfault.com/questions/574491/opening-port-80-on-ubuntu-aws
  • 我运行了ufw status,它说它处于非活动状态。 iptables -L的输出如下:root@ip-172-31-3-171:/home/ubuntu/blah# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:http

标签: ruby-on-rails amazon-web-services amazon-ec2


【解决方案1】:

检查rails是监听0.0.0.0还是127.0.0.1,默认只监听localhost。

-b, --binding=IP                 Binds Rails to the specified IP.
                                 Default: localhost

来自Ruby on Rails 4.2 Release Notes

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

【讨论】:

  • 运行bundle exec rails server -b 0.0.0.0实际上解决了我的问题!现在我可以在不使用 nginx 的情况下很好地访问我的服务器......在最近发布的 Rail 中,默认绑定是否发生了变化?一周前我没有这个问题...
  • 这在前一段时间有变化吗?我不记得我之前必须设置此选项。
【解决方案2】:

如果您正在使用“rails server”并希望使用默认端口 3000,请使用以下端口:

sudo rails server -b 0.0.0.0

可以通过http://[public_ip]:3000访问。

如果您想将其用作没有端口的 URL,请使用以下命令运行服务器:

sudo rails server -p 80 -b 0.0.0.0

您只需以http://[public_ip] 的身份访问它。

【讨论】:

    【解决方案3】:

    我在我的 AWS Ubuntu 实例上的默认端口 3000 上运行 rails 服务器,并在安全组的入站部分允许此端口,但我仍然无法使用此端口访问我的应用程序。
    http://public_ip:3000

    我搜索了很多,这 answer 帮助了我。解释答案。我们必须使防火墙设置灵活,以便我们的防火墙允许端口 3000。

    您可以使用此命令检查防火墙是否允许此端口。

    $ sudo iptables -L | grep :3000
    

    如果您什么也没看到,则意味着我们必须允许使用此命令。

    $ sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT
    

    这对我来说可以让我的 rails 应用程序访问端口 3000。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2017-01-25
      • 2017-10-07
      • 2017-05-21
      • 2017-01-22
      • 2018-12-01
      相关资源
      最近更新 更多