如何在一个简单的docker-composed文件中创建一个Traefik v2.x ReplacePath标签?



鉴于以下网址,我正在尝试使用 Traefik v2.x 创建一些路由器

Route             forwards to
-----------------------------
/users         -> /users
/users/*       -> /users/*
/users/swagger -> /swagger

所以在这些例子中,我的网络服务器有一些用户端点GET /users, GET /users/1, POST /users, DELETE /users/1, etc..但也有一个Swagger/OpenApi定义/文档位于/swagger

所以我正在尝试通过 Traefik 访问这些端点。

我的印象是我需要创建使用路由器 + PathPrefex 和路由器 + 路径进行端点匹配的labels......但使用中间件进行替换。

我太确定如何正确地做到这一点。

这是我正在尝试做的...

version: '3.5'
services:
users-api:
image: spike.openapi/users.api
build:
context: ./
dockerfile: src/Users/Dockerfile
ports:
- "80"
networks:
- backend
container_name: users.api
labels:
- "traefik.enable=true"
- "traefik.http.routers.users-api.rule=PathPrefix(`/users`)"
- "traefik.http.routers.users-api.rule=Path(`/users/swagger`)"
- "traefik.http.routers.users-api.entrypoints=web"
reverse-proxy:
image: traefik
<snipped>
...

如果没有主机规则,traefik 将不知道在哪个后端重定向请求,因此您缺少的第一件事可能是这一点。我认为以下应该有效。

services:
users-api:
...
labels:
# /users/swagger -> /swagger
traefik.http.middlewares.replacepath-middleware.replacepath.path: /swagger
traefik.http.routers.swagger-router.rule: Host(`your-domain.net`) && PathPrefix(`/users/swagger`)
traefik.http.routers.swagger-router.entrypoints: http
traefik.http.routers.swagger-router.middlewares: replacepath-middleware
# everything else (/users -> /users)
traefik.http.routers.base-router.entrypoints: http
traefik.http.routers.base-router.rule: Host(`your-domain.net`)

你也可以使用stripprefix 中间件来实现完全相同的事情

services:
users-api:
...
labels:
# /users/swagger -> /swagger
traefik.http.middlewares.stripprefix-middleware.stripprefix.prefixes: /users
traefik.http.routers.swagger-router.rule: Host(`your-domain.net`) && PathPrefix(`/users/swagger`)
traefik.http.routers.swagger-router.entrypoints: http
traefik.http.routers.swagger-router.middlewares: stripprefix-middleware
# everything else (/users -> /users)
traefik.http.routers.base-router.entrypoints: http
traefik.http.routers.base-router.rule: Host(`your-domain.net`)

我注意到 traefik 重定向了请求 (http 304(。如果你想要的是某种 url 重写,我认为 traefik 无法处理它 - 这应该是你的后端的工作,在你的情况下是 users-api。

IMO了解traefik中间件行为并不容易。我试图用一个简单的nginx后端重现你的设置。试一试:

version: '3.7'
services:
traefik:
image: traefik:v2.1
ports:
- 80:80
command:
- --entrypoints.http.address=:80
- --providers.docker.exposedByDefault=false
- --log.level=DEBUG
volumes:
- /var/run/docker.sock:/var/run/docker.sock
nginx:
image: nginx:1.16.1
labels:
traefik.enable: 'true'
# /users/swagger -> /swagger
traefik.http.middlewares.replacepath-middleware.replacepath.path: /swagger
traefik.http.routers.swagger-router.rule: Host(`127.0.0.1`) && PathPrefix(`/users/swagger`)
traefik.http.routers.swagger-router.entrypoints: http
traefik.http.routers.swagger-router.middlewares: replacepath-middleware
# everything else (/users -> /users)
traefik.http.routers.base-router.entrypoints: http
traefik.http.routers.base-router.rule: Host(`127.0.0.1`)

首先运行以下命令以创建文件夹和虚拟页面:

docker-compose up -d
docker-compose exec nginx mkdir /usr/share/nginx/html/swagger
docker-compose exec nginx mkdir /usr/share/nginx/html/users
docker-compose exec nginx sh -c "echo 'users page here' > /usr/share/nginx/html/users/index.html"                                                                   bbouchereau@bbouchereau
docker-compose exec nginx sh -c "echo 'swagger page here' > /usr/share/nginx/html/swagger/index.html"

结果:

  • http://127.0.0.1/users/->用户页面在这里
  • http://127.0.0.1/users/swagger/->重定向到 http://127.0.0.1/swagger/-> 在这里大摇大摆的页面

最新更新