Вопрос или проблема
Я запускаю сервер 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. Однако проблема в том, как приложения веб-службы встроены и запрашивают ресурсы. Если внутренняя структура и ссылки на ресурсы остаются с первоначальными путями, это вызывает несоответствие.
Применение
-
Модификация конфигурации Traefik: Продолжайте использовать
stripprefix
, но убедитесь, что все пути внутри самого приложения соответствуют конечным точкам на Apache. Вам возможно потребуется изменить внутренние ссылки на ресурсы в вашем приложении или использовать другой подход для генерации правильных URL внутри Apache. -
Конфигурация Apache: Если ваше приложение Apache не поддерживает эмоциональное обнаружение пути, вы могли бы подумать о настройке его так, чтобы Apache мог работать за обратным прокси-сервером. Вы можете использовать директивы Apache, такие как
ProxyPass
иProxyPassReverse
.
ProxyPass "/core/depot" "http://localhost:8000/"
ProxyPassReverse "/core/depot" "http://localhost:8000/"
- 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, с обязательной проверкой всех маршрутов, используемых самими приложением и конфигурацией внутренней сети.