Трафик Бад Гейтвей
У меня странная проблема. У меня есть следующие настройки: один докер-хост, выполняющий traefik в качестве LB, обслуживающий несколько сайтов. сайты наиболее php/apache. HTTPS управляется traefik. Каждый сайт запускается с использованием docker-compose YAML, содержащего следующее:
version: '2.3'
services:
redis:
image: redis:alpine
container_name: ${PROJECT}-redis
networks:
- internal
php:
image: registry.gitlab.com/OUR_NAMESPACE/docker/php:${PHP_IMAGE_TAG}
environment:
- APACHE_DOCUMENT_ROOT=${APACHE_DOCUMENT_ROOT}
container_name: ${PROJECT}-php-fpm
volumes:
- ${PROJECT_PATH}:/var/www/html:cached
- .docker/php/php-ini-overrides.ini:/usr/local/etc/php/conf.d/99-overrides.ini
ports:
- 80
networks:
- proxy
- internal
labels:
- traefik.enable=true
- traefik.port=80
- traefik.frontend.headers.SSLRedirect=false
- traefik.frontend.rule=Host:${PROJECT}
- "traefik.docker.network=proxy"
networks:
proxy:
external:
name: proxy
internal:
(в качестве PHP мы используем 5.6.33-apache-jessie или 7.1.12-apache fe)
В дополнение к вышесказанному, некоторые сайты получают следующие ярлыки:
traefik.docker.network=proxy
traefik.enable=true
traefik.frontend.headers.SSLRedirect=true
traefik.frontend.rule=Host:example.com, www.example.com
traefik.port=80
traefik.protocol=http
мы получаем, что некоторые запросы заканчиваются выводом отладочной программы 502 Bad Gateway:
time="2018-03-21T12:20:21Z" level=debug msg="vulcand/oxy/forward/http: Round trip: http://172.18.0.8:80, code: 502, Length: 11, duration: 2.516057159s"
может кто-нибудь помочь с этим? это совершенно случайно, когда это происходит наш traefik.toml:
debug = true
checkNewVersion = true
logLevel = "DEBUG"
defaultEntryPoints = ["https", "http"]
[accessLog]
[web]
address = ":8080"
[web.auth.digest]
users = ["admin:traefik:some-encoded-pass"]
[entryPoints]
[entryPoints.http]
address = ":80"
# [entryPoints.http.redirect] # had to disable this because HTTPS must be enable manually (not my decission)
# entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[retry]
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "example.com"
watch = true
exposedbydefault = false
[acme]
email = "info@example.com"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"
Может ли проблема быть связана с использованием того же docker-compose.yml?
10 ответов
Для тех, кто получает ту же проблему:
После воссоздания сети (прокси-сервера) и перезапуска каждого сайта / контейнера он, кажется, теперь работает. Я до сих пор не знаю, откуда возникла проблема.
Другая причина может заключаться в том, что вы могли случайно сопоставить порт виртуальной машины вместо порта контейнера.
Я изменил сопоставление портов в файле docker-compose и забыл обновить помеченный порт, чтобы он пытался сопоставить порт на компьютере, к которому не было прикреплено никаких процессов.
Неправильный способ:
ports:
- "8080:8081"
labels:
- "traefik.http.services.front-web.loadbalancer.server.port=8080"
Правильно
ports:
- "8080:8081"
labels:
- "traefik.http.services.front-web.loadbalancer.server.port=8081"
Также вообще не делайте этого, вместо того, чтобы открывать порты, попробуйте сети докеров, они намного лучше и чище. Я сделал свою конфигурационную документацию год назад, и это была ошибка новичка с моей стороны, но может кому-то помочь :)
Если ты видишь Bad Gateway
с Traefik, скорее всего, у вас проблемы с сетью Docker. Сначала взгляните на эту проблему и подумайте над этим решением. Тогда взгляни на providers.docker.network
(Traefik 2.0) или, в вашем случае, docker.network
настройка (Traefik 1.7).
Вы можете добавить значение по умолчанию network
Вот:
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "example.com"
watch = true
exposedbydefault = false
network = "proxy"
Или определите / переопределите его для данной службы, используя traefik.docker.network
этикетка.
Получил ту же проблему, и ни один из вышеупомянутых ответов не решил ее для меня. В моем случае был добавлен неправильный балансировщик нагрузки. Удалите этикетку или замените ее на правильный порт.
- "traefik.http.services.XXX.loadbalancer.server.port=XXX"
В вашем примере у вас не включен traefik:
traefik.enable=false
Обязательно сначала включите его, а затем протестируйте свои контейнеры.
Ошибка «плохой шлюз» возвращается, когда веб-сервер в контейнере не разрешает трафик от traefik, например, из-за неправильной привязки интерфейса, такой как localhost вместо 0.0.0.0.
Возьмем, к примеру, Ruby on Rails. Его веб-сервер puma по умолчанию настроен следующим образом (см. Config / puma.rb):
port ENV.fetch("PORT") { 3000 }
Но для того, чтобы разрешить доступ из traefik, puma должна привязаться к 0.0.0.0 следующим образом:
bind "tcp://0.0.0.0:#{ ENV.fetch("PORT") { 3000 } }"
Это решило проблему для меня.
Я забыл выставить порт в моем
Dockerfile
вот почему traefik не нашел порт для маршрутизации. Поэтому предоставьте порт ДО того, как вы запустите приложение, например node:
#other stuff before...
EXPOSE 3000
CMD ["node", "dist/main" ]
Или, если у вас открыто несколько портов, вы должны указать, на какой порт traefik должен направлять домен с помощью:
- "traefik.http.services.myservice.loadbalancer.server.port=3000"
Или посмотреть документы
Другой причиной может быть обнаружение контейнера в порту, который уже использует Traefik.
Я столкнулся с очень близкой проблемой для этого исключения, моя проблема не была связана с сетевыми настройками или конфигурацией, после того, как мы выяснили, что открытый порт из внутреннего контейнера не похож на порт, который мы сопоставляем для доступа к форме вне сервисного порта, был 5000 и мы сопоставили 9000:9000, решение состояло в том, чтобы исправить проблему с портом сначала 9000:5000.
Выставляем порт 80 для траефика
services:
php:
expose:
- "80"