Traefik 坏网关
Traefik Bad Gateway
我遇到了一些奇怪的问题。我有以下设置:
一个 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 有关?
遇到同样问题的人:
重新创建网络(代理)并每隔 site/container 重新启动后,它现在似乎可以工作了。
我仍然不知道问题出在哪里。
在您的示例中,您没有启用 traefik:
traefik.enable=false
确保先启用它,然后再测试您的容器。
如果您看到 Bad Gateway
使用 Traefik,那么您可能遇到了 Docker 网络问题。首先看一下 this issue and consider this solution. Then take a look at providers.docker.network
(Traefik 2.0) or, in your case, the docker.network
设置(Traefik 1.7)。
您可以在此处添加默认 network
:
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "example.com"
watch = true
exposedbydefault = false
network = "proxy"
或 define/override 它用于使用 traefik.docker.network
标签的给定服务。
遇到了同样的问题,上述答案中的 none 为我解决了。在我的例子中,添加了错误的负载均衡器。移除标签或将其更改为正确的端口即可解决问题。
- "traefik.http.services.XXX.loadbalancer.server.port=XXX"
另一个原因可能是在 Traefik 已经使用的端口上暴露容器。
当容器中的 Web 服务器不允许来自 traefik 的流量时返回错误“错误的网关”,例如因为接口绑定错误,比如 localhost 而不是 0.0.0.0.
以Ruby对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 } }"
这解决了我的问题。
另一个原因可能是您可能不小心映射到虚拟机的端口而不是容器端口。
我对 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 网络,它们更好更干净。我在一年前制作了我的配置文档,这对我来说更像是一个初学者错误,但可能会对某人有所帮助 :)
我忘记在 Dockerfile
中公开端口,这就是为什么 traefik 找不到要路由到的端口。因此,在启动应用程序之前公开端口,例如 node:
#other stuff before...
EXPOSE 3000
CMD ["node", "dist/main" ]
或者,如果您打开了多个端口,则必须指定 traefik 应将域路由到哪个端口:
- "traefik.http.services.myservice.loadbalancer.server.port=3000"
或见docs
我遇到了一些奇怪的问题。我有以下设置: 一个 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 有关?
遇到同样问题的人:
重新创建网络(代理)并每隔 site/container 重新启动后,它现在似乎可以工作了。 我仍然不知道问题出在哪里。
在您的示例中,您没有启用 traefik:
traefik.enable=false
确保先启用它,然后再测试您的容器。
如果您看到 Bad Gateway
使用 Traefik,那么您可能遇到了 Docker 网络问题。首先看一下 this issue and consider this solution. Then take a look at providers.docker.network
(Traefik 2.0) or, in your case, the docker.network
设置(Traefik 1.7)。
您可以在此处添加默认 network
:
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "example.com"
watch = true
exposedbydefault = false
network = "proxy"
或 define/override 它用于使用 traefik.docker.network
标签的给定服务。
遇到了同样的问题,上述答案中的 none 为我解决了。在我的例子中,添加了错误的负载均衡器。移除标签或将其更改为正确的端口即可解决问题。
- "traefik.http.services.XXX.loadbalancer.server.port=XXX"
另一个原因可能是在 Traefik 已经使用的端口上暴露容器。
当容器中的 Web 服务器不允许来自 traefik 的流量时返回错误“错误的网关”,例如因为接口绑定错误,比如 localhost 而不是 0.0.0.0.
以Ruby对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 } }"
这解决了我的问题。
另一个原因可能是您可能不小心映射到虚拟机的端口而不是容器端口。
我对 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 网络,它们更好更干净。我在一年前制作了我的配置文档,这对我来说更像是一个初学者错误,但可能会对某人有所帮助 :)
我忘记在 Dockerfile
中公开端口,这就是为什么 traefik 找不到要路由到的端口。因此,在启动应用程序之前公开端口,例如 node:
#other stuff before...
EXPOSE 3000
CMD ["node", "dist/main" ]
或者,如果您打开了多个端口,则必须指定 traefik 应将域路由到哪个端口:
- "traefik.http.services.myservice.loadbalancer.server.port=3000"
或见docs