Können Sie die Speicherorte eines Servers in mehreren Nginx-Konfigurationsdateien definieren?

14

Ich habe mehrere Ruby-Apps, die auf demselben Host ausgeführt werden:

~/app1
~/app2
~/app3

Und ich möchte Nginx Proxy diese Apps mit Unterverzeichnissen wie:

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

Ich bin neugierig, ob Nginx mich dabei unterstützt, diese Speicherorte in mehreren Dateien zu definieren, damit ich jede Konfiguration mit der App behalten kann, anstatt eine einzige monolithische Konfigurationsdatei für alle Apps zu haben:

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

Mein naiver Versuch, den Server mit einer einzigen Location-Direktive in jeder der 3 Konfigurationsdateien zu definieren, führte zu conflicting server name "example.com" on [::]:80, ignoredeiner Konfiguration, die so aussieht:

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

Gibt es eine Möglichkeit, die Konfigurationen auf diese Weise zu organisieren?

aubreyrhodes
quelle

Antworten:

9

Sie können externe Konfigurationen über include einbinden:

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

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

Und innerhalb einer separaten Konfiguration können Sie beliebige gültige Codeblöcke verwenden:

upstream app1 {
    server 127.0.0.1:8080;
}

location /app1 {
    proxy_pass http://app1;
}
Slezhuk
quelle
5
Funktioniert das eigentlich? Muss sich das Upstream-Modul nicht außerhalb des Servermodulblocks befinden?
Curley
5
Es sieht so aus, als wäre eine Standortanweisung außerhalb des Serverblocks nicht zulässig. Zumindest für mich, berichtet Nginx "location" directive is not allowed here.
Alexander Amelkin
Ja ... Ich sehe keine einfache Möglichkeit, dies ohne mehrere Dateien pro Anwendung zu tun: eine, die innerhalb eines Serverblocks und eine, die außerhalb funktioniert. Ich denke, für Flexibilität und um es sauber zu machen, könnte ein Platzhalter verwendet werden: include /etc/nginx/above_server.d/*undinclude /etc/nginx/in_server.d/*
jeteon
1
Diese Antwort ist falsch
AmirHossein
11

Ich glaube, Sie könnten diese Konfiguration verwenden:

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

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

und konfigurieren Sie dann im Verzeichnis jeder Anwendung die Umleitung wie folgt:

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;
}
Alexander Amelkin
quelle
2
Der Nachteil wäre, dass Sie nicht mehrere Upstreams innerhalb des serverBlocks definieren können, aber ich denke, dass der Anwendungsfall des OP durch diese Antwort gut unterstützt wird.
Jeteon