Apache за Traefic реверсивным прокси, маршрутизация на основе пути

Вопрос или проблема

Я запускаю сервер Apache за обратным прокси Traefik. Похоже, что я могу достучаться до сервиса Apache, но постоянно получаю сообщение 404.

Используется URL: http://host.local/core/depot

Результат – 404, с журналом Apache: GET /core/depot HTTP/1.1" 404

Для справки, сервер Apache ожидает запросы в корне (/), но получает запросы на /core/depot

Есть ли настройка, которую я могу передать Apache, чтобы он ожидал, что находится за прокси, указав дополнительный путь? (Я очень хотел бы, чтобы было проще искать такую настройку, любая комбинация apache и reverse proxy приводит к инструкциям по настройке apache в качестве обратного прокси, а не как настроить его быть за одним. Я почти уверен, что это то направление, которое мне стоит выбрать, так как мне удалось достичь этого же момента в Nginx, но столкнувшись с той же ошибкой.

Еще один вариант, который, как я думаю, доступен, – это использование заголовков на стороне Traefik, но я не вижу ничего очевидного в документации. Мне удалось получить страницу index, используя промежуточное ПО stripprefix, но ни один из ресурсов на странице не загрузился, так как они искали путь без префикса, который искал браузер.

# Статическая конфигурация Traefik
entryPoints:
  web:
    address: :80
    asDefault: true
  secureWeb:
    address: :443
    asDefault: true
providers:
  file:
    directory: "/etc/traefik/dynamicConfig/"
log:
  level: DEBUG
# Динамическая конфигурация Traefik

http:
  # https://doc.traefik.io/traefik/routing/services/
  services:

    core-depot:
      loadBalancer:
        servers:
          - url: http://oqm-core-depot:80
            preservePath: true # Ложь

  # https://doc.traefik.io/traefik/routing/services/#serverstransport_1
  serversTransports:

    core-depot-transport:
      serverName: core-depot
      insecureSkipVerify: true

  # https://doc.traefik.io/traefik/routing/routers/
  routers:

    core-depot-router:
      rule: "PathPrefix(`/core/depot`)"
      service: core-depot
      middlewares:
        - strip-oqm-prefixes

  middlewares:
    strip-oqm-prefixes:
      stripprefix:
        prefixes:
          - /core/depot

Ответ или решение

Проблема, с которой вы сталкиваетесь, связана с неправильной маршрутизацией запросов через прокси-сервер Traefik к вашему backend-серверу Apache. Когда вы отправляете запросы на http://host.local/core/depot, ваш сервер Apache, который ожидает запросы в корневой директории (/), получает их с дополнительным префиксом /core/depot, что приводит к ошибке 404. Эта ошибка вызвана несоответствием ожидаемого и фактического маршрута на Apache, когда запросы перенаправляются через Traefik.

Теория

Ключевым моментом здесь является правильная конфигурация префиксов и маршрутов как в Traefik, так и в Apache. Traefik является обратным прокси-сервером и может манипулировать URL-запросами с использованием middlewares, таких как StripPrefix, который удаляет определённые префиксы перед отправкой запроса на backend. Однако, как вы указали, использование StripPrefix решает проблему частично, поскольку статические ресурсы вашего приложения Apache запрашиваются с неправильным префиксом, что также приводит к ошибкам 404.

Пример

Вы предоставили YAML конфигурации для Traefik, где у вас настроено следующее:

routers:
  core-depot-router:
    rule: "PathPrefix(`/core/depot`)"
    service: core-depot
    middlewares:
      - strip-oqm-prefixes

middlewares:
  strip-oqm-prefixes:
    stripprefix:
      prefixes:
        - /core/depot

Этот middleware stripprefix удаляет префикс /core/depot перед отправкой запроса на сервер Apache. Однако проблема в том, как приложения веб-службы встроены и запрашивают ресурсы. Если внутренняя структура и ссылки на ресурсы остаются с первоначальными путями, это вызывает несоответствие.

Применение

  1. Модификация конфигурации Traefik: Продолжайте использовать stripprefix, но убедитесь, что все пути внутри самого приложения соответствуют конечным точкам на Apache. Вам возможно потребуется изменить внутренние ссылки на ресурсы в вашем приложении или использовать другой подход для генерации правильных URL внутри Apache.

  2. Конфигурация Apache: Если ваше приложение Apache не поддерживает эмоциональное обнаружение пути, вы могли бы подумать о настройке его так, чтобы Apache мог работать за обратным прокси-сервером. Вы можете использовать директивы Apache, такие как ProxyPass и ProxyPassReverse.

ProxyPass "/core/depot" "http://localhost:8000/"
ProxyPassReverse "/core/depot" "http://localhost:8000/"
  1. Traefik Headers Middleware: Еще одним решением может быть использование Traefik’s middleware для установки заголовков, которые могут указать серверу Apache правильные префиксы или базовые URL. Вы можете установить заголовок X-Forwarded-Prefix и настроить Apache на его распознавание.
middlewares:
  add-core-depot-prefix:
    headers:
      customRequestHeaders:
        X-Forwarded-Prefix: "/core/depot"

Учтен Ваш вопрос о документации, которая часто сосредоточена на настройке обратного проксирования самого Apache, а не на интеграции Apache как backend службы. Имейте в виду, что проблема тут — в налаживании понимания между Traefik и Apache о действительном маршруте запросов. Поэтому детиализация настройки директив Apache и Traefik будет важной для решения этой задачи.

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

Оцените материал
Добавить комментарий

Капча загружается...