Czy potrafisz zdefiniować lokalizacje serwera w wielu plikach konfiguracyjnych Nginx?


14

Mam wiele aplikacji ruby ​​działających na tym samym hoście:

~/app1
~/app2
~/app3

I chcę mieć nginx proxy dla tych aplikacji za pomocą podkatalogów takich jak:

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

Jestem ciekawy, czy nginx obsługuje mnie w definiowaniu tych lokalizacji w wielu plikach, dzięki czemu mogłem zachować każdą konfigurację w aplikacji, zamiast jednego monolitycznego pliku konfiguracyjnego dla wszystkich aplikacji:

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

Moja naiwna próba zdefiniowania serwera z jedną dyrektywą lokalizacji w każdym z 3 plików konfiguracyjnych doprowadziła do conflicting server name "example.com" on [::]:80, ignoredkonfiguracji wyglądających tak:

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

Czy istnieje sposób na zorganizowanie konfiguracji w ten sposób?

Odpowiedzi:


9

Możesz dołączyć zewnętrzne konfiguracje poprzez:

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

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

A w osobnej konfiguracji możesz użyć dowolnych poprawnych bloków kodu:

upstream app1 {
    server 127.0.0.1:8080;
}

location /app1 {
    proxy_pass http://app1;
}

5
Czy to naprawdę działa? Czy moduł nadrzędny nie musi znajdować się poza blokiem modułu serwera?
— Curley

5
Wygląda na to, że dyrektywa lokalizacji nie jest dozwolona poza blokiem serwera. Przynajmniej dla mnie, raporty nginx "location" directive is not allowed here.
— Alexander Amelkin,

Tak ... Nie widzę prostego sposobu, aby zrobić to poprawnie bez wielu plików na aplikację: jednego, który działałby w bloku serwera, drugiego, który działałby na zewnątrz. include /etc/nginx/above_server.d/*include /etc/nginx/in_server.d/*
— Wydaje

1
Ta odpowiedź jest błędna
— AmirHossein

11

Wierzę, że możesz użyć tej konfiguracji:

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

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

a następnie w katalogu każdej aplikacji skonfiguruj przekierowanie w następujący sposób:

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
Minusem byłoby to, że nie można zdefiniować wielu potoków w serverbloku, ale myślę, że odpowiedź na pytanie użycia OP jest dobra.
— jeteon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.