У меня есть сервлет Java под названием «ARI», который извлекает данные из архивной базы данных и возвращает полезную нагрузку XML со строками из этой базы данных.
У нас есть несколько экземпляров этого сервлета, запущенных на виртуальных серверах из одного ящика, и к ним можно получить доступ через другой номер порта, например:
testserver.co.uk:61061/aricp/ari
testserver.co.uk:61062/aricp/ari
К обоим этим сервлетам можно успешно получить доступ непосредственно с клиента. Вот пример разговора между клиентом и сервером, полученный при захвате пакетов.
Успешный HTTP-запрос:
POST / aricp / ari HTTP / 1.1 Accept-Charset: UTF-8
Content-Type: application / x-www-form-urlencoded; кодировка = UTF-8
Пользовательский агент: Java / 1.6.0_25
Хост: testserver.co.uk:61061
Принять: text / html, image / gif, image / jpeg, *; q = .2, /; q = .2
Подключение: keep-alive
Длина содержимого: 11
id = 1-134ISR
обратите внимание на переменную POST "id" в запросе
Успешный ответ
HTTP / 1.1 200 ОК
Сервер: Sun-ONE-Web-Server / 6.1
Дата: Вт, 8 января 2013 г., 17:48:49 GMT
Тип содержимого: текст / html
Передача-кодирование: фрагментированное
03a6
* Успешный журнал сервера HTTP-запросов *
[09 / Янв / 2013: 10: 25: 33] нормально (16359): для хоста 10.232.191.87, пытающегося GET / aricp / ari, ntrans-j2ee сообщает: сопоставлен uri "/ ari" в контексте "/ aricp" на ресурс «АРИ»
Так что отправлять прямые запросы на наш сервлет можно, однако, если мы используем ZEUS ZXTM для косвенной обработки запросов от клиента ко всем экземплярам нашего сервлета, это не сработает.
Вот неудавшийся HTTP-запрос, обратите внимание на разницу в адресе HOST, поскольку ZEUS является посредником.
ZEUS Failed HTTP-запрос
POST / aricp / ari HTTP / 1.1 Accept-Charset: UTF-8
Content-Type: application / x-www-form-urlencoded; кодировка = UTF-8
Пользовательский агент: Java / 1.6.0_25
Хост: zeus.co.uk:61061
Принять: text / html, image / gif, image / jpeg, *; q = .2, /; q = .2
Подключение: keep-alive
Длина содержимого: 11
id = 1-PUZK7D
Ошибка HTTP-ответа ZEUS
HTTP / 1.1 404 Не найдено
Сервер: Sun-ONE-Web-Server / 6.1
Дата: Вт, 8 января 2013 г., 18:05:45 GMT
Длина содержимого: 292
Тип содержимого: текст / html
При использовании ZEUS веб-сервер не может интерпретировать запрос, исходящий от ZEUS, как запрос сервлета, вместо этого он, кажется, буквально интерпретирует URI запроса как путь к файлу, и мы получаем 404 not found.
ZEUS Failed HTTP Request Server Log
[09 / Янв / 2013: 10: 50: 45] предупреждение (16886): для хоста 10.232.184.53, пытающегося получить / aricp / ari, отчеты об отправке файла: HTTP4142: не удается найти / u02 / SunONE61060 / docs / aricp / ari (файл не найден)
Как вы можете видеть, он рассматривает uri как путь к каталогу, а не как путь к приложению.
Это очень странная проблема.
Вещи, которые я пробовал
Таким образом, он работает нормально так:
Клиент -> Сервер
Однако при этом он не работает:
Клиент --ZEUS -> Сервер
Я собираюсь обновить установку нового виртуального сервера и посмотреть, что произойдет.
Любые идеи или теории приветствуются.
Я не уверен, почему у вас только один внутренний сервер, возможно, это всего лишь тестовая установка.
ZXTM - мощный балансировщик нагрузки, кажется, вы сейчас более или менее используете его в качестве обратного прокси.
В любом случае, вы обычно устанавливаете что-то вроде этого:
- создать запись DNS, например myapp.example.com
и укажите его на IP-адрес кластера ZXTM
- настроить серверное приложение для прослушивания myapp.example.com
- создать виртуальный сервер в кластере ZXTM, который использует IP трафика
- создать новый пул в кластере ZXTM и добавить testserver.co.uk:61061
к этому
- назначить новый пул созданному виртуальному серверу
Затем вы можете получить доступ к своему приложению через myapp.example.com
.
Вы по-прежнему можете получить доступ к приложению непосредственно на внутренних узлах (например, для целей мониторинга), но в зависимости от того, как работает приложение, вам может потребоваться настроить для этого заголовок Host.