Tomcat: трюки — использование переменных в server.xml

Автор: | 05/27/2014
 

apache-tomcat-7-logoЗадача — определить порт для коннекторов во время запуска Apache Tomcat.

Имеется сервер, на котором запускается несколько экземпляров Tomcat, от разных пользователей.

У каждого пользователя есть свой скрипт startup.sh, расположенный, к примеру, в домашней директории — в нём мы создадим перебор переменной ENV (environment) -и в зависимости от неё будем задавать порты Tomcat-а.

Переменная ENV задаётся в файле .profile или .bashrc пользователя:

$ cat ~/.bashrc | grep ENV
export ENV="DEV"

Необходимо менять порты для команды shutdown, порты коннекторов HTTP и HTTPS.

Редактируем файл server.xml, в котором указываем:

<Server port="${port.shutdown}" shutdown="SHUTDOWN">
<Connector port="${port.http}" maxHttpHeaderSize="8192"
   ...
<Connector port="${port.https}" maxHttpHeaderSize="8192"
   ...

Проверяем наличие переменной ENV:

$ echo $ENV
DEV

Далее — редактируем наш скрипт запуска, в котором и будут определяться порты в зависимости от ENV:

$ cat bin/startup.sh
#!/bin/sh

if [ $ENV == DEV ]; then
  port_shutdown="8005"
  port_http="8080"
  port_https="8443"
elif
  [ $ENV == SIT ]; then
  port_shutdown="8006"
  port_http="8081"
  port_https="8444"
elif
  [ $ENV == UAT ]; then
  port_shutdown="8007"
  port_http="8082"
  port_https="8445"
else
  echo "Unknown ENV"
  exit 1
fi

export CATALINA_OPTS=" ${SYSTEM_PROPS} -d64 -server -Xms$SMEMORY -Xmx$XMEMORY
 -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=64M
 -XX:+HeapDumpOnOutOfMemoryError -XX:MaxPermSize=1024M
 -Denv=${ENV} -Doutput.dir=${OUTPUT_DIR}
 -Dcom.sun.management.jmxremote
 -Dcom.sun.management.jmxremote.port=8004
 -Dcom.sun.management.jmxremote.authenticate=false
 -Dcom.sun.management.jmxremote.ssl=false
 -Djava.rmi.server.hostname=10.***.***.239
 -Dport.http=${port_http} -Dport.https=${port_https} -Dport.shutdown=${port_shutdown}"

exec $CATALINA_HOME/bin/startup.sh

В последней строке передачи аргументов JVM — мы и передаём переменные, в которых указаны порты:

 -Dport.http=${port_http} -Dport.https=${port_https} -Dport.shutdown=${port_shutdown}"

Следует ещё раз уточнить — это скрипт не в директории Tomcat-а, а в директории пользователя. Хотя — абсолютно ничто не мешает те же опции задать через скрипт запуска $CATALINA_HOME/bin/startup.sh.

Запускаем:

$ ./bin/startup.sh
ENV is KIEV_DEV;
Using CATALINA_BASE:   /home/user/apache-tomcat-5.5.36
Using CATALINA_HOME:   /home/user/apache-tomcat-5.5.36
Using CATALINA_TMPDIR: /home/user/apache-tomcat-5.5.36/temp
Using JRE_HOME:        /usr/java/jdk1.6.0_45/jre/
Using CLASSPATH:       /home/user/apache-tomcat-5.5.36/bin/bootstrap.jar

Проверяем лог:

$ tail -n 20 ../apache-tomcat-5.5.36/logs/catalina.out | grep HTTP
INFO: Starting Coyote HTTP/1.1 on http-8080
INFO: Starting Coyote HTTP/1.1 on http-8443

Проверяем порты в системе:

$ netstat -anp | grep java
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
...
tcp        0      0 :::8080                     :::*                        LISTEN      16631/java
tcp        0      0 :::8443                     :::*                        LISTEN      16631/java
...

Готово.