13 октября 2015 г.

Tomcat - настройка и управление контекстом приложений

Рассмотрим возможность хранения приложений вне стандартной, для Apache Tomcat, папке webapps и управление их контекстом с помощью команд по HTTP.
Для размещения приложений, в каталоге отличном от стандартного webapps, необходимо в конфигурационном файле TOMCAT_HOME/conf/server.xml определить и настроить секцию Service.
  • Service - связывает описанные коннекторы с Engine;
  • Connector - связан с TCP портом, для взаимодействия клиентов с Service;
  • Engine - контейнер высшего уровня, содержит один и больше Host, т.е. можно настроить Tomcat для работы с несколькими именами хостов.
...
<Service name="Mywebapp">
 <Connector port="8081"
            protocol="HTTP/1.1"
            connectionTimeout="20000"
            URIEncoding="UTF-8"
            redirectPort="8443"
            compression="on"
            compressionMinSize="2048"
            compressableMimeType="text/html,text/xml,text/css,text/javascript,application/x-javascript" />

 <Engine name="Mywebapp"
         defaultHost="localhost">

  <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
         resourceName="UserDatabase"/>

  <Host name="localhost"
        appBase="mywebapps"
        unpackWARs="true"
        autoDeploy="true"/>
 </Engine>
</Service>
...
Обратите внимание на атрибуты:
  • name элементов Service и Engine - логическое имя, используется для логирования и при выводе сообщений об ошибках, должно быть уникально;
  • port элемента Connector - порт для взаимодействия с клиентами, используйте отличный от стандартного 8080;
  • appBase элемента Host - путь к папке наших приложений.
Элемент Realm определяет стандартную базу данных пользователей и паролей для аутентификации при доступе к данному Engine.

Для подключения стандартного менеджера управления приложениями создадим файл:
TOMCAT_HOME/conf/Mywebapp/localhost/manager.xml
Mywebapp соответствует значению атрибута name элемента Service рассмотренного выше.
<?xml version="1.0" encoding="ISO-8859-1"?>
<Context privileged="true" antiResourceLocking="false"
         docBase="/opt/tomcat/webapps/manager">
</Context>
Обратите внимание: атрибут docBase должен соответствовать значению пути к стандартному менеджеру TOMCAT_HOME/webapps/manager в вашей системе.

Для выполнения менеджером скриптовых команд необходимо в TOMCAT_HOME/conf/tomcat-users.xml описать пользователя и его роли, по примеру ниже.
<role rolename="admin-script"/>
<role rolename="manager-script"/>
<user username="admin" password="password" roles="manager-script,admin-script"/>
Теперь мы можем управлять своими приложениями с помощью команд, вида:
http://{host}:{port}/manager/text/{command}?{parameters}
Основные команды управления приложением: start, stop, reload, deploy.
Если архив вашего приложения называется не ROOT.war, а к примеру myapp.war, соответственно оно развернулось в папку с названием myapp, то к команде необходимо добавить параметр path=/myapp/. Пример команды, управления приложением:
curl --user admin:password http://192.168.1.10:8081/manager/text/start?path=/myapp/
Более подробно об использовании стандартного менеджера см.оф.документацию.

Пример bash-скрипта для управления контекстом приложений.
#! /bin/sh
# Usage [app_name] [command]

if [ "$#" -ne 2 ]; then
   echo "Arguments not found. Usage: [serviceName] [action]"
   exit
fi

SERVER_URL="http://192.168.1.10"
TOMCAT_LOGIN="admin" 
TOMCAT_PASSWORD="password"
PORT=""

case "$1" in
    myapp)
 PORT="8081"
 ;;
 
    otherapp)
 PORT="8082"
 ;;

    *)
    echo "Invalid application name"
    exit
    ;;
esac

if [[ $2 =~ ^(start|stop|reload)$ ]]; then
   echo "Invalid action, usage {start, stop, reload}"
   exit
fi

curl --user $TOMCAT_LOGIN:$TOMCAT_PASSWORD $SERVER_URL:$PORT/manager/text/$2?path=/

exit 0
Для удобства, скрипт можно зарегистрировать в системе как сервис, тогда управлять приложением из консоли будет еще удобнее, например:
service scriptname myapp reload

1 комментарий: