如何让unicorn在路径下运行Rails 3.0应用程序?

时间:2012-04-30 15:32:48

标签: ruby-on-rails ruby rack unicorn

我正在从Passenger迁移到Unicorn,而使用Passenger我曾经使用RailsBaseURI选项运行我的Rails 3.0应用程序,例如以'/ blah'为所有网址加前缀。

在Unicorn下运行相同的应用时,我将'--path / blah'传递给unicorn_rails,但服务器仍然提供http://server:3000/etc/etc,而不是http://server:3000/blah/etc/etc - 我看到一些资产被请求via / blah /(就像JS文件一样),但各种链接在它们之前仍然没有'/ blah /'。

所以 - 总结一下 - 如何让我的应用程序在/ blah下安装我的应用程序,以便所有请求都使用'/ blah'前置于路径,并且所有链接和资产都是以'/ blah /'为前缀创建的它们?

由于

3 个答案:

答案 0 :(得分:4)

以下是我发现的内容:

要获取Rails应用程序来提供资产和链接URL,您必须在开始之前设置环境变量:

ENV['RAILS_RELATIVE_URL_ROOT'] = '/prefix'

然后,正如@ d11wtq所说,为了让机架兼容的服务器(在这种情况下,Unicorn)实际为前缀下的app提供服务,你必须在你的config.ru文件中,而不是通常的运行行,执行以下操作:

run Rack::URLMap.new(
  ENV['RAILS_RELATIVE_URL_ROOT'] => Rails.application
)

答案 1 :(得分:3)

我相信在你的config.ru中添加这样的东西应该这样做:

require ::File.expand_path('../config/environment',  __FILE__)

run Rack::URLMap.new(
  "/blah" => Rails.application
)

未测试

答案 2 :(得分:1)

简单可靠的解决方案是在前端设置中设置前缀。

以乘客+ nginx为例,您可以使用以下内容:

server {
    listen 80;
    server_name www.phusion.nl;
    root /websites/phusion;
    passenger_enabled on;
    passenger_base_uri /prefix;
}

源代码无需更改,一行设置。


但是你说你正在使用unicorn,你正在使用哪个前端?

使用nginx是可​​能的,例如:

location /prefix {
    rewrite           ^/prefix/(.*)  /$1      break;
    proxy_pass        http://localhost:8000;
}