如何使用 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
段。
使用 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
段。