单独服务器上的 nginx proxy_pass 到多个 Rails 应用程序,乘客独立在不同的盒子中具有子 URI

Posted

技术标签:

【中文标题】单独服务器上的 nginx proxy_pass 到多个 Rails 应用程序,乘客独立在不同的盒子中具有子 URI【英文标题】:nginx on separate server proxy_pass to multiple rails apps with sub URI on passenger standalone in different boxes 【发布时间】:2011-10-01 02:51:15 【问题描述】:

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

lb 盒子包含没有乘客插件的普通 nginx。 Rails 应用程序单独部署在乘客站上。

所有 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;
              ...
         
         ....
     
  

使用此设置,在 app1 和 app2 中独立于乘客上运行的应用会抛出无法找到任何路线 /rails1/ 的错误。

这篇文章"How To Deploy Phusion Passenger To A Subdirectory, Routing Errors, And Restarting" 试图解决同样的问题,但它建议更改路线,我不希望这样做。正在处理的 Rails 应用程序具有相同的代码库,但针对满足特定客户的特定实例进行了定制。

在 Nginx 服务器的乘客插件中,有一个 Passenger_base_uri 有助于为应用设置子 URI。在乘客独立的情况下,相同的等价物是多少?还是我在这里遗漏了一些基本的东西?任何帮助,建议都会有所帮助。

【问题讨论】:

【参考方案1】:

试试看,使用rewrite module:

location /rails2 
                rewrite "/rails2/" / break;
                proxy_pass http://rails2_cluster;

这是一个正则表达式,所以如果 url 实际包含它,它可能会着火。此外,这个还不适用于没有斜杠的地址,所以检查一下。

【讨论】:

以上是关于单独服务器上的 nginx proxy_pass 到多个 Rails 应用程序,乘客独立在不同的盒子中具有子 URI的主要内容,如果未能解决你的问题,请参考以下文章

使用 nginx proxy_pass 修改 Location 标头

nginx 中location和proxy_pass后面跟“/”组合后产生访问情况

Nginx Proxy_pass简述

nginx怎么把来自80端口的请求交给8080

Linux下Nginx服务Rewrite和Proxy_Pass

windows服务器nginx配置 使用proxy_pass windows server2008 配置vue与python后端 端口放行