FastNetMon

Wednesday 13 January 2010

Запуск двух серверов Apache на Debian Linux

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

Итак, достойного мануал для решения задачи я не нашел, так что будем импровизация :)

Для начала обсудим, что должно быть у Апачей общим, а что раздельным. Очевидно, отличаться они будут по файлу /etc/apache2/apache2.conf (т.к. в нем указаны порты и специфичные для каждого из Апачей виртуальные хосты). Файл /etc/apache2/ports.conf содержит прослушиваемые порты, так что он также будет отличаться. Также есть еще файл /etc/apache2/envvars, который содержит путь к файлу для сохранения pid запущенного демона.

Логи? Логи уровня демонов также стоит разделить, они задаются следующими директивами в apache2.conf:

ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined


Идем в папку init скриптов:

cd /etc/init.d


Создаем копию init скрипта родного Апача:

cp apache2 failoverapache


Сразу Добавляем фейловер Апача в автозапуск:
update-rc.d failoverapache defaults


Далее необходимо скорректировать init скрипт failoverapache, сразу оговорюсь, что конфиг файлы "второго Апача" будут иметь суффикс _failover для удобного отличения от оригинала.

Выбираем новый путь до pid файла
Вот здесь упоминается PID, который у нас должен быть свой

PIDFILE=`. /etc/apache2/envvars ; echo $APACHE_PID_FILE`
if [ -z "$PIDFILE" ] ; then
echo ERROR: APACHE_PID_FILE needs to be defined in /etc/apache2/envvars >&2
exit 2
fi


Заменяем на:

PIDFILE=`. /etc/apache2/envvars_failover ; echo $APACHE_PID_FILE`
if [ -z "$PIDFILE" ] ; then
echo ERROR: APACHE_PID_FILE needs to be defined in /etc/apache2/envvars_failover >&2
exit 2
fi


И чуть выше корректируем ENV:

ENV="env -i LANG=C PATH=/usr/local/bin:/usr/bin:/bin APACHE_ENVVARS=/etc/apache2/envvars_failover"


И сразу же корректируем конфиги:

cp /etc/apache2/envvars /etc/apache2/envvars_failover


И следом:

vi /etc/apache2/envvars_failover


И заменяем там:
export APACHE_PID_FILE=/var/run/apache2.pid

на

export APACHE_PID_FILE=/var/run/apache2_failover.pid


ports.conf
Теперь создадим свой файл ports.conf:
vi /etc/apache2/ports_failover.conf


Куда поместим одну директиву:

Listen 8081


Создаем файлы логов
Вот так:
touch /var/log/apache2/error_failover.log
touch /var/log/apache2/other_vhosts_access_failover.log
chown root:root /var/log/apache2/other_vhosts_access_failover.log
chown root:adm /var/log/apache2/error_failover.log
chmod 640 /var/log/apache2/error_failover.log


Теперь давайте посмотрим, как осуществляется управление демоном Апача. Сразу скажу, что кэш мы не используем и следовательно "check_htcacheclean" всегда будет выдавать ложь

Запуск:

start)
log_daemon_msg "Starting web server" "apache2"
if $APACHE2CTL start; then
if check_htcacheclean ; then
log_progress_msg htcacheclean
start_htcacheclean || log_end_msg 1
fi
log_end_msg 0
else
log_end_msg 1
fi
;;


То есть все вопросы к: $APACHE2CTL, его мы будем использовать не как SysV инит скрипт, а будем им проксировать все наши вопросы к apache :)

Для этого в верху скрипта делаем замену:
APACHE2CTL="$ENV /usr/sbin/apache2ctl"


на

APACHE2CTL="$ENV /usr/sbin/apache2ctl -f /etc/apache2/apache2_failover.conf"


Далее изменяем все параметры вызов APACHE2CTL:

$APACHE2CTL start на $APACHE2CTL -k start
$APACHE2CTL stop на $APACHE2CTL -k stop
$APACHE2CTL graceful на $APACHE2CTL -k graceful
$APACHE2CTL configtest на $APACHE2CTL -t



Теперь надо скорректировать функцию pidof_apache, иначе при stop мы будем убивать всех Апаче разом:

Делаем замену:

pidof_apache() {
# if pidof is null for some reasons the script exits automagically
# classified as good/unknown feature
PIDS=`pidof apache2` || true



на:

pidof_apache() {
# if pidof is null for some reasons the script exits automagically
# classified as good/unknown feature
PIDS=`ps aux | grep 'apache2_failover' | grep -v 'grep' | awk '{print $2}' | xargs` || true


Теперь попробуем запустить второго Апача:

/etc/init.d/failoverapache start
Starting web server: apache2apache2: Could not open configuration file /etc/apache2/apache2_failover.conf: No such file or directory
failed!


Облом и вполне оправданный :)

Теперь необходимо на основе apache2.conf составить /etc/apache2/apache2_failover.conf

Скопируем оригинал

cp /etc/apache2/apache2.conf /etc/apache2/apache2_failover.conf


И далее корректируем пути к файлами, которые обсуждали выше.


CustomLog /var/log/apache2/other_vhosts_access_failover.log vhost_combined
ErrorLog /var/log/apache2/error_failover.log
Include /etc/apache2/ports_failover.conf


Теперь надо поменять порты у директив NameVirtualHost xx.xx.xx.xx:8081 и VirtualHost xx.xx.xx.xx:8081.

Повторяем попытку запуска:

/etc/init.d/failoverapache start
Starting web server: apache2.


Ну и дальше по аналогии останется внести все способы перезапуска и протестировать, чтобы Апачи друг с другом не воевали, но это чуть позже.

Для регенерации конфигов можете использовать мой скрипт: http://fastvps.googlecode.com/svn/trunk/scripts/convert_vhosts.pl

No comments :

Post a Comment

Note: only a member of this blog may post a comment.