Борьба с блоками локации в конфиге nginx - PullRequest
4 голосов
/ 03 марта 2011

Я получил новый слайс от slicehost, чтобы поиграть и узнать nginx и больше о развертывании в целом.Я установил приложение ruby ​​(которое я назову app1), в котором используется пассажир.Я сделал его приложением по умолчанию для этого сервера со следующим блоком сервера в моей конфигурации nginx:

server {
    listen 80;
    server_name <my server ip>;
    root <path to app1 public folder>;
    passenger_enabled on;
}

Это прекрасно работает.Тем не менее, я хочу попробовать несколько разных приложений на этом слайсе, и поэтому подумал, что я бы настроил его так:

http: /// app1

http: /// app2

и т. Д.Я думал, что смогу сделать это, добавив блок местоположения и переместив в него специфичные для приложения вещи, например:

server {
    listen 80;
    server_name <my server ip>;

    location ^~ /app1 {
        root <path to app1 public folder>;
        passenger_enabled on;
    }
}

Однако, сделав это (и, конечно, перезапустив nginx), перейдем кПростой IP-адрес дает сообщение «добро пожаловать в nginx» (что я и ожидал).Но переход к / app1 выдает сообщение об ошибке:

404 Not Found
The requested URL /app1 was not found on this server. 

Это отличается от сообщения об ошибке, которое я получаю при переходе на другой путь по этому ip, например / foo:

404 Not Found
nginx/0.8.53

Итак, nginx знает об этом месте, но я не настроил его должным образом.Кто-нибудь может привести меня в порядок?Должен ли я установить различные серверные блоки вместо использования местоположений?Я уверен, что это просто, но не могу разобраться.

Ура, макс

Ответы [ 5 ]

3 голосов
/ 29 августа 2016

Я не вижу реальной проблемы здесь,
, чтобы вы могли понять, что вам нужно просмотреть файлы журнала nginx на большинстве систем по адресу:
/ var / log / nginx /
и откройте соответствующий файл доступа здесь (может быть error.log), где вы можете увидеть, к чему url nginx пытался получить доступ и почему он не удался.
То, что я действительно думаю, происходит, что вы неправильно указали корневой путь,может быть, это вместо псевдонима, потому что если вы проксируете соединение с другим приложением, оно может получить слово «app1» в URL вместо прямого.

, поэтому, пожалуйста, попробуйте:

server {
    listen 80;
    server_name <my server ip>;

    location /app1 {
        alias <path to app1 public folder>;
        passenger_enabled on;
    }
}

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

3 голосов
/ 03 июля 2011

То, что вы ищете, это имя виртуального хостинга.Идея состоит в том, что каждый домен размещается на одном и том же IP-адресе, и nginx выбирает виртуальный хост для обслуживания на основе заголовка Host: в HTTP-запросе, отправляемом браузером.

Чтобы использовать имя виртуального хостингаиспользуйте директиву server_name для использования домена, который вы хотите обслуживать, вместо IP-адреса вашего сервера.

server {
  listen 80;
  server_name app1.com;

  location / {
    root /srv/http/app1/public;
    passenger_enabled on;
  }
}

Затем, чтобы разместить больше приложений в одном блоке, просто объявите отдельный блок server { } для каждогоone.

server {
  listen 80;
  server_name app2.com;

  location / {
    root /srv/http/app2/public;
    passenger_enabled on;
  }
}

Я использую единорога вместо пассажира, но vhost часть структуры одинакова для любого бэкэнда.

Глобальная конфигурация nginx (которая на своих собственных хостахничего): https://github.com/benhoskings/babushka-deps/blob/master/nginx/nginx.conf.erb

Оболочка шаблона для каждого виртуального хоста: https://github.com/benhoskings/babushka-deps/blob/master/nginx/vhost.conf.erb

Подробная информация о виртуальном хосте единорога: https://github.com/benhoskings/babushka-deps/blob/master/nginx/unicorn_vhost.common.erb

2 голосов
/ 12 июня 2013

Кажется, вы хотите разместить больше приложений на одном сервере с базовым URI.Попробуйте это:

root /srv/http/;
passenger_base_uri /app_1;
passenger_base_uri /app_2

Также в / srv / http создайте 2 символические ссылки:

ln -s /srv/http/app_1 /srv/http/app1/public
ln -s /srv/http/app_2 /srv/http/app2/public

Доступ к приложению 1 можно получить по адресу: http://domain.com/app_1.

Вот еще для чтения: http://www.modrails.com/documentation/Users%20guide%20Nginx.html#deploying_rack_to_sub_uri

2 голосов
/ 09 апреля 2011

Одна из проблем заключается в том, что ваше Rails-приложение, вероятно, не предназначено для запуска из подкаталога. У пассажира есть директива, которая это исправит:

passenger_base_uri /app1;

Однако запуск приложений Rails в подкаталогах несколько нестандартен. Если вы можете, лучшим вариантом может быть настройка поддоменов с использованием виртуальных хостов nginx.

2 голосов
/ 03 марта 2011

Я думаю, это просто небольшая синтаксическая проблема:

 location ~ ^/app1 { ... 

должно работать или чуть более эффективно:

 location = /app1 { ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...