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.