如何使用Puma和nginx配置托管在sub-url上的Rails 3应用程序?

时间:2015-06-05 09:13:40

标签: ruby-on-rails-3 nginx puma

使用Phusion Passenger,在nginx虚拟主机配置中可以使用特定的指令,允许Rails应用程序托管在子URL上。这在Phusion Passenger documentation

中有所描述

使用Puma,我正在使用套接字。我的nginx配置包括:

upstream subapp {
    server unix:<path_to_subapp_folder>/shared/sockets/puma.sock fail_timeout=0;
}

server {
...
    location /subapp {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://subapp;
    }
}

子应用程序接收GET作为&#39; / subapp&#39;但当然不知道如何处理它。如果我使用网址重写并在&#39; / subapp&#39;之后将其全部传递到网址,则会呈现该网页,但所有链接(包括资源路径)都不包含&#39; / subapp&#39;和因此无效。

如何配置Rails以便它预先设置&#39; / subapp&#39;到路径?我确实设法在routes.rb中使用了一个范围(范围(:path =&gt;(is_dev?&#39;&#39;:&#39; / subapp&#39;)))但这似乎是人为的它没有预先设置资产路径。我想有一种方法可以配置nginx / Puma(与Passenger一样)来处理这种情况。

2 个答案:

答案 0 :(得分:2)

解决方案需要对config.ru进行以下更改:

if ENV['RAILS_ENV'] != 'production'
    run SubApp::Application
else
    # production
    map '/subapp' do
        run SubApp::Application
    end
end

this question中描述,并且要求:

config.action_controller.relative_url_root = '/subapp'

不需要其他Rails配置(例如,在生产时将路由指向'/ subapp')。如上所述的nginx配置起作用。

答案 1 :(得分:0)

如果您这样做,则不必更改config.ru(基本上删除了/subapp段)

location /subapp/ {
  ...
  proxy_pass http://subapp/;
}

proxy_pass http://subapp/;行的(添加)结尾斜杠将从铁路接收的路由中删除/subapp段。