You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
docs/docs/docker/traefik/errorpages.md

11 KiB

Настройка страницы в Traefik 2

Промежуточное программное обеспечение ErrorPage

Traefik поставляется с готовым middlewares error. Его обязанность — возвращать пользовательскую страницу вместо страницы по умолчанию в соответствии с настроенными диапазонами кодов состояния HTTP. Вот пример:

# Dynamic Custom Error Page for 4XX/5XX Status Code
labels:
  - "traefik.http.middlewares.test-errorpage.errors.status=400-599"
  - "traefik.http.middlewares.test-errorpage.errors.service=serviceError"
  - "traefik.http.middlewares.test-errorpage.errors.query=/{status}.html"

Как указано в официальной документации:

  • status — это статус HTTP, который вызывает страницу с ошибкой (в этом примере каждый код между 400 и 599).
  • serviceError - это служба , которая будет обслуживать новую запрошенную страницу ошибки
  • запрос — URL-адрес страницы ошибки (размещенной на сервисе), где {status} в запросе будет заменен полученный код состояния.

Стоит отметить, что страницы ошибок не размещаются непосредственно на Traefik, необходимо размещать их на своем веб-сервере. На следующем рисунке из документации Traefik показан пример этого сценария.

Рабочий сценарий

Промежуточное ПО ErrorPage - это то что нам нужно. Но как мы можем использовать его для обслуживания наших страниц и ошибок в целом?

Представьте, что вы хотите обслуживать глобальную страницу для URL-адресов, которые указывают на ваш хост, но не привязаны к определенным службам. Например, если у вас есть запись DNS, которая соответствует таким запросам, как:

*.example.com

URL-адреса, такие как:

http://bla-bla.example.com

попадут в ваш Traefik, но ни один маршрутизатор не справится с ними. В таких случаях мы хотим, чтобы Traefik вернул нашу классную кастомную страницу ошибки.

Как мы можем это настроить? Начнем с этого чертежа:

В двух словах: мы определяем правило универсального маршрутизатора с низким приоритетом , которое сработает только в том случае, если другие маршрутизаторы для определенных служб не могут обработать запрос. Затем такой неизвестный запрос обрабатывается промежуточным программным обеспечением ErrorPage, которое сообщает Nginx об обслуживании страницы с ошибкой.

Практика

Пришло время практики. Будем считать, что у нас же есть работающий Traefik 2, запущенный через docker-compose. Добавим в нему nginx с нашими страничками ошибок и тестовый контейнер whoami для проверки работы:

??? note ```yaml title="docker-compose.yml" version: "3.9"

networks:
  traefik_net:
    external: true

services:

# Traefik 2 - Reverse Proxy
  traefik:
    container_name: traefik
    image: traefik:2.10
    restart: always
    security_opt:
      - no-new-privileges:true
    command: # CLI arguments
      - --api.dashboard=true
      - --providers.docker.network=traefik_net
      - --entrypoints.webinsecure.address=:80
      - --providers.docker.exposedByDefault=false
      - --providers.docker=true    
    networks:
      - traefik_net
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    labels:
      traefik.enable: true
      ## Dashboard
      traefik.http.routers.traefik.entrypoints: http
      traefik.http.routers.traefik.rule: host('traefik.localhost')
      traefik.http.routers.traefik.service: api@internal

  nginx-error:
    image: nginx:latest
    volumes:
      - ./error-pages:/usr/share/nginx/error-pages
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    network:
      - traefik_net
    labels:
      traefik.enable: true
      traefik.http.routers.error-rtr.rule: HostRegexp(`{host:.+}`)
      traefik.http.routers.error-rtr.priority: 1
      traefik.http.routers.error-rtr.entrypoints: webinsecure
      traefik.http.routers.error-rtr.middlewares: error-pages-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

      traefik.http.services.error-pages-svc.loadbalancer.server.port: 80

  test-app:
    image: containous/whoami
    networks: 
      - traefik_net
    labels:
      traefik.enable: true
      traefik.http.routers.error-rtr.rule: host('test.localhost')
      traefik.http.routers.error-rtr.entrypoints: webinsecure
      traefik.http.services.error-pages-svc.loadbalancer.server.port: 80
```

В приведенном compose файле содержится все, что нам нужно для отображения кастомных страниц ошибок. Страницы ошибок находятся в службе Docker nginx-error, которая управляет контейнером Nginx, предназначенным для страниц ошибок.

Все начинается с error-router:

labels:
  traefik.http.routers.error-rtr.rule: HostRegexp(`{host:.+}`)
  traefik.http.routers.error-rtr.priority: 1
  traefik.http.routers.error-rtr.entrypoints: webinsecure

Ему присвоен приоритет 1, поэтому он перехватывает все запросы , если они не были обработаны ранее другими (т.е. traefik.http.routers.traefik и traefik.http.routers.my-test-app).

Затем прикрепляем к нему error-pages-middleware:

labels:
  traefik.http.routers.error-rtr.middlewares: error-pages-middleware

это фактическое промежуточное программное обеспечение ErrorPage Traefik:

labels:
  traefik.http.middlewares.error-pages-middleware.errors.status: 400-599
  traefik.http.middlewares.error-pages-middleware.errors.service: error-pages-svc
  traefik.http.middlewares.error-pages-middleware.errors.query: /{status}.html

  traefik.http.services.error-pages-service.loadbalancer.server.port: 80

Такое промежуточное программное обеспечение запросит error-pages-svc обслуживание наших кастомных страниц ошибок.

Пара слов о папках Nginx. В этом примере мы связываем монтирование (но мы также можем скопировать файлы в контейнер) двух основных томов:

volumes:
  - ./error-pages:/usr/share/nginx/error-pages
  - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

В этой папке ``./error-pagesмы храним файлы страниц ошибок, такие как наши собственные файлы404.html. Кроме того, мы настраиваем конфигурацию этого экземпляра Nginx следующим образом default.conf`:

server {
    listen       80;
    server_name  localhost;

    error_page  404    /404.html;
    # other error pages here:
    # error_page  403    /403.html;

    location / {
        root  /usr/share/nginx/error-pages;
        internal;
    }
}

Проверка работы

Пришло время запустить наши контейнеры и проверить их работу.

Если вы запросите: http://traefik.localhost/ или http://test.localhost/ вы получите панель управления Traefik и выходные данные whoami соответственно.

Если вы попытаетесь получить: http://bla-bla.localhost, Traefik вернет именно вашу дружественную страницу с ошибкой 404 (т. е. 404.html).

!!! tip Обратите внимание: если вы заинтересованы в управлении ошибками таким же образом и для определенных служб, вы можете использовать промежуточное программное обеспечение ErrorPage. Например, вы можете подключить промежуточное программное обеспечение к маршрутизатору панели управления Traefik следующим образом: yaml labels: # Dashboard traefik.http.routers.traefik.rule: Host(`traefik.localhost`) traefik.http.routers.traefik.service: api@internal traefik.http.routers.traefik.entrypoints: webinsecure # Attach the error middleware also to this router traefik.http.routers.traefik.middlewares: error-pages-middleware Теперь, если вы запросите: http://traefik.localhost/bla-bla, вы снова получите настроенную страницу ошибки 404.


Middlewares ErrorPage Интересная ветка на эту тему на форуме сообщества Containous. Статические страницы ошибок сервера в образе Docker (также готовы для Traefik)