Traefik 2.0-路径路由器规则不适用于docker标签

时间:2019-10-31 12:56:19

标签: docker docker-compose traefik

我设置了一个在端口4000上监听的GraphQL游乐场。

所以我添加了以下Traefik标签:

graphql:
  restart: unless-stopped
  labels:
    - traefik.enable=true
    - "traefik.http.routers.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.rule=Host(`graphql.${CI_ENVIRONMENT_HOST}`)"
    - traefik.http.routers.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.tls.certresolver=letsencrypt
    - traefik.http.services.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.loadbalancer.server.port=4000

当我尝试获取graphql.site.com时,此方法有效。

现在,我希望它与site.com/graphql匹配,所以我将路由器标签更改为:

"traefik.http.routers.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.rule=Host(`${CI_ENVIRONMENT_HOST}`) && Path(`/graphql`)"

在这种配置下,我在site.com/graphql上遇到404错误。

我想念什么?

1 个答案:

答案 0 :(得分:1)

我认为没有后端应用程序在路径/graphql上监听。

解决方案1:

使后端应用程序(GraphQL)在路径/graphql上侦听。

可能您还应该使用PathPrefix(`/graphql`)而不是Path(`/graphql`)

解决方案2:

使用traefik StripPrefix,它会在转发请求之前删除路径中的前缀

使用这些标签。:

- "traefik.http.routers.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.rule=Host(`${CI_ENVIRONMENT_HOST}`)"

- "traefik.http.middlewares.stripprefix-graphql.stripprefix.prefixes=/graphql"

- "traefik.http.routers.${CI_PROJECT_PATH_SLUG}-${CI_ENVIRONMENT_SLUG}-graphql.middlewares=stripprefix-graphql@docker"

如果后端正在提供资产(例如图像或Javascript文件),则您需要在后端实施其他更改: 这里的更多信息:https://docs.traefik.io/middlewares/stripprefix/

希望这会有所帮助。