nginx на отдельном сервере proxy_pass для нескольких рельсовых приложений с суб URI на отдельном пассажире в разных полях - PullRequest
5 голосов
/ 08 июля 2011

У меня есть это требование, когда есть несколько приложений рельсов. Каждое приложение развернуто на двух серверах приложений (app1 и app2), и они распределены по нагрузке через nginx на отдельном сервере (lb).

Коробка lb содержит простой ванильный 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;
              ...
         }
         ....
     }
  }

При такой настройке приложение, работающее в автономном режиме пассажира в приложениях app1 и app2, выдает ошибку, что оно не может найти какой-либо маршрут /rails1/.

Эта статья «Как развернуть Phusion Passenger в подкаталог, маршрутизация ошибок и перезапуск» пытается решить ту же проблему, но предлагает изменить маршруты, чего я не хочу делать. Приложения Rails имеют ту же кодовую базу, но настроены для конкретных случаев, обслуживающих конкретного клиента.

В пассажирском плагине для сервера Nginx есть passenger_base_uri, который помогает в настройке вспомогательного URI для приложения. Что эквивалентно тому же в случае одинокой пассажирской стоянки? Или я что-то упустил здесь? Любая помощь, предложения помогут.

1 Ответ

0 голосов
/ 20 октября 2012

Попробуйте, используя модуль перезаписи :

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

Это регулярное выражение, поэтому может сгореть, если URL действительно содержит это.Кроме того, этот еще не работает для адресов без завершающего слеша, поэтому проверьте это.

...