502 Bad Gateway - nginx/1.14.0 (Ubuntu) : Impossible de trouver l'image localement + Réponse d'erreur du démon

Récemment, j’ai déplacé mon serveur Dell d’un endroit à un autre. Son système d’exploitation principal/gestionnaire de machines virtuelles est Proxmox VE 5.3. J’ai une machine virtuelle Nginx qui fait office de proxy inverse pour plusieurs autres machines virtuelles, dont une machine virtuelle Discourse.

Après avoir configuré mon nouveau routeur, plusieurs de mes machines virtuelles ont pu se connecter à Internet (sans même avoir besoin de renouveler les certificats SSL). Cependant, avec Discourse, je reçois l’erreur 502 Bad Gateway - nginx/1.14.0 (Ubuntu) lorsque j’essaie d’accéder à Discourse depuis un navigateur.

J’ai déjà rencontré cette erreur, mais généralement l’une des méthodes ci-dessous la résout :

Redémarrage de la machine virtuelle Discourse

Toujours 502 Bad Gateway - nginx/1.14.0 (Ubuntu) dans un navigateur.

Effacement des cookies du navigateur et essai avec différents navigateurs

Juste au cas où le problème viendrait de mon côté… non. Toujours la même erreur 502 Bad Gateway - nginx/1.14.0 (Ubuntu) sur divers navigateurs.

Nettoyage de Discourse et vérification de l’espace disque

Initialement, lors du nettoyage, environ 4 Go de données ont été supprimés. J’ai été très surpris. Peut-être que cela a causé le problème dès le départ ? Quoi qu’il en soit, maintenant, lorsque j’essaie de nettoyer Discourse :

> root@forum:/var/discourse# ./launcher cleanup
> WARNING! This will remove all stopped containers.
> Are you sure you want to continue? [y/N] y
> Total reclaimed space: 0B
> WARNING! This will remove all images without at least one container associated to them.
> Are you sure you want to continue? [y/N] y
> Total reclaimed space: 0B

Je tiens également à réitérer que je ne suis pas à court d’espace disque :

Git Pull

Il est à jour.

> root@forum:/var/discourse# git pull
> Already up to date.

Redémarrage de Discourse

C’est ici que j’ai découvert deux erreurs que je rencontre :

> root@forum:/var/discourse# ./launcher restart app
> 
> WARNING: We are about to start downloading the Discourse base image
> This process may take anywhere between a few minutes to an hour, depending on your network speed
> 
> Please be patient
> 
> Unable to find image 'discourse/base:2.0.20191013-2320' locally
> /usr/bin/docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
> See '/usr/bin/docker run --help'.
> Your Docker installation is not working correctly
> 
> See: `https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam`

J’ai consulté le lien suggéré. Il recommande un Git Pull et une reconstruction de Discourse (ce que vous verrez plus bas). Il suggère également d’exécuter une commande Docker “Hello World”. Cela fonctionne (bien qu’il semble y avoir quelques problèmes ?) :

> root@forum:/var/discourse# docker run -it --rm hello-world
> Unable to find image 'hello-world:latest' locally
> latest: Pulling from library/hello-world
> 1b930d010525: Pull complete
> Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
> Status: Downloaded newer image for hello-world:latest
> 
> Hello from Docker!
> This message shows that your installation appears to be working correctly.
> 
> To generate this message, Docker took the following steps:
>  1. The Docker client contacted the Docker daemon.
>  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
>     (amd64)
>  3. The Docker daemon created a new container from that image which runs the
>     executable that produces the output you are currently reading.
>  4. The Docker daemon streamed that output to the Docker client, which sent it
>     to your terminal.
> 
> To try something more ambitious, you can run an Ubuntu container with:
>  $ docker run -it ubuntu bash
> 
> Share images, automate workflows, and more with a free Docker ID:
>  https://hub.docker.com/
> 
> For more examples and ideas, visit:
>  https://docs.docker.com/get-started/
> 
> failed to resize tty, using default size

Eh bien, ensuite j’ai essayé le Bash Ubuntu… et erreur :

> root@forum:/var/discourse# docker run -it ubuntu bash
> Unable to find image 'ubuntu:latest' locally
> docker: Error response from daemon: Get https://registry-1.docker.io/v2/library/ubuntu/manifests/latest: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fubuntu%3Apull&service=registry.docker.io: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
> See 'docker run --help'.

Il est temps de passer à d’autres méthodes que je connais :

Arrêt et démarrage de Discourse

Je reçois la même chose qu’avec le Redémarrage :

> root@forum:/var/discourse# ./launcher stop app
> 
> WARNING: We are about to start downloading the Discourse base image
> This process may take anywhere between a few minutes to an hour, depending on your network speed
> 
> Please be patient
> 
> Unable to find image 'discourse/base:2.0.20191013-2320' locally
> /usr/bin/docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
> See '/usr/bin/docker run --help'.
> Your Docker installation is not working correctly
> 
> See: `https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam`
> 
> root@forum:/var/discourse# ./launcher start app
> 
> WARNING: We are about to start downloading the Discourse base image
> This process may take anywhere between a few minutes to an hour, depending on your network speed
> 
> Please be patient
> 
> Unable to find image 'discourse/base:2.0.20191013-2320' locally
> /usr/bin/docker: Error response from daemon: Get https://registry-1.docker.io/v2/discourse/base/manifests/2.0.20191013-2320: Get https://auth.docker.io/token?scope=repository%3Adiscourse%2Fbase%3Apull&service=registry.docker.io: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
> See '/usr/bin/docker run --help'.
> Your Docker installation is not working correctly
> 
> See: `https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam`

Reconstruction de Discourse

Et encore une fois, les mêmes deux erreurs.

> root@forum:/var/discourse# ./launcher rebuild app
> 
> WARNING: We are about to start downloading the Discourse base image
> This process may take anywhere between a few minutes to an hour, depending on your network speed
> 
> Please be patient
> 
> Unable to find image 'discourse/base:2.0.20191013-2320' locally
> /usr/bin/docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
> See '/usr/bin/docker run --help'.
> Your Docker installation is not working correctly
> 
> See: https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam

Restauration à partir d’une sauvegarde précédente

J’ai une capture d’état (snapshot) datant d’avant le déplacement du serveur et le nettoyage (qui, comme mentionné, a supprimé environ 4 Go de fichiers). J’ai tout réessayé ci-dessus… et même chose (à l’exception du Nettoyage), ainsi que l’erreur 502 Bad Gateway - nginx/1.14.0 (Ubuntu) dans un navigateur. Donc peut-être que cela n’a rien à voir avec le nettoyage ?

Tout au long de mon expérience avec Discourse, je n’ai jamais rencontré l’une de ces deux erreurs. Avez-vous des suggestions sur ce que je peux faire pour résoudre ces erreurs et faire fonctionner Discourse dans un navigateur ?

Votre serveur ne peut pas se connecter au Docker Hub pour télécharger les grandes images ; seule la petite image hello world a réussi.

Alors, comment puis-je remédier à cela ? Je n’ai pas beaucoup d’expérience avec Docker, donc je ne sais pas par où commencer.

Les seules choses Docker que je connais sont les commandes inclues dans l’installation de Discourse (avec des modifications, bien sûr, puisque Discourse est installé sur une machine virtuelle sur l’un de mes serveurs, et non sur un cloud tiers).

Quelle version de Docker exécutez-vous (docker info) ?

Pouvez-vous vérifier votre pile réseau pour détecter d’éventuels problèmes lors de l’établissement de connexions vers https://registry-1.docker.io/v2/ ?

Voici mes informations Docker :

root@forum:/var/discourse# docker info
Containers: 1
Running: 1
Paused: 0
Stopped: 0
Images: 3
Version du serveur : 18.09.5
Pilote de stockage : overlay2
Système de fichiers sous-jacent : extfs
Prend en charge d_type : true
Diff natif Overlay : true
Pilote de journalisation : json-file
Pilote de cgroup : cgroupfs
Plugins :
Volume : local
Réseau : bridge host macvlan null overlay
Journal : awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm : inactif
Exécuteurs : runc
Exécuteur par défaut : runc
Binaire d’initialisation : docker-init
Version de containerd : bb71b10fd8f58240ca47fbb579b9d1028eea7c84
Version de runc : 2b18fe1d885ee5083ef9f0838fee39b62d653e30
Version d’initialisation : fec3683
Options de sécurité :
apparmor
seccomp
Profil : par défaut
Version du noyau : 4.15.0-69-generic
Système d’exploitation : Ubuntu 18.04.2 LTS
Type OS : linux
Architecture : x86_64
CPU : 2
Mémoire totale : 6.805 Gio
Nom : forum
ID : 2RRX:ZQIT:R5AK:WNPR:VJ6Z:2EBY:PFOL:W5RD:GL3X:RUQM:YLJ4:2L2X
Répertoire racine Docker : /var/lib/docker
Mode débogage (client) : false
Mode débogage (serveur) : false
Registre : https://index.docker.io/v1/
Étiquettes :
Expérimental : false
Registres non sécurisés :
127.0.0.0/8
Restauration en direct activée : false
Licence du produit : Community Engine

AVERTISSEMENT : Prise en charge de la limite de swap absente

En ce qui concerne votre question :

Comment puis-je faire cela ?

@Falco J’ai donc essayé de résoudre ce problème plus avant, et je suis encore plus confus maintenant. Bonne et mauvaise nouvelle :

Bonne nouvelle

Après avoir effectué plusieurs reconstructions de Discourse (./launcher rebuild app), je ne reçois plus les erreurs Unable to find image ou Error response from daemon ! Lorsque je démarre/redémarre Discourse, aucune erreur n’apparaît :

> root@forum:/var/discourse# ./launcher start app
> 
> .+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=4 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e DISCOURSE_HOSTNAME=discourse.example.com -e DISCOURSE_DEVELOPER_EMAILS=admin@example.com,postmaster@example.com -e DISCOURSE_SMTP_ADDRESS=smtp.sparkpostmail.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=SMTP_Injection -e DISCOURSE_SMTP_PASSWORD=<CACHÉ_POUR_LA_VIE_PRIVÉE> -e LETSENCRYPT_ACCOUNT_EMAIL=admin@example.com -h forum-app -e DOCKER_HOST_IP=100.17.0.1 --name app -t -p 8080:80 -p 8443:443 -p 2222:22 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:96:f3:e6:e7:14 local_discourse/app /sbin/boot
> cebe89493bc79dab2c1716599629adfe3dc571c8659367e6ffa0d39b0e6d47af
> root@forum:/var/discourse# ./launcher restart app
> .+ /usr/bin/docker stop -t 10 app
> app
> 
> démarrage du conteneur existant
> .+ /usr/bin/docker start app
> app

Docker fonctionne également :
> root@forum:/var/discourse# systemctl status docker.service
> ● docker.service - Docker Application Container Engine
>    Chargé : chargé (/lib/systemd/system/docker.service; activé ; paramètres par défaut du fournisseur : activé)
>    Actif : actif (en cours d'exécution) depuis jeu. 2019-11-14 03:00:54 UTC ; il y a 17h
>      Docs : https://docs.docker.com
>  PID principal : 18721 (dockerd)
>     Tâches : 31
>    CGroup : /system.slice/docker.service
>            ├─ 1375 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8443 -container-ip 172.17.0.2 -container-port 443
>            ├─ 1387 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -container-port 80
>            ├─ 1399 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 2222 -container-ip 172.17.0.2 -container-port 22
>            └─18721 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
> 
> Nov 14 20:13:26 forum dockerd[18721]: time="2019-11-14T20:13:26.430856242Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:28 forum dockerd[18721]: time="2019-11-14T20:13:28.597999379Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:30 forum dockerd[18721]: time="2019-11-14T20:13:30.862158413Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:32 forum dockerd[18721]: time="2019-11-14T20:13:32.978285148Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:35 forum dockerd[18721]: time="2019-11-14T20:13:35.105130149Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:37 forum dockerd[18721]: time="2019-11-14T20:13:37.151466214Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:13:39 forum dockerd[18721]: time="2019-11-14T20:13:39.024948159Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:14:05 forum dockerd[18721]: time="2019-11-14T20:14:05.179759938Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
> Nov 14 20:14:16 forum dockerd[18721]: time="2019-11-14T20:14:16.078334393Z" level=info msg="Container cebe89493bc79dab2c1716599629adfe3dc571c8659367e6ffa0d39b0e6d47af failed to exit within
> Nov 14 20:14:16 forum dockerd[18721]: time="2019-11-14T20:14:16.281731176Z" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"

Mauvaise nouvelle

Je reçois toujours l’erreur 502 Bad Gateway - nginx/1.14.0 (Ubuntu) lorsque j’essaie d’ouvrir le site dans différents navigateurs. J’ai vidé leurs caches et essayé plusieurs navigateurs au cas où. Rien n’y fait.

Une chose que j’ai remarquée est que si j’essaie un nettoyage de Discourse, cela supprime pas mal de conteneurs :

> root@forum:/var/discourse# ./launcher cleanup
> WARNING! This will remove all stopped containers.
> Are you sure you want to continue? [y/N] y
> Total reclaimed space: 0B
> WARNING! This will remove all images without at least one container associated to them.
> Are you sure you want to continue? [y/N] y
> Deleted Images:
> untagged: hello-world:latest
> untagged: hello-world@sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
> deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
> deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
> untagged: discourse/base:2.0.20191013-2320
> untagged: discourse/base@sha256:77e010342aa5111c8c3b81d80de7d4bdb229793d595bbe373992cdb8f86ef41f
> deleted: sha256:53b44681b65ee5e9a9cadc6bd34c6aa6f6bcbbbe6270e61669c50bcd655c6898
> deleted: sha256:939a3ac6d5627270ae02a9f9ea05c580589cec0afa019b7f296fdd43157dd3a0
> 
> Total reclaimed space: 452.2MB

Maintenant, à chaque fois que j’essaie de démarrer/redémarrer… les erreurs reviennent ! Je suis revenu à l’état où les messages d’erreur Unable to find image ou Error response from daemon ont cessé d’apparaître. Il est clair que les conteneurs ont été reconstruits, et la suppression des images de conteneurs pose problème.

Si votre Docker est cassé (c’est-à-dire que docker run ubuntu échoue), Discourse ne fonctionnera certainement pas.

Pour obtenir une assistance spécifique à Docker, vous pouvez poster sur https://forums.docker.com/

@Falco Oui, je rencontre toujours les erreurs « Unable to find image locally » et « Error response from daemon » lorsque j’exécute cette commande, comme auparavant.

Donc, comme suggéré, j’ai ouvert un sujet sur le forum Docker. Malheureusement, aucune réponse pour le moment.

Donc, voici quelques nouvelles :

Bonne nouvelle

Je ne reçois plus l’erreur /usr/bin/docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers). !

docker run ubuntu ne signale plus d’erreur. @Falco, y a-t-il une sortie attendue que je devrais voir ?

root@forum:/var/discourse# docker run ubuntu
root@forum:/var/discourse#

Alors, qu’ai-je fait pour résoudre cette erreur ? J’ai remplacé le serveur de noms (DNS) utilisé sur cette VM par le service Google Public DNS :
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Cependant, je dois exécuter la commande ci-dessus à chaque fois après le redémarrage de la VM (il semble donc que ce soit temporaire), sinon j’obtiens les deux erreurs lorsque j’essaie d’exécuter n’importe quelle commande ./launcher. Par la suite, seule l’une des erreurs (Unable to find image 'discourse/base:2.0.20191013-2320' locally) apparaît, mais la commande semble se résoudre :

root@forum:/var/discourse# ./launcher start app

WARNING: We are about to start downloading the Discourse base image
This process may take anywhere between a few minutes to an hour, depending on your network speed

Please be patient

Unable to find image 'discourse/base:2.0.20191013-2320' locally
2.0.20191013-2320: Pulling from discourse/base
Digest: sha256:77e010342aa5111c8c3b81d80de7d4bdb229793d595bbe373992cdb8f86ef41f
Status: Downloaded newer image for discourse/base:2.0.20191013-2320

starting up existing container
+ /usr/bin/docker start app
app

Je semble également pouvoir exécuter ./launcher rebuild app sans erreurs. Voici la dernière chose affichée par la sortie de la commande (les URL et l’adresse MAC sont masquées) :

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=4 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e DISCOURSE_HOSTNAME=discourse.domain.com -e DISCOURSE_DEVELOPER_EMAILS=admin@domain.com,postmaster@domain.com -e DISCOURSE_SMTP_ADDRESS=smtp.sparkpostmail.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=SMTP_Injection -e DISCOURSE_SMTP_PASSWORD=0d431cd177ce3d35833aa823d498eb57c7c4e99c -e LETSENCRYPT_ACCOUNT_EMAIL=admin@domain.com -h forum-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 8080:80 -p 8443:443 -p 2222:22 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 00:00:00:00:00:01 local_discourse/app /sbin/boot
abb788d4a6fd301d88f129189a07a19c4a6bfc8554d43c555d3e3cd126374736

Mauvaise nouvelle

Je reçois toujours l’erreur 502 Bad Gateway - nginx/1.14.0 (Ubuntu) lorsque j’essaie d’accéder à la page.

Quel autre problème pourrait-il y avoir ? Des suggestions ?

J’ai résolu mon problème ! Mon forum Discourse apparaît maintenant dans un navigateur !

Pour être plus précis, Francis Day sur les forums Nginx a résolu mon problème ! C’était bien Nginx, tout compte fait. Voici ce que j’ai fait :

  1. Je me suis connecté à ma machine virtuelle Nginx.
  2. J’ai édité le fichier de configuration Discourse avec VIM : vim /etc/nginx/sites-available/discourse.conf
  3. Voici à quoi ressemblait mon fichier de configuration Discourse (bien sûr, je n’utilise pas le nom de domaine que j’utiliserais normalement, et où 192.168.0.101 = machine virtuelle Nginx et 192.168.0.104 = machine virtuelle Discourse).
  4. J’ai effectué un seul changement : j’ai remplacé proxy_pass http://discourse.domainame.com:8080/; par proxy_pass 192.168.0.104:8080/;. Ainsi, proxy_pass est défini sur l’adresse IP locale de la machine virtuelle Discourse, au lieu du nom d’hôte.
  5. J’ai enregistré le fichier de configuration, puis j’ai rechargé (systemctl reload nginx.service) et redémarré (systemctl restart nginx.service) Nginx.
  6. Et voilà ! J’ai actualisé l’URL de Discourse, et tout fonctionne ! Je n’ai même pas eu besoin de redémarrer ou de reconstruire Discourse !

J’espère que quelqu’un trouvera utile ce que j’ai écrit ici, car la configuration d’un proxy inverse pour Discourse via Nginx peut être vraiment délicate.