【问题标题】:Binding a Rails server to port 80 on Linux without running it as root在 Linux 上将 Rails 服务器绑定到端口 80,而不以 root 身份运行
【发布时间】:2013-10-04 21:05:20
【问题描述】:

我正在尝试找到一种方法将我的生产 Rails 服务器绑定到端口 80,而不必以 root 权限运行整个服务器。我的问题与“Is there a way for non-root processes to bind to "privileged" ports (<1024) on Linux?”基本相同,只是我需要用 Rails 来做。目前,关于我引用的问题的前两个答案要么要求我向 Ruby 解释器授予 CAP_NET_BIND_SERVICE 权限(可能不是一个好主意),要么在启动服务器后放弃 root 权限(I'm not sure is possible with Ruby)。有什么想法吗?

【问题讨论】:

  • 您是否可以选择在 80 端口上运行传统的 Web 服务器并将请求转发到在另一个端口上运行的 Rails 服务器?例如,运行nginx 并将请求定向到在非特权端口上运行的thinunicorn
  • 您真正想要这样做的几率非常低。 Thin、Mongrel、Puma、Unicorn 或其他任何应该在正常使用模式下的非 Ruby 服务器后面。见this question
  • 是的,这是我第一次真正尝试自己部署生产应用程序,而无需其他人帮助我设置服务器,或者像 Heroku 这样的 PaaS;所以很有可能我不知道我想要什么。如果您愿意发布详细的答案,建议在端口 80 上绑定 Thin 的替代方法(如 Jim 在评论中所说的 nginx),我会接受这是一个有效的答案。

标签: ruby-on-rails ruby linux thin


【解决方案1】:

所以基本上,答案是你不知道。可能有一些非常老套的方法可以使这项工作,但你真正想要这样做的可能性非常低。相反,在非特权端口上运行 Rails,并设置一个像 nginx 这样的真实 Web 服务器来转发到 Rails。

作为一个超级简单的例子,对于 nginx,您可能会使用如下所示的配置文件:

upstream rails_server {
  server localhost:3000;
}

server {
  listen 80;

  location / {
    root /home/deploy_user/rails_app/public;
    try_files $uri @missing;
  }

  location @missing {
    proxy_pass http://rails_server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
  }
}

此解决方案也更适合长期使用,因为它使您的基础架构更加灵活。例如,如果您需要将应用程序扩展到多台机器,您可以使用 nginx 作为负载均衡器,并将请求转发到运行在不同机器上的一大堆 Rails 服务器。

【讨论】:

  • 这非常有效。包含 try_files 指令的奖励积分直接通过 nginx 为任何公共资产提供服务,而不是将其委托给 rails 服务器
猜你喜欢
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2023-03-25
相关资源
最近更新 更多