Mod_jk и Tomcat застряли при отправке ответа

#apache #tomcat #mod-jk

#apache #tomcat #mod-jk

Вопрос:

В настоящее время работающий сервер работает неэффективно, и способ его настройки также не идеален. По этой причине я пытаюсь найти новый способ делать вещи, которые, надеюсь, помогут как с производительностью, так и с развертыванием.

Подход, который я выбрал, заключается в том, чтобы иметь экземпляры tomcat для наших веб-приложений (в настоящее время их два, так что это будет экземпляр для каждого веб-приложения) и использовать Apache в качестве «фронта». У меня нет опыта в этом, так что это нормально, что у меня возникают проблемы здесь и там, но пока мне удается это сделать.

Я ожидаю, что перенаправление с mysite.com индексируйте страницу к любому mysite.com/service1 или mysite.com/service2 . Service1 был настроен на тестовом сервере на порту 8080, а service2 — на 8081. Вчера я установил Apache2 и mod_jk и настроил apache с содержимым mysite.com . Сегодня я запустил конфигурации, которые закончились следующим образом:

workers.properties

 worker.list=s1

worker.s1.type=ajp13
worker.s1.port=8009

#host is localhost by default according to the documentation
 

jk.load

 LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so

JkWorkersFile /etc/apache2/workers.properties

JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel debug
JkMount /service1/* s1
 

Сервис1 server.xml соединитель (все остальное по умолчанию)

 <Connector protocol="AJP/1.3" port="8009" redirectPort="8443" />
 

У меня было больше, но из-за ошибок я сделал шаг назад и пока попробовал только с одним tomcat. Я добавлю второй tomcat и балансировщик нагрузки.

Хорошо, так что же происходит?

Я могу получить доступ к серверу и индексной странице нашей системы без проблем. Проблема в том, что я пытаюсь перенаправить на service1. Он просто загружается без ответа, но если я попытаюсь получить доступ к service1 напрямую через порт 8080, он работает правильно (я устал комментировать этот соединитель. Не повезло).

Глядя на состояние сервера, я вижу, что запрос застрял при отправке ответа, а в mod_jk.log я вижу, что рабочий правильно соответствует запросу. Итак, хотя мои конфигурации кажутся правильными, происходит что-то среднее. Я действительно не знаю, связано ли это с Apache, Tomcat или Mod_jk. Я также пытался следовать нескольким руководствам о том, как это сделать, но все они привели меня к 404s. К сожалению, просмотр здесь и ServerFault не пролил много света, поэтому я спрашиваю сейчас.

Я что-то упустил? Должен ли я просто использовать другой подход? Я очень новичок в этом, и сейчас я в растерянности. Конфигурация и журналы показывают, что на самом деле все в порядке (по крайней мере, на первый взгляд …), Поэтому я полностью уверен, что мой случай scneario возможен даже с mod_jk… Честно говоря, запустить его обратно и попробовать с помощью прокси-сервера на данный момент очень заманчиво, но если это так, я бы предпочел знать, где я ошибаюсь.

Дополнительная информация: работает на Ubuntu Server 18.04, последние версии apache2 и mod_jk доступны из apt (по состоянию на 14 апреля), java 1.8 и Tomcat 8.5.64.

Комментарии:

1. Добавьте secretRequired="false" в конфигурацию вашего соединителя: по умолчанию значение равно true (см. документацию ). Проверьте журналы, чтобы увидеть, правильно ли запускается соединитель.

2. Я не могу поверить, что я даже не подумал о проверке документации tomcat. Я был более уверен, что это дело Apache… что, я думаю, технически это тоже так. Не могли бы вы ответить, чтобы я мог это принять? Я также посмотрю на секреты, это может быть удобно добавить. Спасибо!

3. Хотя технически этот вопрос уже задавался ранее, трудно найти ответ, если вы не знаете решения.

Ответ №1:

В прошлом году в Tomcat произошли изменения (начиная с версии 8.5.51 и версии 9.0.31), которые ввели secretRequired атрибут для соединителя AJP с значением по умолчанию true (см. документацию). Следовательно, вы можете либо:

  • добавьте общий секрет между соединителем AJP и mod_jk
  • или добавить secretRequired="false" к разъему AJP:
     <Connector protocol="AJP/1.3" port="8009" secretRequired="false" redirectPort="8443" />
     

Примечание: AJP — очень старый протокол и редко используется. Поскольку ваша установка довольно новая, вы можете рассмотреть возможность использования прямого HTTP (см. this talk ).