Чи можете ви визначити розташування сервера в кількох конфігураційних файлах nginx?


14

У мене на одному хості працює кілька програм для рубінів:

~/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

Моя наївна спроба визначення сервера з єдиною директивою про розташування у кожному з 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;
  }
}

Чи можна таким чином організувати конфігурацію?

Відповіді:


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

5
Це насправді працює? Чи не потрібно, щоб модуль вище за течією знаходився поза блоком серверного модуля?
Керлі

5
Схоже, директива про місцезнаходження не дозволена поза блоком сервера. Принаймні для мене, повідомляє nginx "location" directive is not allowed here.
Олександр Амелькін

Так ... Я не бачу простого способу зробити це належним чином без декількох файлів на додаток: один, який би працював усередині блоку сервера, той, який би працював зовні. Я думаю, що для гнучкості та чистоти підстановки можна було б використовувати: include /etc/nginx/above_server.d/*таinclude /etc/nginx/in_server.d/*
jeteon

1
Ця відповідь неправильна
AmirHossein

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блоку, але я вважаю, що цей варіант відповіді добре обслуговується.
jeteon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.