2009/09/24

Tomcat 6 на 80-м порту

Данная заметка описывает "с нуля" процесс установки и конфигурирования Tomcat 6 на 80-м порту для Linux Debian 5.0 Lenny.
Для работы Tomcat необходимо наличие Java (пакет sun-java6-jdk (или хотя бы sun-java6-jre) из non-free репозитария). 6-го Tomcat пока нет в Debian Stable версии, поэтому ставим всё руками.
Скачиваем, распаковываем, подготавливаем пользователя и наводим порядок с правами.
wget http://www.apache.lt/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz
tar zxf apache-tomcat-6.0.20.tar.gz
mv apache-tomcat-6.0.20/ /opt/
cd /opt
ln -s apache-tomcat-6.0.20/ tomcat
useradd --system --home-dir /opt/tomcat tomcat
chown -R tomcat:tomcat /opt/apache-tomcat-6.0.20/
mkdir /var/run/tomcat && chown tomcat /var/run/tomcat
ln -s /var/log/tomcat /opt/tomcat/logs/
В файл /etc/profile добавляем описание переменной JAVA_HOME
JAVA_HOME=/usr/lib/jvm/java-6-sun/
export JAVA_HOME
Как сказано в официальной документации для работы Tomcat на привилигерованном порту (коим является порт 80) от имени обычного пользователя необходимо использовать jsvc:
cd /opt/tomcat/bin
tar xvfz jsvc.tar.gz
cd jsvc-src
autoconf
./configure --with-java=/usr/lib/jvm/java-6-sun/
make
cp jsvc ..
cd ..
В основном конфигурационном файле tomcat'а, меняем порт на 80
connector port="80" protocol="HTTP/1.1" connectiontimeout="20000" redirectport="8443"
Осталось подготовить init-скрипт и сконфигурировать автоматический запуск tomcat-сервиса
# cat > /etc/init.d/tomcat
#! /bin/sh -e
#
# /etc/init.d/tomcat -- startup script for the Tomcat 6.0 servlet engine
#
### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: $named
# Should-Stop: $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start Tomcat.
# Description: Start the Tomcat servlet engine.
### END INIT INFO

NAME=tomcat
DESC="Tomcat 6.0 servlet engine"
CATALINA_HOME=/opt/$NAME
TOMCAT_USER=tomcat
LOGDIR="/opt/tomcat/logs"
PIDFILE="/var/run/tomcat/$NAME.pid"
TMP_DIR=/tmp
CATALINA_OPTS=""
CLASSPATH=\
#$JAVA_HOME/lib/tools.jar:\
#$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar

case "$1" in
start)
echo "Starting $DESC using Java from $JAVA_HOME"
#
# Start Tomcat
#
$CATALINA_HOME/bin/jsvc \
-user $TOMCAT_USER \
-home $JAVA_HOME \
-Dcatalina.home=$CATALINA_HOME \
-Djava.io.tmpdir=$TMP_DIR \
-wait 10 \
-pidfile $PIDFILE \
-outfile $CATALINA_HOME/logs/catalina.out \
-errfile '&1' \
$CATALINA_OPTS \
-cp $CLASSPATH \
org.apache.catalina.startup.Bootstrap
#
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
exit $?
;;
stop)
echo "Stopping $DESC"
#
# Stop Tomcat
#
$CATALINA_HOME/bin/jsvc \
-stop \
-pidfile $PIDFILE \
org.apache.catalina.startup.Bootstrap
exit $?
;;
restart|force-reload)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: /etc/init.d/tomcat {start|stop|restart}" >&2
exit 1
;;
esac

exit 0
[Ctrl+D]
# chmod +x /etc/init.d/tomcat
# update-rc.d tomcat defaults
Adding system startup for /etc/init.d/tomcat ...
/etc/rc0.d/K20tomcat -> ../init.d/tomcat
/etc/rc1.d/K20tomcat -> ../init.d/tomcat
/etc/rc6.d/K20tomcat -> ../init.d/tomcat
/etc/rc2.d/S20tomcat -> ../init.d/tomcat
/etc/rc3.d/S20tomcat -> ../init.d/tomcat
/etc/rc4.d/S20tomcat -> ../init.d/tomcat
/etc/rc5.d/S20tomcat -> ../init.d/tomcat
Запускаем сервис
# /etc/init.d/tomcat start
Starting Tomcat 6.0 servlet engine using Java from /usr/lib/jvm/java-6-sun

Ссылки:
  1. How to run Tomcat on Port 80
  2. Tomcat Setup

2009/09/01

Bacula Heartbeat Interval

При использовании резервного копирования Bacula вылезает ньюанс, если между Director-сервером и FD-сервером (клиентом) находится маршрутизатор (используется NAT) - выполняемая задача (job) может вдруг ни с того, ни с сего остановиться с ошибкой "Fatal error: Network error with FD during Backup: ERR=Connection reset by peer".
Дело всё в том, что Director, инициируя задачу на клиенте, в процессе выполнения просто ждёт - весь трафик идёт между FD-сервером (клиентом) и SD-сервером (storage). Маршрутизатор спустя установленное время (timeout, у cisco - 7200 секунд) решив, что соединение между Director-сервером и FD-сервером (клиентом) умерло, просто удаляет информацию о соединении из своей таблицы соединений, обрывая таким образом выполняемую задачу.
Решается проблема тривиально - на FD-сервере (клиенте) в конфигурационном файле в секцию FileDaemon добавить:
Heartbeat Interval = 60
При действующем Heartbeat-интервале FD-сервер в процессе выполнения работы пересылает heartbeat-пакеты Director-серверу, создавая таким образом активность в соединении и маршрутизатор, видя, что соединение "живо", не вмешивается.

Ссылки:
  1. Client/File daemon Configuration
  2. Timeout (?) problems with some Full backups