У квітні 2013 року виникла потреба запустити другий екземпляр Apache, використовуючи той самий виконуваний файл. Для незалежної роботи потрібно розділити конфігурації, адреси й порти прослуховування, PID-файли та журнали. Два процеси самі по собі не створюють відмовостійкого сервісу.
Нижче збережено початкові команди для середовища з SysV init та пояснено помилки в узгодженні шляхів. На сучасній системі спосіб керування службою слід узгодити з її пакетом і менеджером служб.
Окремі файли й журнали
Початкова схема спиралася на /etc/apache2/apache2.conf, /etc/apache2/ports.conf і /etc/apache2/envvars. Журнали задавалися директивами:
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined
У старій системі копіювали init-скрипт та додавали його в автозапуск:
cd /etc/init.d
cp apache2 apache2_srv
update-rc.d apache2_srv defaults
Практично спочатку варто завершити налаштування й перевірку, а вже потім вмикати автозапуск. У скрипті замість початкового блока:
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_apache2_srv ; echo $APACHE_PID_FILE`
if [ -z "$PIDFILE" ] ; then
echo ERROR: APACHE_PID_FILE needs to be defined in /etc/apache2/envvars_apache2_srv >&2
exit 2
fiENV="env -i LANG=C PATH=/usr/local/bin:/usr/bin:/bin APACHE_ENVVARS=/etc/apache2/envvars_apache2_srv"
cp /etc/apache2/envvars /etc/apache2/envvars_apache2_srv
У копії змінювали PID-файл:
export APACHE_PID_FILE=/var/run/apache2.pidна:
export APACHE_PID_FILE=/var/run/apache2_apache_2.pid
Окремий файл портів у першій частині нотатки називався /etc/apache2/ports_apache_srv.conf і містив:
Listen 81
Для журналів наводилися такі команди:
touch /var/log/apache2/error_apache2_srv.log
touch /var/log/apache2/other_vhosts_access_apache2_srv.log
chown root:root /var/log/apache2/other_vhosts_access_apache2_srv.log
chown root:adm /var/log/apache2/error_apache2_srv.log
chmod 640 /var/log/apache2/error_apache2_srv.log
Передавання команд потрібному екземпляру
У старому init-скрипті був такий блок запуску; у тому середовищі кеш не використовувався:
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="$ENV /usr/sbin/apache2ctl"замінювали на:
APACHE2CTL="$ENV /usr/sbin/apache2ctl -f /etc/apache2/apache2_srv.conf"
Відповідно змінювали команди:
$APACHE2CTL -k start
$APACHE2CTL -k stop
$APACHE2CTL -k graceful
$APACHE2CTL -t
Документація Apache пояснює: -f вибирає конфігурацію, -k задає дію керування, -t перевіряє синтаксис. Потрібні саме узгоджені налаштування цільового екземпляра.
Пошук процесів: недолік старого підходу
Початок функції у старому скрипті:
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_srv' | grep -v 'grep' | awk '{print $2}' | xargs` || true
Обидва уривки є лише початками функції. Пошук через grep залежить від тексту командного рядка й може вибрати не той процес. Загальний pidof apache2 також не розрізняє потрібні екземпляри. Для керування слід використовувати відповідну службу та її окремий PidFile.
Узгодження імен і перевірка запуску
Перша спроба в нотатці завершилася так:
/etc/init.d/apache2_srv start
Starting web server: apache2apache2: Could not open configuration file
/etc/apache2/apache2_failover.conf: No such file or directory
failed!
Помилка посилалася на apache2_failover.conf, хоча вище було задано apache2_srv.conf. Перед запуском потрібно виправити всі виклики, щоб вони посилалися на один обраний файл. У нотатці його створювали так:
cp /etc/apache2/apache2.conf /etc/apache2/apache2_srv.conf
Наприкінці наводилися:
CustomLog /var/log/apache2/other_vhosts_access_apache2_srv.log vhost_combined
ErrorLog /var/log/apache2/error_apache2_srv.log
Include /etc/apache2/ports_apache2_srv.conf
Тут є ще одна розбіжність: раніше файл портів називався ports_apache_srv.conf, без «2» після apache. Назва у Include має точно збігатися з реально створеним файлом. Перевірте також, чи не підключає новий конфіг спільні файли з конфліктними Listen, віртуальними хостами або PID-шляхами.
У початковому тексті згадувалися NameVirtualHost xx.xx.xx.xx:80 та VirtualHost xx.xx.xx.xx:81. Адреси й порти потрібно узгоджувати з Listen. У сучасній гілці Apache 2.4 NameVirtualHost вже не впливає на роботу.
Старий запис завершувався успішним запуском:
/etc/init.d/apache2_srv start
Starting web server: apache2.
Для реальної перевірки потрібні успішний тест конфігурації, окремі PID і журнали, відповідь на потрібному порту та підтвердження, що зупинка другого екземпляра не зачіпає перший.