502 Bad Gateway - nginx/1.14.0 (Ubuntu): Impossibile trovare l'immagine localmente + Risposta di errore dal daemon

Recentemente ho spostato il mio server Dell da una posizione all’altra. Il suo sistema operativo principale/Gestore di VM è Proxmox VE 5.3. Ho una VM Nginx che fa da Reverse Proxy per diverse altre VM, una delle quali è una VM Discourse.

Dopo aver configurato il mio nuovo router, ho fatto sì che diverse delle mie VM si connettessero a Internet (senza nemmeno dover rinnovare i certificati SSL). Tuttavia, con Discourse, ricevo 502 Bad Gateway - nginx/1.14.0 (Ubuntu) quando provo ad accedere a Discourse da un browser.

Ho ricevuto questo errore in passato, ma di solito uno dei metodi seguenti lo risolve:

Riavvio della VM Discourse

Ancora 502 Bad Gateway - nginx/1.14.0 (Ubuntu) nel browser.

Cancellazione dei cookie del browser e prova con browser diversi

Solo per escludere che il problema sia dalla mia parte… no. Stesso 502 Bad Gateway - nginx/1.14.0 (Ubuntu) in vari browser.

Pulizia di Discourse e controllo dello spazio su disco

Inizialmente, durante la pulizia, sono stati rimossi circa 4 GB di dati. Sono rimasto molto sorpreso. Forse è quello che ha causato il problema in primo luogo? Comunque, ora quando provo a pulire 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

Voglio anche ribadire che non sono a corto di spazio su disco:

Git Pull

È aggiornato all’ultima versione.

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

Riavvio di Discourse

È qui che ho scoperto due errori che sto ricevendo:

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

Ho controllato il link suggerito. Raccomanda un Git Pull e di Ricostruire Discourse (come vedrai più avanti). Suggerisce anche di eseguire un comando Docker “Hello World”. Funziona (anche se sembra avere alcuni problemi?):

> 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

Bene, dopo ho provato Ubuntu Bash… ed errore:

> 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 momento di passare ad altri metodi che conosco:

Arresto e avvio di Discourse

Ricevo la stessa cosa che con il Riavvio:

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

Ricostruzione di Discourse

E ricevo di nuovo gli stessi due errori.

> 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

Ripristino da un backup precedente

Ho uno snapshot di un periodo precedente allo spostamento del server e alla pulizia (che, come detto, ha rimosso circa 4 GB di file). Ho riprovato tutti i metodi sopra… e la stessa cosa (esclusa la Pulizia), oltre al 502 Bad Gateway - nginx/1.14.0 (Ubuntu) nel browser. Quindi forse non c’entra nulla con la pulizia?

In tutto il tempo che uso Discourse, non mi sono mai imbattuto in nessuno di questi errori. Qualche suggerimento su cosa posso fare per risolvere questi errori e far funzionare Discourse nel browser?

Il tuo server non riesce a connettersi a Docker Hub per scaricare immagini di grandi dimensioni; è riuscito solo il download della piccola immagine hello world.

Quindi come posso rimediare? Non ho molta esperienza con Docker, quindi non so da dove iniziare.

L’unico materiale Docker che conosco sono i comandi inclusi nell’installazione di Discourse (con le dovute modifiche, ovviamente, dato che Discourse è installato su una VM sul mio server e non su un cloud di terze parti).

Quale versione di Docker stai eseguendo (docker info)?

Puoi controllare lo stack di rete per eventuali problemi nella creazione di connessioni a https://registry-1.docker.io/v2/?

Ecco le mie informazioni su Docker:

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

Per quanto riguarda la tua domanda:

Come posso farlo?

@Falco Quindi ho continuato a risolvere questo problema e ora sono ancora più confuso. Buone notizie e cattive notizie:

Buone notizie

Dopo aver eseguito diversi Discourse Rebuilds (./launcher rebuild app), non ricevo più gli errori Unable to find image o Error response from daemon! Quando avvio/riavvio Discourse, non vedo errori:

> 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=<HIDING-FOR-PRICACY> -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
> 
> starting up existing container
> .+ /usr/bin/docker start app
> app

Docker è anche in esecuzione:
> root@forum:/var/discourse# systemctl status docker.service
> ● docker.service - Docker Application Container Engine
>    Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
>    Active: active (running) since Thu 2019-11-14 03:00:54 UTC; 17h ago
>      Docs: https://docs.docker.com
>  Main PID: 18721 (dockerd)
>     Tasks: 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"

Cattive notizie

Ricevo ancora l’errore 502 Bad Gateway - nginx/1.14.0 (Ubuntu) quando provo ad aprire il sito in vari browser. Ho svuotato le cache e provato più browser, ma niente da fare.

Una cosa che ho notato è che se provo a eseguire un Discourse Cleanup, vengono rimossi molti container:

> 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

Ora ogni volta che provo ad avviare/riavviare… gli errori sono tornati! Sono tornato indietro al momento in cui gli errori Unable to find image o Error response from daemon hanno smesso di apparire. È chiaro che i container sono stati ricostruiti, e la cancellazione delle immagini dei container causa problemi.

Se il tuo Docker non funziona (ovvero docker run ubuntu fallisce), Discourse sicuramente non funzionerà.

Per ottenere supporto specifico su Docker, puoi provare a pubblicare su https://forums.docker.com/

@Falco Sì, sto ricevendo gli errori Unable to find image locally e Error response from daemon come prima quando eseguo quel comando.

Quindi, come suggerito da te, ho avviato un argomento nei forum di Docker. Purtroppo non ho ancora ricevuto risposta.

Quindi ecco qualche altra notizia:

Buone notizie

Non ricevo più questo errore: /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 non segnala più errori. @Falco, dovrei vedere qualche output?

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

Quindi cosa ho fatto per risolvere l’errore? Ho sostituito il nameserver (DNS) utilizzato su questa VM con il servizio Google Public DNS:
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Devo eseguire il comando sopra ogni volta dopo che la VM è stata riavviata (quindi sembra essere solo temporaneo), altrimenti ricevo i due errori quando provo a eseguire qualsiasi comando ./launcher. Dopo di che, appare solo uno dei due errori (Unable to find image 'discourse/base:2.0.20191013-2320' locally), ma il comando sembra risolvere:

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

Sembra anche che possa eseguire ./launcher rebuild app senza errori. Ecco l’ultima parte dell’output del comando (nascondendo URL e indirizzo MAC):

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

Cattive notizie

Ricevo ancora l’errore 502 Bad Gateway - nginx/1.14.0 (Ubuntu) quando provo ad accedere alla pagina.

Cosa altro potrebbe essere il problema? Hai qualche suggerimento?

Ho risolto il mio problema! Ora il mio forum Discourse appare nel browser!

Più precisamente, Francis Day sui forum di Nginx ha risolto il mio problema! Era davvero Nginx, come pensavo. Ecco cosa ho fatto:

  1. Ho effettuato l’accesso alla mia VM Nginx.
  2. Ho modificato il file di configurazione di Discourse con VIM: vim /etc/nginx/sites-available/discourse.conf
  3. Ecco com’era il mio file di configurazione Discourse (ovviamente senza usare il nome di dominio che userei normalmente, e dove 192.168.0.101 = VM Nginx e 192.168.0.104 = VM Discourse).
  4. Ho apportato una sola modifica: ho cambiato proxy_pass http://discourse.domainame.com:8080/; in proxy_pass 192.168.0.104:8080/;. Quindi proxy_pass è impostato sull’IP locale della VM Discourse invece che sul nome host.
  5. Ho salvato il file di configurazione e poi ricaricato (systemctl reload nginx.service) e riavviato (systemctl restart nginx.service) Nginx.
  6. Eccolo! Aggiorno l’URL di Discourse e appare! Non ho nemmeno dovuto riavviare/ricostruire Discourse!

Spero che qualcuno trovi utile quanto ho scritto qui, poiché configurare un reverse proxy per Discourse tramite Nginx può essere davvero complicato.