在我的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。
答案 0 :(得分:0)
如果您正在响应控制器或视图中的请求,请使用请求对象 - 这应该有效,尽管您说它没有:
request.port
如果你是初学者:
Rails::Server.new.options[:Port]
答案 1 :(得分:0)
您应该只能通过ENV['PORT']
访问它,因为它的值已设置为$PORT
环境变量。
答案 2 :(得分:0)
可能是一个坏主意,但无论如何:
uport = `netstat -n --listening --tcp -p | grep unicorn | sed 's/.*:\([0-9]*\) .*/\1/'`
答案 3 :(得分:0)
我找到了一种方法来做到这一点。
if($_SERVER["REMOTE_ADDR"] != "127.0.0.1")
die();
和unicorn.development.rb
unicorn.test.rb
gem 在我的独角兽配置文件中,执行以下操作: #unicorn.development.rb:
dotenv-rails
在我的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环境变量
确保使用正确的Unicorn配置文件来启动应用。这可以通过使用单独的Procfiles进行开发和测试来完成。
.env.testing
这似乎主要起作用,但并非没有它的问题......