nginx: en amont avec plusieurs directives serveur?

15

J'essaie d'empaqueter 2 applications qui utilisent nginx comme proxy et de fournir à chacune un fichier de configuration /etc/nginx/conf.d/.

Faire cela dans un seul fichier ( combined.conf) fonctionne très bien:

    upstream backend1 {
      http://localhost:8989;
    }

    upstream backend2 {
      http://localhost:8990;
    }

    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
      location /backend2/ {
        proxy_pass  http://backend2;
      }

Cependant, lors de la division en 2 fichiers, l'une des redirections échoue systématiquement:

  • backend1.conf:

    upstream backend1 {
      http://localhost:8989;
    }
    
    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
    
  • backend2.conf:

    upstream backend2 {
      http://localhost:8990;
    }
    
    server {
      location /backend2/ {
        proxy_pass  http://backend2;
      }
    

Ma question est donc: un httpnœud peut-il avoir 2 serverenfants différents ?

La documentation Nginx n'en dit rien.

Cependant, d' autres personnes semblent avoir réussi avec ce type d'architecture :(

La version Nginx est 1.1.19-1ubuntu0.1.

Merci pour tout conseil!

oDDsKooL
la source
Pour être plus précis, lorsque j'utilise l'approche des 2 fichiers, c'est le site par défaut qui répond par un 404.
oDDsKooL

Réponses:

8

après tant de rumeurs et de tests, j'ai trouvé un moyen de le faire fonctionner et de pouvoir envoyer un fichier de configuration par application.

Le voici, distribué dans un fichier commun et une paire de fichiers amont / emplacement par application:

  • /etc/nginx/conf.d/common-proxies.conf:

    include /upstreams/*.conf;
    
    server {
    include /locations/*.conf
    }
    
  • /etc/nginx/locations/backend1.conf

    location /backend1/ {
      upstream http://backend1;
    }
    
  • /etc/nginx/locations/backend2.conf

    location /backend2/ {
      upstream http://backend2;
    }
    
  • /etc/nginx/upstreams/backend1.conf

    upstream backend1 {
      http://localhost:8989;
    }
    
  • /etc/nginx/upstreams/backend2.conf

    upstream backend2 {
      http://localhost:8990;
    }
    
oDDsKooL
la source
1
Est-ce une faute de frappe? en amont doit avoir "serveur localhost: 8990" au lieu de " localhost: 8990 ;". Voir ici: nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev
Il semble d'après le document que vous avez lié que chaque commande à l'intérieur d'un bloc se termine par une demi-colonne. Par exemple upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }. En outre, cela fonctionne avec le ;:)
oDDsKooL
Je voulais dire que le mot-clé «serveur» est manquant avant l'adresse. Ignorez la partie point-virgule.
mbdev
1

Un bloc http peut avoir de nombreux enfants serveur. Cependant, nginx sélectionne un bloc serveur pour traiter une demande. Ainsi, la demande ne «voit» jamais l'emplacement backend2 car il correspond au premier bloc serveur.

chrskly
la source
Vous voulez dire que c'est probablement ma locationdirective qui aspire et récupère la requête destinée à backend2?
oDDsKooL
Ou est-ce que j'ai besoin d'un moyen de différencier les deux serverblocs lorsque nginx recherche le bon serverpour transmettre la demande?
oDDsKooL
Les deux blocs d'emplacement doivent se trouver dans le même bloc serveur.
chrskly