web-dev-qa-db-fra.com

Le proxy inverse de Docker nginx donne "502 passerelle incorrecte"

J'essaie de faire en sorte qu'un conteneur docker avec nginx fonctionne en tant que proxy inverse par rapport aux autres conteneurs docker et je reçois régulièrement "Bad Gateway" ailleurs que dans l'emplacement de base "/".

J'ai le bloc serveur suivant:

server {

  listen 80;

  location / {
    proxy_pass "http://game2048:8080";
  }

  location /game {
    proxy_pass "http://game:9999";
  }

}

Cela fonctionne pour http://localhost mais pas pour http://localhost/game qui donne "Bad Gateway" dans le navigateur et ceci sur le conteneur nginx:

[error] 7#7: *6 connect() failed (111: Connection refused) 
while connecting to upstream, client: 172.17.0.1, server: , 
request: "GET /game HTTP/1.1", upstream: "http://172.17.0.4:9999/game", 
Host: "localhost"

J'utilise l'image officielle du docker nginx et j'utilise ma propre configuration. Vous pouvez le tester et voir tous les détails ici: https://github.com/jollege/ngprox1

Des idées ce qui ne va pas?

NB: J'ai défini les entrées de nom d'hôte local sur l'hôte docker pour correspondre à ces noms:

127.0.1.1       game2048
127.0.1.1       game
5
jollege

Je l'ai corrigé! J'ai défini le nom du serveur dans différents blocs de serveur dans nginx config. N'oubliez pas d'utiliser le port docker, pas le port hôte.

server {

  listen 80;
  server_name game2048;

  location / {
    proxy_pass "http://game2048:8080";
  }

}

server {

  listen 80;
  server_name game;

  location / {
    # Remember to refer to docker port, not Host port
    # which is 9999 in this case:
    proxy_pass "http://game:8080";
  }

}

Le repo github a été mis à jour pour refléter le correctif, l'ancien fichier lisez-moi se trouve sous ./README.old01.md.

C'est typique que je trouve la réponse quand je formule soigneusement la question aux autres. Connaissez-vous ce sentiment?

7
jollege

Pour moi aidé cette ligne de code proxy_set_header Host $http_Host;

location / {
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header Host $http_Host;
   proxy_set_header X-NginX-Proxy true;

   proxy_redirect off;
   proxy_pass http://myserver;
}

J'ai eu la même erreur, mais pour une application Web qui ne servait tout simplement pas à l'adresse IP et au port mentionné dans la config.

Alors dites que vous avez ceci:

location /game {
    proxy_pass "http://game:9999";
}

Assurez-vous ensuite que l'application Web que vous attendez sur http: // game: 9999 sert réellement à partir d'un conteneur de menu fixe nommé 'game' et que le code est configuré pour servir l'application au port 9999.

0