Назад | Перейти на главную страницу

Несколько стоечных приложений на nginx + пассажира, одно как 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 являются символическими ссылками на общедоступные каталоги соответствующих приложений). Это настройка Passenger для дополнительных URI, описанная здесь: 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 получает ту же ошибку.

Любые идеи? Спасибо!

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

/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 вы можете сделать это в MMVC (Multi MVC) в самом Sinatra, используя стойку

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

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

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

error_page 403 / app1 / homepage;

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

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

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

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

  passenger_enabled on;
  passenger_base_uri /app1;
}

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