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

2009/08/26

Пример конфигурирования IPMI на сервере

IPMI - интеллектуальный интерфейс управления платформой, помогающий следить (и не только) за сенсорами состояния железа на сервере (температуры, напряжения, скоростью вращения вентиляторов, состоянием источников питания и т.п.).
Задача - сконфигурировать IPMI-интерфейс на сервере, с возможностью получать данные о сенсорах по сети. Операционная система RHEL/CentOS 5, сервер Intel S5000PAL.
Для начала нужно установить пакеты с модулями и необходимыми утилитами:
yum install OpenIPMI-tools OpenIPMI
chkconfig ipmi on && service ipmi start
Starting ipmi drivers: [ OK ]
Прежде чем приступать к конфигурированию, необходимо решить, на каком физическом сетевом адаптере сервер будет отвечать на IPMI-запросы. На языке IPMI, сетевой адаптер - это канал. Первый канал соответствует первому сетевому интерфейсу, но их mac-адреса отличаются, поэтому можно смело выбирать незанятую ip-сеть для IPMI-мониторинга и назначать выбранному каналу (сетевой плате) ip-адрес для использования IPMI.
Для примера я выбрал первый канал (первую сетевую плату).
ipmitool shell
ipmitool> lan set 1 ipaddr 10.10.16.115
Setting LAN IP Address to 10.10.16.115
ipmitool> lan set 1 defgw ipaddr 10.10.16.254
Setting LAN Default Gateway IP to 10.10.16.254
Открываем возможность использования IPMI по сети, а также говорим, что будем использовать MD5-хэширования при аутентификации:
ipmitool> lan set 1 access on
ipmitool> lan set 1 auth ADMIN MD5
Создаем пользователя, включаем его и назначем ему ADMINISTRATOR-права:
ipmitool> user set name 2 monuser
ipmitool> user set password 2 monpassword
ipmitool> user enable 2
ipmitool> channel setaccess 1 2 ipmi=on privilege=4
ipmitool> user list 1
ID Name Enabled Callin Link Auth IPMI Msg Channel Priv Limit
2 monuser true true false true ADMINISTRATOR
ipmitool>
Вот так выглядит первый канал, после всех приготовлений:
ipmitool> lan print 1
Set in Progress : Set Complete
Auth Type Support : NONE MD5 PASSWORD
Auth Type Enable : Callback :
: User :
: Operator :
: Admin : MD5
: OEM :
IP Address Source : BIOS Assigned Address
IP Address : 10.10.16.115
Subnet Mask : 255.255.255.0
MAC Address : 00:04:23:dc:12:d2
SNMP Community String :
IP Header : TTL=0x40 Flags=0x40 Precedence=0x00 TOS=0x10
BMC ARP Control : ARP Responses Enabled, Gratuitous ARP Enabled
Gratituous ARP Intrvl : 2.0 seconds
Default Gateway IP : 10.10.16.254
Default Gateway MAC : 00:00:00:00:00:00
Backup Gateway IP : 0.0.0.0
Backup Gateway MAC : 00:00:00:00:00:00
RMCP+ Cipher Suites : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14
Cipher Suite Priv Max : XXXXXXXXXXXXXXX
: X=Cipher Suite Unused
: c=CALLBACK
: u=USER
: o=OPERATOR
: a=ADMIN
: O=OEM
ipmitool>
Теперь с monitoring-сервера можно обращаться к IPMI-интерфейсу и забирать информацию об интересующих сенсорах:
ipmitool -I lan -A MD5 -U monuser -P monpassword -H 10.10.16.115 power status
Chassis Power is on
ipmitool -I lan -A MD5 -U monuser -P monpassword -H 10.10.16.115 sensor
BB +1.2V Vtt | 1.197 | Volts | ok | na | 1.096 | 1.134 | 1.285 | 1.323 | na
BB +1.5V AUX | 1.474 | Volts | ok | na | 1.334 | 1.373 | 1.622 | 1.669 | na
BB +1.5V | 1.482 | Volts | ok | na | 1.326 | 1.365 | 1.625 | 1.677 | na
BB +1.8V | 1.795 | Volts | ok | na | 1.622 | 1.673 | 1.907 | 1.969 | na
BB +3.3V | 3.337 | Volts | ok | na | 2.941 | 3.027 | 3.578 | 3.681 | na
BB +3.3V STB | 3.388 | Volts | ok | na | 3.027 | 3.113 | 3.509 | 3.612 | na
BB +1.5V ESB | 1.505 | Volts | ok | na | 1.357 | 1.404 | 1.591 | 1.638 | na
BB +5V | 5.070 | Volts | ok | na | 4.446 | 4.576 | 5.408 | 5.564 | na
BB +12V AUX | 11.842 | Volts | ok | na | 10.416 | 10.726 | 13.144 | 13.578 | na
BB +0.9V | 0.902 | Volts | ok | na | 0.811 | 0.835 | 0.950 | 0.979 | na
Serverboard Temp | 28.000 | degrees C | ok | na | 5.000 | 10.000 | 61.000 | 66.000 | na
Ctrl Panel Temp | 22.000 | degrees C | ok | na | 0.000 | 5.000 | 44.000 | 48.000 | na
Fan 2 | 7267.000 | RPM | ok | na | 1720.000 | 1978.000 | na | na | na
Fan 4 | 5590.000 | RPM | ok | na | 1720.000 | 1978.000 | na | na | na
Fan 5 | 7316.000 | RPM | ok | na | 2046.000 | 2356.000 | na | na | na
PS1 AC Current | 0.434 | Amps | ok | na | na | na | 11.222 | 11.904 | na
PS2 AC Current | 0.434 | Amps | ok | na | na | na | 11.222 | 11.904 | na
PS1 +12V Current | 7.000 | Amps | ok | na | na | na | 66.000 | 70.000 | na
PS2 +12V Current | 7.000 | Amps | ok | na | na | na | 66.000 | 70.000 | na
PS1 +12V Power | 80.000 | Watts | ok | na | na | na | 792.000 | 840.000 | na
...
И это только сбор информации, а можно и питанием удалённо управлять, в обход операционной системы, так что будете аккуратны :)

Ссылки:
  1. An introduction to IPMI (... to be completed)
  2. Configuring and Securing IPMI on Dell PowerEdge x8xx Hardware
  3. ipmitool manpage

2009/08/21

В помощь администратору: Autossh

Иногда необходимо иметь возможность удалённо управлять какими-то системами, которые находятся за firewall'ами, которые Вы не контролируете. В таких случаях помогают ssh-тунели с использованием перенаправления (forwarding) портов. Например, допустим имеется удалённая машина trick, которая находится за маршрутизатором в удалённой локальной сети, и вторая машина rose имеющая внешний ip-адрес. Для того, чтобы иметь возможность с rose заходить на trick (либо использовать какой-то сервис на trick), необходимо поднять туннель с использованием перенаправления удаленных портов (remote port forwarding):
ssh -f -N username@rose -R 3722:127.0.0.1:22
Получаем такую картину: на rose в списке открытых портов появляется порт 3722, который на самом деле перенаправляет все пакеты на 22-й порт trick-системы. После этого можно логиниться через ssh на trick из rose:
ssh username@127.0.0.0 -p 3722
А что делать, чтобы тунели были постоянно доступны? Ведь ssh-соединения бывают рвуться и тогда опять необходимо с trick-системы инициировать тунель. А если trick находится в 100 км от Вас? А если их таких у Вас 20? :) Вот тут-то и помогает замечательная вещь - autossh, утилитка занимающаяся тем, что поддерживает поднятые ssh-тунели в рабочем состоянии. Перед её запуском необходимо установить переменную AUTOSSH_PORT, указывающую номер порта, который будет использоваться для heartbeat-пакетов на предмет того - жив ли тунель.
Также, если тунели необходимо поднимать во время старта системы, советуют установить переменную AUTOSSH_GATETIME=0. Переменная AUTOSSH_DEBUG позволит получить из логов дополнительную информацию о ходе процесса.
export AUTOSSH_DEBUG=1
export AUTOSSH_GATETIME=0
export AUTOSSH_PORT=20037
autossh -f -N username@rose -R 3722:127.0.0.1:22
Без ключа -f апликация не отправляется в фон, поэтому данный режим полезен, чтобы разбираться с проблемами при установлении тунеля, если они возникают.
В приведенном выше примере кроме портов rose:3722 и trick:22 поднимается ещё 3 дополнительных (так как установлена переменная AUTOSSH_PORT) - trick:20037, rose:20037, trick:20038, связанных между собой в цепочку для прохождения heartbeat-пакета. Таким образом, что отправляя запрос на trick:20037, пакет приходит на rose:20037, который в свою очередь перенаправляет его дальше на trick:20038. Получается своеобразный "бумеранг", позволяющий следить за тунелем.

Links:
  1. Keeping your SSH connections alive with autossh

2009/07/03

Конфигурирование bonding для сетевых интерфейсов на RHEL/CentOS 5

Конфигурация необходимых сетевых интерфейсов:
  • eth0
# cat > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
[Ctrl+D]
  • eth1:
# cat > /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
[Ctrl+D]
  • bond0:
# cat > /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
NETWORK=10.10.70.0
IPADDR=10.10.70.77
NETMASK=255.255.255.0
USERCTL=NO
[Ctrl+D]
Загружаем модуль и перегружаем сеть:
# cat >> /etc/modprobe.conf
alias bond0 bonding
options bond0 mode=1 miimon=100
[Ctrl+D]
# service network restart
Просмотр статуса:
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.2.4 (January 28, 2008)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth1
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Link Failure Count: 2
Permanent HW addr: 00:1b:11:50:7a:01

Slave Interface: eth1
MII Status: up
Link Failure Count: 1
Permanent HW addr: 00:18:fe:8c:a1:96

Links:
  1. Implement bonding in RHEL 5
  2. Network Card Bonding On CentOS

2009/06/29

Как безболезненно сменить ip-адрес сайта (хоста)?

За разрешение имён хостов в ip-адреса и наоборот ответственна служба DNS. Чтобы снизить нагрузку на уполномоченные за зону (домен) сервера используется кеширование dns-запросов, и в настройках DNS-сервисов есть параметры, помогающие гибко сконфигурировать данную функциональность.

В описании зоны есть параметры для вторичных серверов:
refresh - интервал обновления зоны (в секундах) для вторичных уполномоченных серверов
retry - интервал попытки обновления зоны (в секундах) при неудаче обновления
expire - интервал истечения полномочий для вторичных уполномоченных серверов при неудаче обновления (в секундах)

В рамках вопроса, который интересовал меня (см. subject) наиболее интересны параметры Default TTL, TTL, Minimum TTL. Они определяют время TTL (Time-to-live - "время жизни"), в течение которого DNS-серверы (кроме вторичных), получившие информацию о записях с любого DNS-сервера, будут ее хранить в своей памяти (кэше) и сообщать ее по запросам других DNS-серверов.

  • TTL - этот параметр определяет период времени (в секундах), в течение которого другие DNS-сервера должны хранить запись в кэше. Если значение параметра в записи не указано, то "время жизни" определяется параметром Default TTL.
  • Default TTL - определяет значение параметра TTL для тех записей, для которых это значение не установлено явно. Обычно используется именно Default TTL вместо указания TTL для каждой записи.
  • Minimum TTL - определяет "время жизни" отрицательных ответов на запросы о ресурсах, не существующих в DNS.

Таким образом, если Вы готовитесь сменить ip-адрес сайта (хоста) и хотите об этом объявить через СМИ (с указанием конкретной даты), Вам необходимо заранее изменить (Default)TTL-записи Вашей зоны (либо конкретных хостов в зоне) на маленькие значения, например 5 минут (60 секунд), подождать, пока изменения вступят в силу и обязательно проверить.
После того как перенос будет завершён не забудьте вернуть значения назад, чтобы снизить нагрузку на уполномоченные за Вашу зону dns-сервера.
Безусловно, это не решит всех проблем, так как есть крупные dns-forward'еры (dns-сервера), которые используются большим числом людей (например, провайдер даёт пользоваться своим dns-сервером) и которые могут игнорировать заданные Вами TTL-значения. В данном случае ничего кроме пресловутого "ждите" не поможет. Хотя можете попробовать добраться до админов данного dns-сервера и попросить их руками выбросить из кэша данные о Вашем старом ip-адресе :)

Links:
  1. DNS-Master - Редактор файлов зон DNS :: Помощь
  2. Bog BOS: DNS (Domain Name System)
  3. Moving your website to another server? Tune your DNS for minimum downtime.

2009/06/10

Замена PGP ключей в Debian для подписывания пакетов

Debian в очередной раз меняют pgp-ключи, которыми подписаны deb-пакеты в официальных репозитариях. Чтобы apt продолжал работать, необходимо выполнить следущее:
# gpg --keyserver wwwkeys.eu.pgp.net --recv-keys 9AA38DCD55BE302B
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: requesting key 55BE302B from hkp server wwwkeys.eu.pgp.net
gpg: key 55BE302B: public key "Debian Archive Automatic Signing Key (5.0/lenny) " imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
# gpg --armor --export 9AA38DCD55BE302B | apt-key add -
OK
# apt-get update

Ссылки:
  1. Debian Archive Signing Key to be changed
  2. Apt-key gpg tip