Несколько стоечных приложений на nginx + passenger, одно от имени 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, описанных здесь: http://www.modrails.com/documentation/Users%20guide%20Nginx.html

Со следующим конфигом у меня есть /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 получает ту же ошибку.

Есть идеи? Спасибо!

5 ответов

Мне удалось заставить следующее работать. Для вашего примера, то, что вы хотите для структуры каталогов и символических ссылок, это.

/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;
}

Приветствия, Майк Д.

Как вам удалось решить это с nginX. Я пробовал это, чем я пытался с пассажиром. Не повезло с обеих сторон.

Вместо этого, изменив nginx, вы можете сделать это в MMVC(Multi MVC) в самой Sinatra, используя стойку.

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

Используя это, вы можете запускать несколько приложений, используя nginx passenger. Поскольку пассажиру нужна общая папка, я создал фиктивную общую папку, а в публичной папке я создал папки для управления отдельными активами, такими как public / blog / public / index public / test и т.д.

У меня была похожая проблема. Я нашел способ вставить следующее в раздел server файла nginx.conf (хотя это немного похоже на хак, это работает):

error_page 403 / app1 / homepage;

надеюсь это поможет

Вам, вероятно, следует использовать субдомены, если приложения не связаны между собой.

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

  passenger_enabled on;
  passenger_base_uri /app1;
}

Если субдомены не являются опцией, возможно, будет полезна директива alias.

Другие вопросы по тегам