502 Bad Gateway - nginx/1.14.0 (Ubuntu): Bild lokal nicht gefunden + Fehlerantwort vom Daemon

Kürzlich habe ich meinen Dell-Server von einem Standort an einen anderen verlegt. Sein Haupt-Betriebssystem/VM-Manager ist Proxmox VE 5.3. Ich habe eine Nginx-VM, die als Reverse-Proxy für mehrere andere VMs fungiert, darunter eine Discourse-VM.

Nach der Konfiguration meines neuen Routers konnte ich mehrere meiner VMs mit dem Internet verbinden (ohne dass die SSL-Zertifikate erneuert werden mussten). Bei Discourse erhalte ich jedoch beim Versuch, über einen Browser auf Discourse zuzugreifen, die Fehlermeldung 502 Bad Gateway - nginx/1.14.0 (Ubuntu).

Ich habe diesen Fehler bereits zuvor erhalten, aber normalerweise wird er durch eine der folgenden Methoden behoben:

Discourse-VM neu starten

Immer noch 502 Bad Gateway - nginx/1.14.0 (Ubuntu) im Browser.

Browser-Cookies löschen und andere Browser ausprobieren

Nur um sicherzugehen, dass es nicht an mir liegt … nein. Gleicher 502 Bad Gateway - nginx/1.14.0 (Ubuntu)-Fehler in verschiedenen Browsern.

Discourse-Bereinigung und Überprüfung des Festplattenspeichers

Bei der ersten Bereinigung wurden etwa 4 GB Daten entfernt. Das hat mich sehr überrascht. Vielleicht war das der Auslöser des Problems? Wie auch immer, wenn ich jetzt versuche, Discourse zu bereinigen:

> 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

Ich möchte auch betonen, dass mir nicht der Festplattenspeicher ausgeht:

Git Pull

Es ist auf dem neuesten Stand.

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

Discourse neu starten

Hier habe ich zwei Fehler entdeckt, die ich erhalte:

> 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`

Ich habe den vorgeschlagenen Link geprüft. Dort wird ein Git Pull und ein Neubau von Discourse empfohlen (dazu sehen Sie später unten, was ich erhalte). Es wird auch vorgeschlagen, einen Docker-“Hello World”-Befehl auszuführen. Das funktioniert (obwohl es einige Probleme zu geben scheint?):

> 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

Nun habe ich den Ubuntu Bash-Versuch gemacht … und Fehler:

> 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'.

Zeit, zu anderen mir bekannten Methoden überzugehen:

Discourse anhalten und starten

Ich erhalte dasselbe wie beim Neustart:

> 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`

Discourse neu aufbauen

Und wieder erhalte ich dieselben beiden Fehler.

> 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

Wiederherstellung aus einem früheren Backup

Ich habe einen Snapshot von einem Zeitpunkt vor dem Umzug des Servers und der Bereinigung (die, wie erwähnt, etwa 4 GB Dateien entfernt hat). Ich habe alle oben genannten Schritte erneut versucht … und es passiert dasselbe (abgesehen von der Bereinigung), sowie der 502 Bad Gateway - nginx/1.14.0 (Ubuntu)-Fehler im Browser. Vielleicht hat dies also nichts mit der Bereinigung zu tun?

In all meiner Zeit mit Discourse bin ich noch nie auf einen dieser beiden Fehler gestoßen. Haben Sie Vorschläge, wie ich diese Fehler beheben und Discourse wieder im Browser zum Laufen bringen kann?

Ihr Server kann keine Verbindung zum Docker Hub herstellen, um große Images herunterzuladen. Nur das kleine Hello-World-Image war erfolgreich.

Wie behebe ich das also? Ich habe nicht viel Erfahrung mit Docker und weiß nicht, wo ich anfangen soll.

Das Einzige, was ich über Docker weiß, sind die Befehle, die in der Discourse-Installation enthalten sind (natürlich mit Anpassungen, da Discourse auf einer VM auf meinem Server installiert ist und nicht auf einer Cloud eines Drittanbieters).

Welche Docker-Version verwenden Sie? (docker info)

Können Sie Ihren Netzwerk-Stack auf Probleme beim Herstellen von Verbindungen zu https://registry-1.docker.io/v2/ überprüfen?

Hier sind meine Docker-Informationen:

root@forum:/var/discourse# docker info
Containers: 1
Running: 1
Paused: 0
Stopped: 0
Images: 3
Server Version: 18.09.5
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.15.0-69-generic
Operating System: Ubuntu 18.04.2 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 6.805GiB
Name: forum
ID: 2RRX:ZQIT:R5AK:WNPR:VJ6Z:2EBY:PFOL:W5RD:GL3X:RUQM:YLJ4:2L2X
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine

WARNING: No swap limit support

Zu deiner Frage:

Wie mache ich das?

@Falco Ich habe versucht, dieses Problem weiter zu untersuchen, und bin jetzt noch verwirrter. Gute und schlechte Nachrichten:

Gute Nachrichten

Nach mehreren Discourse-Rebuilds (./launcher rebuild app) erhalte ich keine Fehlermeldungen mehr wie „Unable to find image

Wenn dein Docker defekt ist (d. h. docker run ubuntu schlägt fehl), wird Discourse mit Sicherheit nicht funktionieren.

Für Docker-spezifische Unterstützung kannst du versuchen, einen Beitrag auf https://forums.docker.com/ zu veröffentlichen.

@Falco Ja, ich erhalte weiterhin die Fehler Unable to find image locally und Error response from daemon, wie bereits zuvor beim Ausführen dieses Befehls.

Wie von dir vorgeschlagen, habe ich ein Thema in den Docker-Foren gestartet. Leider gab es bisher noch keine Rückmeldung.

Also noch ein paar Neuigkeiten:

Gute Nachrichten

Ich bekomme nicht mehr die folgende Fehlermeldung: /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 meldet keinen Fehler mehr. @Falco, sollte hier eine Ausgabe erscheinen, die ich sehen muss?

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

Was habe ich also getan, um den Fehler zu beheben? Ich habe den auf dieser VM verwendeten Nameserver (DNS) durch den Google Public DNS-Dienst ersetzt:
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Allerdings muss ich diesen Befehl jedes Mal nach einem Neustart der VM erneut ausführen (es scheint also nur temporär zu sein), sonst bekomme ich die beiden Fehlermeldungen, wenn ich versuche, beliebige ./launcher-Befehle auszuführen. Danach taucht nur noch einer der Fehler auf (Unable to find image 'discourse/base:2.0.20191013-2320' locally), aber der Befehl scheint erfolgreich abzulaufen:

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

Außerdem scheint ./launcher rebuild app ebenfalls ohne Fehler auszuführen. Hier ist der letzte Teil der Ausgabe des Befehls (URLs und MAC-Adresse wurden ausgeblendet):

+ /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

Schlechte Nachrichten

Ich bekomme weiterhin den Fehler 502 Bad Gateway - nginx/1.14.0 (Ubuntu), wenn ich die Seite aufrufe.

Was könnte sonst noch das Problem sein? Hast du irgendwelche Vorschläge?

Ich habe mein Problem gelöst! Mein Discourse-Forum wird jetzt im Browser angezeigt!

Genauer gesagt hat Francis Day in den Nginx-Foren mein Problem gelöst! Es war tatsächlich die ganze Zeit über Nginx. Hier ist, was ich getan habe:

  1. Ich habe mich auf meiner Nginx-VM angemeldet.
  2. Ich habe die Discourse-KONFIG-Datei mit VIM bearbeitet: vim /etc/nginx/sites-available/discourse.conf
  3. So sah meine Discourse-KONFIG-Datei aus (offensichtlich habe ich nicht den Domainnamen verwendet, den ich normalerweise nutzen würde, und 192.168.0.101 = Nginx-VM sowie 192.168.0.104 = Discourse-VM).
  4. Ich habe nur eine Änderung vorgenommen: Ich habe proxy_pass http://discourse.domainame.com:8080/; in proxy_pass 192.168.0.104:8080/; geändert. Also ist proxy_pass auf die lokale IP der Discourse-VM anstatt auf den Hostnamen gesetzt.
  5. Ich habe die KONFIG-Datei gespeichert und dann Nginx neu geladen (systemctl reload nginx.service) und neu gestartet (systemctl restart nginx.service).
  6. Wunderbar! Ich aktualisiere die Discourse-URL, und sie wird angezeigt! Ich musste Discourse nicht einmal neu starten/neu aufbauen!

Ich hoffe, jemand findet das, was ich hier geschrieben habe, nützlich, da das Reverse-Proxying von Discourse über Nginx wirklich knifflig sein kann.