nginx在单独的服务器上使用proxy_pass到多个rails应用程序,并且在不同的方框中单独乘客使用子URI

Ram*_*ani 5 location uri passenger nginx

我有这个要求,有多个rails应用程序.每个应用程序都部署在两个应用程序服务器(app1和app2)中,并通过单独的服务器(lb)上的nginx进行负载平衡.

磅盒子包含没有乘客插件的普通香草nginx.导轨应用仅部署在乘客座椅上.

所有rails应用程序都需要在同一个域上运行,但需要使用不同的sub_uri,如下所示

http://www.example.com/rails1
http://www.example.com/rails2

我有lb box nginx配置,如下所示.

   http {
      ...
      upstream rails1_cluster {
        ip_hash;
        server app1.server:3001;
        server app2.server:3001;
      }

      upstream rails2_cluster {
        ip_hash;
        server app1.server:3002;
        server app2.server:3002;
      }

      ...

      server {
         server_name www.example.com;
         ...
         ...

         location /rails1 {
              proxy_pass http://rails1_cluster;
              ...
         }

         location /rails2 {
              proxy_pass http://rails2_cluster;
              ...
         }
         ....
     }
  }
Run Code Online (Sandbox Code Playgroud)

通过此设置,在app1和app2中独立的乘客上运行的应用程序会抛出一个错误,即无法找到任何路由/ rails1 /.

本文"如何将Phusion Passenger部署到子目录,路由错误和重新启动"尝试解决同样的问题,但它建议更改路由,我不希望这样做.正在处理的Rails应用程序具有相同的代码库,但针对特定客户端的特定实例进行了定制.

在Nginx服务器的乘客插件中,有一个passenger_base_uri有助于为应用程序设置子URI.在乘客站立的情况下,相同的是什么?或者我错过了一些基本的东西?任何帮助,建议都会有所帮助.

dan*_*ans 0

使用重写模块尝试一下:

location /rails2 {
                rewrite "/rails2/" / break;
                proxy_pass http://rails2_cluster;
}
Run Code Online (Sandbox Code Playgroud)

它是一个正则表达式,因此如果 url 实际上包含它,可能会引起火灾。此外,此方法还不适用于没有尾部斜杠的地址,因此请检查这一点。