502 Bad Gateway - nginx/1.14.0 (Ubuntu): Невозможно найти образ локально + Ошибка ответа от демона

Недавно я переместил сервер Dell в другое место. Основная ОС/менеджер виртуальных машин — Proxmox VE 5.3. У меня есть ВМ с Nginx, которая работает как обратный прокси для нескольких других ВМ, одна из которых — ВМ с Discourse.

После настройки нового роутера я смог подключить несколько ВМ к Интернету (даже без необходимости обновления SSL-сертификатов). Однако при попытке доступа к Discourse в браузере я получаю ошибку 502 Bad Gateway - nginx/1.14.0 (Ubuntu).

Я уже сталкивался с этой ошибкой раньше, но обычно один из следующих методов её исправлял:

Перезапуск ВМ с Discourse

В браузере всё ещё отображается 502 Bad Gateway - nginx/1.14.0 (Ubuntu).

Очистка куки в браузере и попытка открыть в других браузерах

На случай, если проблема на моей стороне… нет. Та же ошибка 502 Bad Gateway - nginx/1.14.0 (Ubuntu) в разных браузерах.

Очистка Discourse и проверка свободного места на диске

При первоначальной очистке было удалено около 4 ГБ данных. Я был очень удивлён. Возможно, это и стало причиной проблемы? В любом случае, теперь при попытке выполнить очистку 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

Хочу также подчеркнуть, что у меня нет нехватки места на диске:

Git Pull

Всё актуально.

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

Перезапуск Discourse

Именно здесь я обнаружил две ошибки, которые получаю:

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

Я проверил предложенную ссылку. Там рекомендуется выполнить Git Pull и пересобрать Discourse (что вы увидите ниже). Также предлагается запустить команду Docker “Hello World”. Она работает (хотя, кажется, есть некоторые проблемы):

> 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

Далее я попробовал запустить Ubuntu Bash… и получил ошибку:

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

Пришло время перейти к другим известным мне методам:

Остановка и запуск Discourse

Получаю ту же ошибку, что и при перезапуске:

> 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

И снова получаю те же две ошибки.

> 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

Восстановление из предыдущей резервной копии

У меня есть снимок системы на момент до перемещения сервера и выполнения очистки (которая, как упоминалось, удалила около 4 ГБ файлов). Я снова попробовал все вышеописанные методы… и получил тот же результат (кроме очистки), а также ошибку 502 Bad Gateway - nginx/1.14.0 (Ubuntu) в браузере. Возможно, это вообще не связано с очисткой?

За всё время работы с Discourse я никогда не сталкивался с этими ошибками. Есть ли у кого-нибудь предложения, как их исправить и запустить Discourse в браузере?

Ваш сервер не может подключиться к Docker Hub для загрузки больших образов; успешно загрузился только небольшой образ hello-world.

Итак, как мне это исправить? У меня мало опыта работы с Docker, поэтому я не знаю, с чего начать.

Единственные команды Docker, которые я знаю, — это те, что указаны в руководстве по установке Discourse (с соответствующими модификациями, разумеется, так как Discourse установлен на виртуальной машине на моём сервере, а не на стороннем облачном провайдере).

Какую версию Docker вы используете (docker info)?

Можете проверить свой сетевой стек на наличие проблем при установлении соединений с https://registry-1.docker.io/v2/?

Вот информация о моем 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

Что касается вашего вопроса:

Как мне это сделать?

@Falco Итак, я попытался ещё глубже разобраться в этой проблеме, и теперь я ещё больше запутался. Хорошие и плохие новости:

Хорошие новости

После выполнения нескольких пересборок Discourse (./launcher rebuild app) я больше не получаю ошибок Unable to find image или Error response from daemon! При запуске/перезапуске Discourse ошибок нет:

> 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=<СКРЫТО-РАДИ-КОНФИДЕНЦИАЛЬНОСТИ> -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
> 
> запуск существующего контейнера
> .+ /usr/bin/docker start app
> app

Docker также запущен:
> 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"

Плохие новости

При попытке открыть сайт в различных браузерах по-прежнему появляется ошибка 502 Bad Gateway - nginx/1.14.0 (Ubuntu). Я очистил кэши и попробовал несколько браузеров на всякий случай. Безрезультатно.

Одна вещь, которую я заметил: если я пытаюсь выполнить очистку 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
> 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

Теперь при каждой попытке запуска/перезапуска… ошибки возвращаются! Я откатился к моменту, когда сообщения об ошибках Unable to find image или Error response from daemon перестали появляться. Очевидно, что контейнеры были пересобраны, а удаление образов контейнеров вызывает проблемы.

Если ваш Docker сломан (то есть docker run ubuntu не работает), Discourse, скорее всего, тоже не будет работать.

Для получения специфической поддержки Docker вы можете попробовать разместить вопрос на https://forums.docker.com/

@Falco Да, я получаю ошибки Unable to find image locally и Error response from daemon, как и раньше, при выполнении этой команды.

Поэтому, как вы и предложили, я создал тему на форуме Docker. К сожалению, пока ответа нет.

Так, ещё немного новостей:

Хорошие новости

У меня больше нет ошибки /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 больше не выдаёт ошибку. @Falco, должен ли быть какой-то вывод, который я должен видеть?

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

Итак, что я сделал, чтобы устранить ошибку? Я заменил сервер имён (DNS), используемый на этой виртуальной машине, на публичный DNS-сервис Google:
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Однако мне приходится запускать эту команду каждый раз после перезагрузки виртуальной машины (похоже, это временное решение), иначе при попытке выполнить любые команды ./launcher я снова получу две ошибки. После этого появляется только одна из ошибок (Unable to find image 'discourse/base:2.0.20191013-2320' locally), но команда, кажется, выполняется успешно:

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

Также у меня получается выполнить ./launcher rebuild app без ошибок. Вот последнее, что показывает вывод команды (URL-адреса и 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

Плохие новости

Я всё ещё получаю ошибку 502 Bad Gateway - nginx/1.14.0 (Ubuntu), когда пытаюсь открыть страницу.

Что ещё может быть проблемой? Есть какие-либо предложения?}

Я решил свою проблему! Мой форум Discourse теперь отображается в браузере!

Если быть точнее, Фрэнсис Дей на форуме Nginx помог мне решить проблему! Дело действительно было в Nginx. Вот что я сделал:

  1. Зашел в свою виртуальную машину (VM) с Nginx.
  2. Отредактировал конфигурационный файл Discourse: vim /etc/nginx/sites-available/discourse.conf.
  3. Вот как выглядел мой конфигурационный файл Discourse (очевидно, что я не использовал доменное имя, которое обычно использую, и где 192.168.0.101 — это VM с Nginx, а 192.168.0.104 — VM с Discourse).
  4. Я внес только одно изменение: заменил proxy_pass http://discourse.domainame.com:8080/; на proxy_pass 192.168.0.104:8080/;. Таким образом, proxy_pass теперь указывает на локальный IP-адрес VM с Discourse, а не на имя хоста.
  5. Сохранил конфигурационный файл, затем перезагрузил (systemctl reload nginx.service) и перезапустил (systemctl restart nginx.service) Nginx.
  6. Готово! Я обновил страницу с URL Discourse, и всё заработало! Даже не пришлось перезапускать или пересобирать Discourse!

Надеюсь, кому-то окажется полезным то, что я здесь написал, так как настройка обратного прокси для Discourse через Nginx может быть действительно сложной задачей.