Pouvez-vous définir les emplacements d'un serveur dans plusieurs fichiers de configuration nginx?


14

J'ai plusieurs applications ruby ​​exécutées sur le même hôte:

~/app1
~/app2
~/app3

Et je veux avoir le proxy nginx ces applications en utilisant des sous-répertoires comme:

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

Je suis curieux de savoir si nginx me permet de définir ces emplacements dans plusieurs fichiers, afin que je puisse conserver chaque configuration avec l'application, au lieu d'avoir un fichier de configuration monolithique pour toutes les applications:

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

Ma tentative naïve de définir le serveur avec une seule directive d'emplacement dans chacun des 3 fichiers de configuration a abouti à conflicting server name "example.com" on [::]:80, ignoredune configuration qui ressemble à ceci:

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

Existe-t-il un moyen d'organiser les configurations de cette manière?

Réponses:


9

Vous pouvez inclure des configurations externes via include:

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

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

Et dans une configuration séparée, vous pouvez utiliser n'importe quel bloc de code valide:

upstream app1 {
    server 127.0.0.1:8080;
}

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

5
Est-ce que cela fonctionne réellement? Le module amont n'a-t-il pas besoin d'être en dehors du bloc de module serveur?
Curley

5
Il semble que la directive de localisation ne soit pas autorisée en dehors du bloc serveur. Du moins pour moi, rapporte nginx "location" directive is not allowed here.
Alexander Amelkin

Ouais ... Je ne vois pas un moyen simple de le faire correctement sans plusieurs fichiers par application: un qui fonctionnerait à l'intérieur d'un bloc serveur, un qui fonctionnerait à l'extérieur. Je suppose que pour plus de flexibilité et pour le rendre propre, un caractère générique pourrait être utilisé: include /etc/nginx/above_server.d/*etinclude /etc/nginx/in_server.d/*
jeteon

1
Cette réponse est fausse
AmirHossein

11

Je pense que vous pouvez utiliser cette configuration:

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

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

puis dans le répertoire de chaque application, configurez la redirection comme ceci:

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
L'inconvénient serait que vous ne pouvez pas définir plusieurs amonts dans le serverbloc, mais je pense que le cas d'utilisation de l'OP est bien servi par cette réponse.
jeteon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.