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

How to configure Rails 3 app hosted on sub-url with Puma and nginx?

使用 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;
    }
}

子应用程序以“/subapp”的形式接收 GET,但当然不知道如何处理它。如果我使用 URL 重写并在 '/subapp' 之后传递 URL 中的所有内容,它会呈现页面,但所有链接(包括资产路径)都不包含 '/subapp',因此无效。

如何配置 Rails 以便在路径前添加“/subapp”?我确实设法在 routes.rb 中使用了范围 (scope(:path => (is_dev? ? '' : '/subapp')) do) 但这似乎是人为的,它没有预先考虑资产路径。我想有一种方法可以配置 nginx/Puma(就像 Passenger 一样)来处理这种情况。

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

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

中描述,并且要求:

config.action_controller.relative_url_root = '/subapp'

不需要其他 Rails 配置(例如,在生产环境中将路由范围限定为“/subapp”)。如上所述的 nginx 配置有效。

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

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

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