Traefik 2.0 - правило роутера не работает с ярлыками докера - PullRequest
1 голос
/ 31 октября 2019

Я настроил игровую площадку GraphQL для прослушивания через порт 4000.

Поэтому я добавил следующие метки 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`)"

И в этой конфигурации у меня ошибка 404 на site.com/graphql.

Что я пропустил?

1 Ответ

1 голос
/ 31 октября 2019

По моему мнению, нет никакого бэкэнд-приложения, прослушивающего путь /graphql.

Решение 1:

Сделать бэкэнд-приложение (GraphQL) прослушивающим путь /graphql.

Возможно, вам также следует использовать PathPrefix(`/graphql`) вместо Path(`/graphql`)

Solution2:

Использовать 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/.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...