Можете ли вы определить расположение сервера в нескольких конфигурационных файлах nginx?

14

У меня на одном хосте запущено несколько приложений ruby:

~/app1
~/app2
~/app3

И я хочу, чтобы nginx прокси эти приложения, используя такие подкаталоги, как:

   http://example.com/app1
   http://example.com/app2
   http://example.com/app3

Мне любопытно, поддерживает ли nginx возможность определять эти местоположения в нескольких файлах, чтобы я мог сохранить каждую конфигурацию с приложением вместо того, чтобы иметь один монолитный файл конфигурации для всех приложений:

~/app1/nginx.conf
~/app2/nginx.conf
~/app3/nginx.conf

Моя наивная попытка определить сервер с помощью одной директивы location в каждом из 3-х конфигурационных файлов привела к conflicting server name "example.com" on [::]:80, ignoredпоявлению конфигов, которые выглядят так:

upstream app1 { server 127.0.0.1:4567; }
server {
  listen      [::]:80;
  listen      80;
  servername  example.com
  location    /app1 {
     proxy_pass  http://app1;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "upgrade";
     proxy_set_header Host $http_host;
     proxy_set_header X-Forwarded-Proto $scheme;
     proxy_set_header X-Forwarded-For $remote_addr;
     proxy_set_header X-Forwarded-Port $server_port;
     proxy_set_header X-Request-Start $msec;
  }
}

Есть ли способ организовать конфиги таким образом?

aubreyrhodes
источник

Ответы:

9

Вы можете включить внешние конфигурации через:

include /path/to/config1.conf;
include /path/to/config2.conf;
include /path/to/confdir/*.conf;

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;
}

А внутри отдельного конфига вы можете использовать любые допустимые блоки кода:

upstream app1 {
    server 127.0.0.1:8080;
}

location /app1 {
    proxy_pass http://app1;
}
Slezhuk
источник
5
Это на самом деле работает? Разве вышестоящий модуль не должен находиться вне блока серверного модуля?
Керли
5
Похоже, директива location недопустима вне блока сервера. По крайней мере для меня, сообщает nginx "location" directive is not allowed here.
Александр Амелькин
Да ... Я не вижу простого способа сделать это правильно без нескольких файлов на приложение: один, который будет работать внутри блока сервера, другой, который будет работать снаружи. Я полагаю, для гибкости и чистоты можно использовать подстановочный знак: include /etc/nginx/above_server.d/*иinclude /etc/nginx/in_server.d/*
jeteon
1
Этот ответ неверен
Амир Хоссейн
11

Я полагаю, вы можете использовать эту конфигурацию:

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;

    include /path/to/applications/*/nginx.conf;
}

а затем в каталоге каждого приложения настройте перенаправление следующим образом:

location    /app1 {
    proxy_pass  http://app1;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
}
Александр Амелькин
источник
2
Недостатком было бы то, что вы не можете определить несколько восходящих потоков внутри serverблока, но я думаю, что вариант использования OP хорошо подходит для этого ответа.
Jeteon