Traefik 坏网关
Posted
技术标签:
【中文标题】Traefik 坏网关【英文标题】:Traefik Bad Gateway 【发布时间】:2018-08-30 14:19:27 【问题描述】:我遇到了一些奇怪的问题。我有以下设置: 一个 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 f.e.)
除上述之外,一些网站还获得以下标签:
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 有关?
【问题讨论】:
基于此页面的浏览量(18 个月内 13k)和当前的赞成票数 (1),我建议将问题更新为更精简的内容。 大问题也需要爱。 【参考方案1】:对于遇到相同问题的任何人:
重新创建网络(代理)并重新启动每个站点/容器后,它现在似乎可以工作了。 我仍然不知道问题出在哪里。
【讨论】:
对我来说唯一的道理是:只有删除和添加网络才能完成这项工作。经过多次尝试,例如将 traefik 版本从 1.5 升级到 1.6.6,比较其他服务之间的配置,尝试不同的配置,对我来说唯一的修复是删除并创建 docker 网络。我不知道为什么会出现这个问题,但在生产环境中是一个大问题。 嗨@MarcoBlos,你是如何删除网络的?当我尝试删除它时,我收到错误network is in use by service...
我只能再次 rm
和 deploy
我的堆栈,并且错误仍然存在。
嗨@gcstr...要删除网络,您需要删除与网络链接的所有服务...。再次创建网络并再次部署您的堆栈...我知道,这并不酷.
@MarcoBlos 你能澄清一下这应该怎么做吗?这些是 docker 命令还是 docker-compose 命令?以及如何重新创建和部署网络?
嗨@Julien。这项工作是手动完成的,但是,如果需要,您可以自动执行此过程。首先你需要删除所有与网络相关的docker服务(你可以使用这个命令列出所有服务docker service ls
然后选择你要删除的服务名称并执行docker service rm my-service-name
)。之后,您需要使用此命令docker network rm my-network-name
删除网络。完成此过程后,使用此命令 docker network create --driver overlay my-network
再次创建网络,最后您可以再次部署您的服务。【参考方案2】:
如果您看到带有 Traefik 的 Bad Gateway
,那么您可能遇到了 Docker 网络问题。首先查看this issue 并考虑this solution。然后看看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
标签为给定服务定义/覆盖它。
【讨论】:
【参考方案3】:另一个原因可能是您可能不小心映射到了 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 网络,它们会更好、更清洁。我像一年前一样制作了配置文档,这对我来说更像是一个初学者的错误,但可能会对某人有所帮助:)
【讨论】:
【参考方案4】:在您的示例中,您没有启用 traefik:
traefik.enable=false
确保先启用它,然后测试您的容器。
【讨论】:
你说得对,我已经更新了我的问题。只有一些网站被禁用。但这不是问题,就好像没有启用一个站点会得到 404。如果您有兴趣,请参阅我的回答。好像是网络问题。【参考方案5】:遇到了同样的问题,上面提到的答案都没有为我解决。在我的情况下,添加了错误的负载均衡器。删除标签或将其更改为正确的端口就可以了。
- "traefik.http.services.XXX.loadbalancer.server.port=XXX"
【讨论】:
【参考方案6】:当容器中的 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 "
这解决了我的问题。
【讨论】:
【参考方案7】:另一个原因可能是容器暴露在 Traefik 已经使用的端口。
【讨论】:
以上是关于Traefik 坏网关的主要内容,如果未能解决你的问题,请参考以下文章