我们构建了一个包含以下路线的 Rails 应用程序:
namespace :api do
namespace :v1 do
resources ...
end
end
这意味着,所有控制器都可以通过 访问www.url.com/api/v1/controller
。要在根域下运行独立 Web 应用程序,我有以下本地 nginx 设置:
server {
listen 8080;
server_name localhost;
location / {
root /Users/swramba/Sites;
index index.html index.htm;
}
location ~ /api {
proxy_pass http://127.0.0.1:3000;
}
}
这意味着,下面的所有内容/api
都会被代理到用于开发的 WEBrick 服务器。现在,在我们的生产环境中,我们想使用具有类似设置的 Phusion Passenger。因此,我为生产 nginx 编写了以下配置:
server {
listen 80;
server_name localhost;
root /home/someuser/sites/web/www.myapp.com;
passenger_base_uri /api;
passenger_enabled on;
rails_env production;
}
但是,这意味着该/api
部分已从 URL 中剥离,并且 Rails 返回 404,因为/v1/something
无法找到。
我怎样才能让 nginx 或 Passenger 不从 URL 中省略/api
,以便 URL 与开发中的相同?
我也尝试设置config.relative_url_root = "/api"
,但没有任何效果。
答案1
我能搞清楚。这实际上是正确的配置:
server {
listen 80;
server_name localhost;
location / {
root path/to/some_html_webapp;
}
location ~ /api {
root path/to/rails_app/public;
passenger_enabled on;
rails_env production;
}
}
这样,URL 不会被修改,但 Passenger 会在某个路径上接管。