9

我有一些奇怪的问题。我有以下设置:一个 docker-host 运行 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 traefik 调试输出结束显示:

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 有关吗?

4

7 回答 7

14

对于遇到相同问题的任何人:

在重新创建网络(代理)并重新启动每个站点/容器后,它现在似乎可以工作了。我仍然不知道问题出在哪里。

于 2018-03-21T23:33:24.610 回答
7

如果你看到Bad GatewayTraefik 很有可能你遇到了 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或使用标签为给定服务定义/覆盖它。

于 2019-10-02T13:35:16.163 回答
6

另一个原因可能是您可能不小心映射到了 vm 的端口而不是容器端口。

我对 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"

同样一般不要这样做,而不是暴露端口,而是尝试使用 docker 网络,它们会更好、更干净。我像一年前一样制作了配置文档,这对我来说更像是一个初学者的错误,但可能会对某人有所帮助:)

于 2021-05-25T08:39:54.173 回答
4

在您的示例中,您没有启用 traefik:

traefik.enable=false

确保首先启用它,然后测试您的容器。

于 2018-03-21T23:35:24.157 回答
4

遇到了同样的问题,上面提到的答案都没有为我解决。在我的情况下,添加了错误的负载均衡器。删除标签或将其更改为正确的端口就可以了。

 - "traefik.http.services.XXX.loadbalancer.server.port=XXX"
于 2020-11-11T22:36:06.153 回答
2

当容器中的 Web 服务器不允许来自 traefik 的流量时返回错误“bad gateway”,例如由于错误的接口绑定(如 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 } }"

这为我解决了这个问题。

于 2020-12-06T20:48:40.463 回答
1

另一个原因可能是容器暴露在 Traefik 已经使用的端口。

于 2020-12-01T17:56:25.083 回答