【问题标题】:How to find the local port a rails instance is running on?如何找到运行 rails 实例的本地端口?
【发布时间】:2009-10-12 12:25:20
【问题描述】:

所以我希望我的 Rails 应用程序实例能够在我正在玩的“我起来了”之类的东西上注册自己,并且我希望它能够提及它正在运行的本地端口。我似乎不知道怎么做——事实上,仅仅找出它的 IP 是很棘手的,需要一点技巧。

但没问题,我有 IP - 但是我如何才能找到我的 mongrel/thin/webrick 服务器在哪个端口上运行?

非常明确地说,如果我使用 script/server -p 3001 启动一个 Rails 应用程序,我该怎么做才能将 3001 拉到应用程序中。

【问题讨论】:

  • 你把注册的代码放在哪里?
  • 我希望它在初始化程序中,但无论如何它可能是真的。重要的是它能够向另一台机器宣布自己 - “嗨,我是在端口 #{PORT} 上启动的” - 其中端口可以是任何东西。基本上,Rails 相当于 Sinatra::Application.port。
  • 大多数主机名问题的答案也回答了这个问题:stackoverflow.com/questions/42566/…

标签: ruby-on-rails ruby


【解决方案1】:

您可以调用Rails::Server.new.options[:Port] 来获取运行Rails 服务器的端口。这将解析来自您的rails server 命令的-p 3001 参数,或默认为端口3000

【讨论】:

  • 这将在初始化程序中起作用,因为它不依赖于请求对象。
  • (rdb:1) Rails::Server *** NameError Exception: uninitialized constant Rails::Server
  • 在新版本的 Rails 中尝试Rack::Server.new.options[:Port]
  • Rack::Server.new.options[:Port] 总是返回 9292
  • 我发现 Rack::Server.new.options[:Port] 如果使用“-p”选项(Rails 5.1.1)指定,则返回端口。
【解决方案2】:

从任何控制器动作内部,检查 request.port 的内容,因此:

class SomeController < ApplicationController
  def some_action
    raise "I'm running on port #{request.port}."
  end
end

【讨论】:

  • 如此简单,如此容易被忽视。我考虑了几分钟,并正在考虑如何获得它。这个问题很好地提醒我再次审查请求。 api.rubyonrails.org/classes/ActionController/…
  • 精确到本地主机,但在 Apache 服务器后面或在集群设置中时不起作用。
  • 感谢您的回答。您知道如何以编程方式访问它,即我可以在脚本/控制台中执行的操作吗?毕竟,如果我需要通过 HTTP 访问它,那意味着我已经知道了端口!
【解决方案3】:

两种方式。

如果您在控制器或视图中响应请求,请使用请求对象:

request.port

如果您在初始化程序中并且无权访问请求对象,请使用服务器选项哈希:

Rails::Server.new.options[:Port]

【讨论】:

  • (rdb:1) Rails::Server *** NameError Exception: uninitialized constant Rails::Server
  • @zuba,这很有趣。这发生在你的初始化程序中吗?
  • 抱歉,不,发生在我的控制器 rspec 测试调试控制台中
  • 您可能必须首先需要相应的库。 require 'rails/commands/server'
  • @SethJeffery,它有效,但我有一点警告:通过要求 rails 服务器命令,您不能将参数传递给 cucumber/rspec,因为 rails 服务器启动器会引发一个异常,声称他得到了错误的论点。
【解决方案4】:

我玩了一下,这可能是 Rails 5.1 的最佳解决方案:

Rails::Server::Options.new.parse!(ARGV)[:Port]

【讨论】:

  • 当没有明确指定端口时返回nil
【解决方案5】:

在其他答案的基础上(这救了我的培根!),我扩展了这个以提供理智的后备:

开发中:

port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 3000 rescue 3000

在所有其他环境中:

port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 80 rescue 80

如果您正在运行 rails consolerescue 80 将覆盖您。否则,它会引发NameError: uninitialized constant Rails::Server。 (也许在初始化器的早期?我忘了...)

如果没有给服务器 -p 选项,|| 80 会覆盖你。否则你会得到零。

【讨论】:

    【解决方案6】:

    用于 Rails 5.1 开发服务器。

    if Rack::Server.new.options[:Port] != 9292 # rals s -p PORT
      local_port = Rack::Server.new.options[:Port]
    else
      local_port = (ENV['PORT'] || '3000').to_i # ENV['PORT'] for foreman
    end
    

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 1970-01-01
      • 2019-04-12
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多