Multiple Instanzen des Apache Webserver unter Debian Ubuntu

Ein kurzer Abriss wie man unter Debian 8 / Ubuntu 16.04 multiple Instanzen des Apache Webservers anlegt. Hier eine kleiner Überblick von der Debian Wiki Seite. Die originalen Konfigurationsdateien des Apache dienen als Template für jede neu erstellte Instanz und sollten somit nicht gelöscht werden. Das von Debian zur Verfügung gestellte Script wird mit einem frei zu vergebenen Suffix/Namen aufgerufen.

:~# sh /usr/share/doc/apache2/examples/setup-instance zzz
Setting up /etc/apache2-zzz ...
Setting up /etc/init.d/apache2-zzz ...
Setting up symlinks: a2enmod-zzz a2dismod-zzz a2ensite-zzz a2dissite-zzz a2enconf-zzz a2disconf-zzz apache2ctl-zzz
Setting up /etc/logrotate.d/apache2-zzz and /var/log/apache2-zzz ...

Wie man sieht, werden alle gewohnten Apache-Tools für die neue Instanz erzeugt. Das Start/Stop Script sourced das originale Script, weshalb die originale Konfiguration des Apache nicht gelöscht werden darf.

:~# ll -ld /etc/init.d/apache2*
-rwxr-xr-x 1 root root 8087 Apr  5 23:15 /etc/init.d/apache2*
-rwxr-xr-x 1 root root  524 Sep 22 10:28 /etc/init.d/apache2-zzz*

:~# cat /etc/init.d/apache2-zzz
[...]
# source original init script to keep $0 and other arguments
. /etc/init.d/apache2

Es wird ebenfalls ein komplett neuer Apache Konfigurationsbaum aus dem bestehenden Original kopiert. Weshalb man das Original nicht löschen sollte.

:~# cd /etc/apache2-zzz
:~# ls -la
insgesamt 80
drwxr-xr-x  8 root root  4096 Sep 22 10:35 .
drwxr-xr-x 92 root root  4096 Sep 22 10:28 ..
-rw-r--r--  1 root root  7137 Sep 22 10:35 apache2.conf
drwxr-xr-x  2 root root  4096 Aug 25 09:29 conf-available
drwxr-xr-x  2 root root  4096 Aug 24 17:43 conf-enabled
-rw-r--r--  1 root root  1782 Mär 19  2016 envvars
-rw-r--r--  1 root root 31063 Mär 19  2016 magic
drwxr-xr-x  2 root root  4096 Aug 24 17:47 mods-available
drwxr-xr-x  2 root root  4096 Aug 24 17:47 mods-enabled
-rw-r--r--  1 root root   324 Sep 22 10:30 ports.conf
drwxr-xr-x  2 root root  4096 Sep 22 10:32 sites-available
drwxr-xr-x  2 root root  4096 Aug 24 17:43 sites-enabled

Die neue Instanz wird dem Init-System bekannt gemacht.

:~# service apache2-zzz status
  apache2-zzz.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

:~# systemctl enable apache2-zzz
apache2-zzz.service is not a native service, redirecting to systemd-sysv-install
Executing /lib/systemd/systemd-sysv-install enable apache2-zzz

:~# service apache2-zzz status
  apache2-zzz.service - LSB: Start/stop apache2 web server (config /etc/apache2-zzz)
   Loaded: loaded (/etc/init.d/apache2-zzz; bad; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)

Wenn man die obigen Schritte für eine weitere Instanz yyy ausführt und diese zur schnellen Veranschaulichung den Port an zwei Stellen ändert,

:~# vim /etc/apache2-yyy/ports.conf
Listen 81

:~# vim /etc/apache2-yyy/sites-enabled/000-default.conf
<VirtualHost *:81>

lassen sich entsprechend für den Konfigurationcheck das Starten usw die Apache-Tools mit dem angegebenen Suffix wie gewohnt verwenden.

:~# apache2ctl-zzz configtest
Syntax OK

:~# apache2ctl-yyy configtest
Syntax OK

:~# apache2ctl-zzz start
:~# apache2ctl-yyy start

Nach dem Start laufen zwei getrennte Apache Instanzen.

/usr/sbin/apache2 -d /etc/apache2-zzz -k start
 \_ /usr/sbin/apache2 -d /etc/apache2-zzz -k start
 \_ /usr/sbin/apache2 -d /etc/apache2-zzz -k start
 \_ /usr/sbin/apache2 -d /etc/apache2-zzz -k start
 \_ /usr/sbin/apache2 -d /etc/apache2-zzz -k start
 \_ /usr/sbin/apache2 -d /etc/apache2-zzz -k start

/usr/sbin/apache2 -d /etc/apache2-yyy -k start
 \_ /usr/sbin/apache2 -d /etc/apache2-yyy -k start
 \_ /usr/sbin/apache2 -d /etc/apache2-yyy -k start
 \_ /usr/sbin/apache2 -d /etc/apache2-yyy -k start
 \_ /usr/sbin/apache2 -d /etc/apache2-yyy -k start
 \_ /usr/sbin/apache2 -d /etc/apache2-yyy -k start

Reboot-Festigkeit

Wenn man den default Apache per

:~# systemctl disable apache2
apache2.service is not a native service, redirecting to systemd-sysv-install
Executing /lib/systemd/systemd-sysv-install disable apache2
insserv: warning: current start runlevel(s) (empty) of script `apache2' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `apache2' overrides LSB defaults (0 1 6).

vom boot Prozess herausnimmt, wird man festellen, dass die angelegten neuen Apache Instanzen nach einem Reboot nicht wieder starten. Dies liegt anscheinend an einem vergessenen $SUFFIX in der envvars. Nach dem Reboot ist das unter tmpfs stehende Verzeichnis /var/run/apache2 nicht mehr vorhanden und die einzelnen Apache Instanzen können keine .pid Files mehr anlegen. Der Vorgang wurde als Bug-Report im Ubuntu-Launchpad und bei Debian bekannt gemacht.

:~# cat /var/log/apache2-zzz/error.log
[...]
[Sat Sep 24 11:10:00.566132 2016] [core:error] [pid 2229] AH00100: apache2: could not log pid to file /var/run/apache2/apache2-zzz.pid
[...]

In jedem Instanzen envvars muss die PID Zeile um eine $SUFFIX erweitert werden.

:~# vim /etc/apache2-zzz/envvars
[...]
#export APACHE_PID_FILE=/var/run/apache2/apache2$SUFFIX.pid
export APACHE_PID_FILE=/var/run/apache2$SUFFIX/apache2$SUFFIX.pid

Nach dem Reboot laufen die Instanzen mit ihrem entsprechenden .pid File in ihren getrennten Verzeichnissen.

:~$ ls -la /var/run/apache2-*
/var/run/apache2-zzz:
[...]
-rw-r--r--  1 root root   5 Sep 24 11:52 apache2-zzz.pid

/var/run/apache2-yyy:
[...]
-rw-r--r-- 1 root root 5 Sep 24 11:52 apache2-yyy.pid

Patch für /etc/apache2/envvars

:~$ cat envvars.patch
 
--- envvars 2016-09-25 10:54:40.901929219 +0200
+++ envvars.new 2016-09-25 10:54:08.113544407 +0200
@@ -16,7 +16,7 @@ fi
 export APACHE_RUN_USER=www-data
 export APACHE_RUN_GROUP=www-data
 # temporary state file location. This might be changed to /run in Wheezy+1
-export APACHE_PID_FILE=/var/run/apache2/apache2$SUFFIX.pid
+export APACHE_PID_FILE=/var/run/apache2$SUFFIX/apache2$SUFFIX.pid
 export APACHE_RUN_DIR=/var/run/apache2$SUFFIX
 export APACHE_LOCK_DIR=/var/lock/apache2$SUFFIX
 # Only /var/log/apache2 is handled by /etc/logrotate.d/apache2.