web-dev-qa-db-fra.com

Le proxy (nginx) affiche une erreur de passerelle incorrecte

J'ai un service (registre docker) qui s'exécute sur port 5000, J'ai installé nginx pour rediriger la demande http de 8080 à 5000. Si je fais une boucle pour localhost:5000 ça marche, mais quand je fais une boucle pour localhost:8080 J'obtiens une erreur Bad gateway.

fichier de configuration nginx:

upstream docker-registry {
 server localhost:5000;
}

server {
 listen 8080;
 server_name registry.mydomain.com;

 proxy_set_header Host       $http_Host; 
 proxy_set_header X-Real-IP  $remote_addr; 
 client_max_body_size 0; 
 chunked_transfer_encoding on;

 location / {

     proxy_pass http://docker-registry;
 }
 location /_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }
 location /v1/_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }

}

Dans /var/log/nginx/error.log J'ai:

[crit] 15595#0: *1 connect() to [::1]:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain.com, request: "GET / HTTP/1.1", upstream: "http://[::1]:5000/", Host: "localhost:8080"

Une idée?

18
hellb0y77

Je suppose que c'est une boîte Linux, donc très probablement SELinux empêche la connexion car il n'y a pas de politique permettant la connexion.

Vous devriez pouvoir simplement exécuter

# setsebool -P httpd_can_network_connect true

puis redémarrez nginx.

58
Warren

Sur la base du message d'erreur, je me demande si localhost: 5000 est résolu en tant qu'adresse ipv6, ce que vous ne voudrez peut-être pas. Vous pouvez essayer de changer cela en 127.0.0.1:5000

EDIT: Dans votre ligne proxy_pass, il est possible qu'il vous manque une partie de l'URL? Essayez d'ajouter $ request_uri pour qu'il soit:

proxy_pass http://docker-registry/$request_uri;

ou probablement:

proxy_pass http://docker-registry$request_uri;

Je ne sais pas lequel est le plus correct.

Une autre chose à considérer. Votre configuration indique:

server_name registry.mydomain.com;

Ainsi, localhost: 8080 peut ne pas correspondre. Pour les tests, vous pouvez changer cela en:

server_name registry.mydomain.com localhost;

Ensuite, l'hôte local: 8080 serait mis en correspondance, ainsi que votre domaine. Je suppose que registry.mydomain.com n'est qu'un exemple et vous mettriez votre vrai FQDN de serveur là-dedans.

5
Gregor