Multiple Instanzen des Apache Webserver unter Debian 9 Ubuntu 18.04

Seit dem letzten Artikel zum gleichen Thema ist die Entwicklung hin zu Systemd mehr vollzogen worden. Dies führt allerdings zu einem Logrotations Problem.

Da die default Installation des apache2 Paketes mit all seinen Konfigurationsdateien als Template dient, ist es ratsam Konfigurationsänderungen unter /etc/apache2 zu unterlassen und diesen ebenfalls aus dem Start Prozess zu entfernen.

:~# systemctl stop apache2
:~# systemctl disable apache2
Synchronizing state of apache2.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable apache2
Removed /etc/systemd/system/multi-user.target.wants/apache2.service.

Wie gewohnt wird das von Debian zur Verfügung gestellte Skript mit einem frei zu vergebenen Suffix/Namen aufgerufen.

:~# sh /usr/share/doc/apache2/examples/setup-instance multi-xxx
Setting up /etc/apache2-multi-xxx ...
systemd is in use, no init script installed
use the 'apache2@multi-xxx.service' service to control your new instance
sample commands:
systemctl start apache2@multi-xxx.service
systemctl enable apache2@multi-xxx.service
Setting up symlinks: a2enmod-multi-xxx a2dismod-multi-xxx a2ensite-multi-xxx a2dissite-multi-xxx a2enconf-multi-xxx a2disconf-multi-xxx apache2ctl-multi-xxx
Setting up /etc/logrotate.d/apache2-multi-xxx and /var/log/apache2-multi-xxx ...
Setting up /etc/default/apache-htcacheclean-multi-xxx

Die Steuerung der Apache-Multi Instanz wird über Systemd geregelt.

:~# systemctl enable apache2@multi-xxx.service
Created symlink /etc/systemd/system/multi-user.target.wants/apache2@multi-xxx.service ? /lib/systemd/system/apache2@.service.

:~# systemctl start apache2@multi-xxx.service
:~# systemctl stop apache2@multi-xxx.service
:~# systemctl status apache2@multi-xxx.service
:~# systemctl reload apache2@multi-xxx.service
:~# systemctl restart apache2@multi-xxx.service

Insbesondere ist das Augenmerk auf den Hinweise „systemd is in use, no init script installed“ zu richten. Das heißt, dass kein Start/Stop Skript für die gerade erstellte Apache-Multi Instanz unter /etc/init.d/ angelegt wurde.

:~# ls -ld /etc/init.d/apache*
-rwxr-xr-x 1 root root 8181 Nov  3 12:34 /etc/init.d/apache2
-rwxr-xr-x 1 root root 2489 Nov  3 12:34 /etc/init.d/apache-htcacheclean

Dies führt nun allerdings vom kopierten und veränderten default Logrotations Skript zu einem Problem. Die betreffenden Zeilen aus dem setup-instance Skript.

:~# cat /usr/share/doc/apache2/examples/setup-instance
[...]
echo Setting up /etc/logrotate.d/apache2-$SUFFIX and /var/log/apache2-$SUFFIX ...
cp -a /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-$SUFFIX
perl -p -i -e s,apache2,apache2-$SUFFIX,g /etc/logrotate.d/apache2-$SUFFIX
[...]

Das kopierte und angepasste Logrotations Skript

:~# cat /etc/logrotate.d/apache2-multi-xxx
/var/log/apache2-multi-xxx/*.log {
        daily
        missingok
        rotate 14
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                if invoke-rc.d apache2-multi-xxx status > /dev/null 2>&1; then \
                    invoke-rc.d apache2-multi-xxx reload > /dev/null 2>&1; \
                fi;
        endscript
        prerotate
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                        run-parts /etc/logrotate.d/httpd-prerotate; \
                fi; \
        endscript
}

Und hier wird das Problem ersichtlich. Die default Installation des apache2 Paketes beinhaltet wie weiter oben gezeigt noch ein /etc/init.d/apache2 Skript. Allerdings schlagen die an die Apache-Multi Instanz angepassten invok-rc.d Befehle fehl.

:~# invoke-rc.d apache2-multi-xxx status
Unit apache2-multi-xxx.service could not be found.
invoke-rc.d: initscript apache2-multi-xxx, action "status" failed.

:~# invoke-rc.d apache2-multi-xxx reload
/usr/sbin/invoke-rc.d: 527: /usr/sbin/invoke-rc.d: /etc/init.d/apache2-multi-xxx: not found
invoke-rc.d: initscript apache2-multi-xxx, action "reload" failed.

Eine Anpassung hin zu Systemd in dem Logrotations Skript löst augenscheinlich das Problem.

:~# vim /etc/logrotate.d/apache2-multi-xxx
[...]
                if systemctl status apache2@multi-xxx.service >
/dev/null 2>&1; then \
                    systemctl reload apache2@multi-xxx.service >
/dev/null 2>&1; \
[...]

Das Ganze wurde auch als Debian-Bug-Report eingestellt. Mittlerweile wurde auch ein Patch der das Problem löst erstellt.