使用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一样)来处理这种情况。
答案 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
段。