Нисходящий сервер IBM Httpd возвращает 404 только при доступе через другой вышестоящий веб-сервер IHS
У нас есть текущие настройки, такие как следующие:
- HTTPServer - IBM HTTPD Сервер v?
- WASServer6.1 - WebSphere Application Server v6.1 (работает приложение "A")
Базовая связь на перечисленных портах выглядит следующим образом. [Все номера портов в списке являются портами прослушивания.] plugin-cfg.xml
настроен соответствующим образом, и эта же топология работает в производственной среде более 6 лет.
HTTPServer:8080 --> WASServer6.1:9081
Теперь нам нужно адаптироваться к этим новым вещам, несколько изменив топологию:
- IHSServer - IBM HTTPD Сервер v? (новее, чем выше)
- WASServer8.5 - Сервер приложений WebSphere v8.5.5 (работает приложение "B")
AuthService - автономный Java-сервис (не работает в контейнере приложения)
HTTPServer:8080 ---> AuthService:9090 ---> IHSServer:8081 ---> WASServer8.5:9081 \ \ WASServer6.1:9081
HTTPServer имеет httpd.conf
настроен с ProxyPass
директивы, которые передают определенные запросы AuthService: 9090. AuthService выполняет некоторую работу, а затем копирует заголовки запроса в новый запрос [POST], который отправляется IHSServer: 8081, где plugin-cfg.xml
сопоставляется с информацией о приложении B для пересылки запросов в приложение B, работающее на WASServer8.5. Конечная цель состоит в том, чтобы воспользоваться преимуществами осведомленности о плагине о JVM WAS. В нашей производственной среде было бы несколько JVM, на которые IHS могла бы пересылать запросы.
ПРИМЕЧАНИЕ. AuthService не имеет состояния, поэтому нет необходимости в какой-либо привязке к конкретной JVM в WAS.
Проблема в том, что по какой-то причине это не работает. Запросы, отправленные по этому пути, возвращаются с HTTP 404
от IHSServer.
Устранение неполадок с подробным ведением журнала для IHSServer показало, что по какой-то причине IHSServer видит номер порта исходного прокси-сервера пересылки (HTTPServer:8080) и сравнивает его с VirtualHostGroup
список виртуальных хостов в plugin-cfg.xml
(Зачем?). Не найдя подходящего соответствия для порта 8080, он сдается и выплевывает 404.
Если мы заменим вещи, как показано ниже, сначала нажав на другой сервер Apache, прослушивающий порт 80:
SomeOtherHTTPServer:80 ---> AuthService:9090 ---> IHSServer:8081 ---> WASServer8.5:9081
\
\
WASServer:9081
... запрос принят IHSServer и все работает правильно. Аналогично, если правильно сформированная полезная нагрузка запроса отправляется непосредственно в AuthService:9090, запрос принимается, и все работает.
Мы попытались добавить <VirtualHost Name="*:8080"/>
к plugin-cfg.xml
на IHSServer, но это, кажется, не имеет значения.
РЕДАКТИРОВАТЬ: мы взяли некоторые tcpdump
захватывает на каждом узле этого пути, и ясно, что IHSServer немедленно отклоняет запросы с 404, когда они прошли через HTTPServer: 8080. IHSServer даже не пытается что-либо сделать с запросом.
Что еще мы можем сделать, чтобы устранить / исправить это? Почему плагин на IHSServer заботится о порте прослушивания вышестоящего веб-сервера?
2 ответа
Возможно, вам также понадобится добавить псевдоним виртуального хоста. VirtualHost Name="*:8080"
в WASServer8.5
тоже. Затем перезапустите сервер WAS 8.5, чтобы изменения вступили в силу.
Как правило, вам необходимо настроить виртуальный хост (*:8080) на всех уровнях, от конф. IHS до подключаемого модуля WAS и виртуальных хостов WAS.
Я не видел "ProxyPreserveHost" в вашем посте. Ты это пробовал?
Мне кажется, что это вероятная причина для 404, сгенерированного сервером IHS на порту 8081 (из-за несоответствия в plugin-cfg.xml и обработанного как статический файл) или самим AppServer (когда он проверяет свое собственное понятие хоста) псевдонимы для определения отображения веб-приложения).