Трафик Бад Гейтвей

У меня странная проблема. У меня есть следующие настройки: один докер-хост, выполняющий 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"
Другие вопросы по тегам