nginx + Passenger 上有多个 rack 应用程序,一个是 root,另一个不是...config

nginx + Passenger 上有多个 rack 应用程序,一个是 root,另一个不是...config

所以我有两个应用程序想在服务器上运行。一个应用程序我想成为“默认”应用程序——也就是说,默认情况下,所有 URL 都应发送到这个应用程序,除了对于某条路径,我们称之为/foo

http://mydomain.com/        -> app1
http://mydomain.com/apples  -> app1
http://mydomain.com/foo     -> app2

我的两个机架应用程序安装如下:

/var
  /www
    /apps
      /app1
        app.rb
        config.ru
        /public
      /app2
        app.rb
        config.ru
        /public
    app1 -> apps/app1/public
    app2 -> apps/app2/public

app1并且app2是指向其各自应用程序的公共目录的符号链接)。这是此处描述的子 URI 的 Passenger 设置:http://www.modrails.com/documentation/Users%20guide%20Nginx.html#deploying_rack_to_sub_uri

使用以下配置我将/foo进入app2:

server {
  listen 80;
  server_name mydomain.com;
  root /var/www;
  passenger_enabled on;
  passenger_base_uri /app1;
  passenger_base_uri /app2;

  location /foo {              
    rewrite ^.*$ /app2 last;
  }
}

现在,我该如何让 app1 接收其他所有内容?我尝试了以下操作(放置在指令之后location /foo),但我得到了 500 错误,其中有一个无限内部重定向error.log

location / {
  rewrite ^(.*)$ /app1$1 last;
}

我希望该last指令可以阻止无限重定向,但我想不是。/foo出现相同的错误。

有什么想法吗?谢谢!

答案1

我设法使以下内容工作。对于您的示例,您想要的目录和符号链接结构是这样的。

/var
  /www
     /apps
       /app1
         app.rb
         config.ru
         /public
           /foo -> /var/www/apps/app2/public
       /app2
         app.rb
         config.ru
         /public

你的 nginx 服务器块将如下所示:

server {
  listen 80;
  server_name mydomain.com;
  root /var/www/apps/app1/public;
  passenger_enabled on;
  passenger_base_uri /foo;
}

干杯,迈克·D。

答案2

如果应用程序不是紧密相关的,您可能应该使用子域名。

server {
  listen 80;
  server_name app1.mydomain.com;
  root /var/www/apps/app1;

  passenger_enabled on;
  passenger_base_uri /app1;
}

如果子域名不是一个选项,那么别名指令可能会有用。

答案3

您是如何通过 nginX 解决这个问题的?我试过这种方法,也尝试过通过 Passenger 解决。但两边都失败了。

答案4

你可以在 Sinatra 本身的 MMVC(Multi MVC)中使用 rack 进行更改,而不是在 nginx 中进行更改

run Rack::Cascade.new [ IndexApp, BlogApp, TestApp, ThisApp, ThatApp]

使用此功能,您可以使用 nginx 乘客运行多个应用程序。由于乘客需要公共文件夹,我创建了一个虚拟公共文件夹,并在公共文件夹下创建了用于管理个人资产的文件夹,例如 public/blog/ public/index public/test 等。

相关内容