通过Pow在Unicorn上运行Rails,是否可以知道Unicorn运行的端口?

时间:2015-07-29 07:41:29

标签: ruby-on-rails rack unicorn foreman rack-pow

在我的Ruby on Rails开发环境中,我以典型的方式通过Foreman启动Rails和Unicorn:

(Procfile:)

mydomain.dev

我也在运行Pow。但不是作为网络服务器。我只是使用Pow来将mydomain.dev(端口80)的http请求定向到Unicorn正在侦听的端口。

您可以通过创建包含Unicorn正在运行的端口号的pow文件(Unicorn::Configurator::RACKUP[:port])来完成此操作。

鉴于此设置,我的rails代码是否可以知道我开始使用Unicorn的端口是什么?

我只想在我的开发环境中了解这一点,这不是生产问题。

在我的Rails代码中,我尝试了一些不同的东西,但没有一个能够工作:

  • Rails::Server.new.options[:Port] - 什么都没有回复
  • Rack::Server.new.options[:Port] - 在Rails 4中不存在
  • request.port - 返回默认机架端口(9292),而不是为此机架实例配置的端口。

    有没有办法从rails获取当前的机架实例?

  • {{1}} - 返回80,这是Pow正在侦听的端口。 Pow正在将http流量路由到Unicorn,它位于不同的端口上。

这些都没有给我Unicorn运行的端口。

有什么想法吗?

编辑如果您想知道为什么我想知道这一点,那是因为在我的开发环境中,我尝试动态创建Pow的配置文件,所以我可以在正确的端口上将http请求路由到Unicorn。

4 个答案:

答案 0 :(得分:0)

如果您正在响应控制器或视图中的请求,请使用请求对象 - 这应该有效,尽管您说它没有:

request.port

如果你是初学者:

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

How to find the local port a rails instance is running on?

答案 1 :(得分:0)

您应该只能通过ENV['PORT']访问它,因为它的值已设置为$PORT环境变量。

答案 2 :(得分:0)

可能是一个坏主意,但无论如何:

uport = `netstat -n --listening --tcp -p | grep unicorn | sed 's/.*:\([0-9]*\) .*/\1/'`

答案 3 :(得分:0)

我找到了一种方法来做到这一点。

  1. 为Unicorn创建单独的配置文件。 if($_SERVER["REMOTE_ADDR"] != "127.0.0.1") die(); unicorn.development.rb
  2. 安装unicorn.test.rb gem
  3. 在我的独角兽配置文件​​中,执行以下操作:     #unicorn.development.rb:

    dotenv-rails
  4. 在我的require "dotenv" Dotenv.load( "./.env.local", "./.env.development", "./.env" ) if ENV['UNICORN_PORT'].nil? throw 'UNICORN_PORT not set in environment!' end worker_processes 3 timeout 30 preload_app true listen ENV['UNICORN_PORT'], backlog: 64 ... rest of unicorn config... # unicorn.testing.rb: require "dotenv" Dotenv.load( "./.env.local", "./.env.testing", "./.env" ) if ENV['UNICORN_PORT'].nil? throw 'UNICORN_PORT not set in environment!' end worker_processes 3 timeout 30 preload_app true listen ENV['UNICORN_PORT'], backlog: 64 ... rest of unicorn config... .env.development环境文件中,设置UNICORN_PORT环境变量

  5. 确保使用正确的Unicorn配置文件来启动应用。这可以通过使用单独的Procfiles进行开发和测试来完成。

    .env.testing
  6. 这似乎主要起作用,但并非没有它的问题......