将passenger_base_uri传递给Rails应用程序

将passenger_base_uri传递给Rails应用程序

我们构建了一个包含以下路线的 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 会在某个路径上接管。

相关内容