【问题标题】:Make Ruby on Rails application available within network使 Ruby on Rails 应用程序在网络中可用
【发布时间】:2014-09-26 14:53:52
【问题描述】:

所以我有一个使用 Ruby on Rails 4.0 开发的 Web 应用程序,可以在我的本地 PC 上通过 localhost:3000 访问(在我通过在应用程序根目录下的 cmd 中运行 rails s 来启动 Rails 服务器之后)。它具有中等复杂性,具有数据库交互(我使用 PostgreSQL)等。

现在,应用程序的实用程序为零,除非我可以使其在网络级别运行。我需要网络中的任何用户(最初是所有用户,然后我将限制对其中几个用户的可见性——我知道该怎么做)才能使用我的 IP 访问我的应用程序(类似于1.1.34.45/index ) 或者,最好是一个友好的名称,例如:myapp/index)

我想这可以通过进行一些快速调整来完成,但需要您指导如何更改以及更改内容,以便所有网络用户都可以访问我本地 PC 上找到的应用程序,就像我在我的 PC 上一样. 非常感谢提前

【问题讨论】:

  • 您需要在本地系统上配置您的nginx/apache2 服务器。 digitalocean.com/community/tutorials/…
  • 目的是什么?使应用程序的开发版本可用于用户测试(技术上,登台服务器),或发布生产级应用程序供内部使用?有不同的答案,取决于意图。我将在下面提供 an 答案,以使开发服务器在本地可用。还有... 本地 DNS 是什么?机器(包括您的)是否会意外更改 IP 地址?您将需要某种具有名称到 IP 映射的目录服务来确定您的服务器现在的位置。

标签: ruby-on-rails ruby postgresql


【解决方案1】:

要使开发应用程序可在有防火墙的业务环境中使用,请考虑使用 heroku 工具,尤其是“foreman”。您可以将工头配置为使用更快的网络服务器(独角兽是一个不错的选择,IMO),在端口 3000 或 500 或其他端口上运行......但是工头将需要保持运行,直到您杀死它。当你被杀时,你不提供任何服务。而且...运行时,它使用Rails“开发”模式。有些事情你可能在开发模式下做,而你不会在生产中做 - 例如。可选地使用 gem “better_errors”,这可能会帮助您跟踪和修复问题,但也意味着您的任何用户群也可以深入研究代码,在低级别更改数据库等 - 如果它们触发错误。如果您正确管理 Gemfile,则生产模式将无法访问开发者工具。

就我个人而言,我通过在我的源代码存储库中创建一个“暂存”分支,让其他用户可以使用某个应用的测试版本。然后,我在配置为生产使用的服务器上的该暂存分支中运行代码,但使用暂存分支而不是主分支。这样,我就可以向感兴趣的用户演示应用更改,而不会影响实时服务器或共享潜在风险的开发服务。

最基本的步骤?请注意,以下命令中的单引号和双引号之间存在显着差异。如果在 Procfile 行上使用双引号,您将让服务器从端口 3000 开始固定。使用单引号,您可以设置环境参数来配置它所在的端口 - 在尝试使用相同的配置过程时很有用在开发、登台和生产中。

安装heroku工具带

将“gem 'unicorn'”添加到您的 Gemfile:

echo "" >> Gemfile
echo "gem 'unicorn'" >> Gemfile

为工头设置 Procfile:

echo 'web: unicorn -c config/unicorn.rb -p ${PORT:=3000}' > Procfile

并设置独角兽配置文件​​:

cat > config.unicorn.rb << HERE
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true
before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|

  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end
HERE

然后运行foreman start 以在端口 3000 上获得线程更高性能的开发 Web 服务器。

准备就绪后,创建一个暂存分支,并设置一个更完整的暂存服务器。

但真正的问题...为什么不在 Heroku 这样的服务上运行它呢?如果您有任何类型的用户注册/登录过程,您可以控制访问。 Heroku 会很高兴地为您提供开发、登台和生产服务器。将数据保持在 10MB (IIRC) 以下,您可以免费使用。数据(可能是为了遵守法规)是否必须保留在本地网络的防火墙内?

【讨论】:

    【解决方案2】:

    也许你会发现有用的 proxylocal gem。

    “ProxyLocal 可以代理您的本地网络服务器并通过互联网公开提供。”

    Official site

    【讨论】:

      【解决方案3】:

      如果应用程序在localhost:3000 上可用,那么它也应该在1.1.34.45:3000 上可用。假设端口 3000 在您的本地 PC 上打开,1.1.34.45 是您当前在本地网络中的 IP 地址。

      请注意,Webbrick 服务器并不是您真正想在生产中使用的东西。但是对于测试,可以将该应用程序打开到您的本地网络。

      【讨论】:

      • 谢谢spickermann,它按你说的那样工作!现在,为什么不使用 Webbbrick 服务器呢?关于有什么更好的选择以及为什么的任何提示?
      • WEBrick 是出了名的慢 - 只加载单个文件/资产,这需要很长时间。这种有条不紊的加载过程有利于开发,但对于生产来说太慢了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 2011-05-15
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多