【发布时间】:2022-02-08 20:25:45
【问题描述】:
我想为常见的 HTTP 错误代码提供自定义错误页面。我在关注this tutorial。为此,我创建了以下docker-compose.yml 文件来测试功能。它包括:
-
errorPageHandler这是一个 nginx 服务器,能够返回静态 HTML 页面(404.html和502.html)。 -
whoami1将请求路由到traefik/whoami图像的80端口 -
whoami2将请求路由到traefik/whoami图像的不存在端口 81,导致 502 - 网关错误
version: "3.7"
services:
errorPageHandler:
image: "nginx:latest"
networks:
- traefik-net
volumes:
- "./ErrorPages:/usr/share/nginx/ErrorPages"
- "./default.conf:/etc/nginx/conf.d/default.conf"
deploy:
replicas: 1
labels:
# enable Traefik for this service
- "traefik.enable=true"
- "traefik.docker.network=traefik-net"
# router (catches all requests with lowest possible priority)
- "traefik.http.routers.error-router.rule=HostRegexp(`{catchall:.*}`)"
- "traefik.http.routers.error-router.priority=1"
- "traefik.http.routers.error-router.middlewares=error-pages-middleware"
# middleware
- "traefik.http.middlewares.error-pages-middleware.errors.status=400-599"
- "traefik.http.middlewares.error-pages-middleware.errors.service=error-pages-service"
- "traefik.http.middlewares.error-pages-middleware.errors.query=/{status}.html"
# service
- "traefik.http.services.error-pages-service.loadbalancer.server.port=80"
whoami1:
image: "traefik/whoami"
networks:
- traefik-net
deploy:
replicas: 1
labels:
# enable Traefik for this service
- "traefik.enable=true"
- "traefik.docker.network=traefik-net"
# router
- "traefik.http.routers.whoami1.rule=HostRegexp(`whoami1.local`)"
- "traefik.http.routers.whoami1.service=whoami1"
# service
- "traefik.http.services.whoami1.loadbalancer.server.port=80"
- "traefik.http.services.whoami1.loadbalancer.server.scheme=http"
whoami2:
image: "traefik/whoami"
networks:
- traefik-net
deploy:
replicas: 1
labels:
# enable Traefik for this service
- "traefik.enable=true"
- "traefik.docker.network=traefik-net"
# router
- "traefik.http.routers.whoami2.rule=HostRegexp(`whoami2.local`)"
- "traefik.http.routers.whoami2.service=whoami2"
# service
- "traefik.http.services.whoami2.loadbalancer.server.port=81" # purposely wrong port
- "traefik.http.services.whoami2.loadbalancer.server.scheme=http"
networks:
traefik-net:
external: true
name: traefik-net
文件夹 ErrorPages 包含两个静态 HTML 文件,404.html 和 502.html。 default.conf的内容是:
server {
listen 80;
server_name localhost;
error_page 404 /404.html;
error_page 502 /502.html;
location / {
root /usr/share/nginx/ErrorPages;
internal;
}
}
我在我的hosts 文件中添加了以下条目(172.15.16.17 是部署了 Traefik 和所有提到的服务的服务器的 IP):
172.15.16.17 error404.local
172.15.16.17 whoami1.local
172.15.16.17 whoami2.local
我的观察:
-
当我访问
http://error404.local时,Traefik 将请求路由到 nginx 并返回404.html。这是预期行为,因为http://error404.local与 Traefik 中定义的任何路由都不匹配。 -
当我访问
http://whoami1.local时,Traefik 将请求路由到whoami1服务,并在页面上显示有关容器的信息(预期行为)。 -
当我访问
http://whoami2.local时,Traefik 不会将请求路由到 nginx 服务,但会显示其默认的Bad Gateway页面。为什么不将请求路由到 nginx?
【问题讨论】:
标签: docker reverse-proxy docker-swarm traefik