Apache Webserver – Steuerung

Im September 2017 hat Netcraft neue Zahlen zum Marktanteil von Webservern veröffentlicht. Der Apache Webserver führt weiterhin mit 42.3% das Feld an, Microsofts IIS liegt derzeit noch auf Platz zwei mit 22.5%, wird aber vermutlich demnächst von nginx mit 22.2% überholt. Man kann also behaupten, der Apache Webserver ist der derzeit am meisten verwendete Webserver weltweit.

Da ich ausschließlich Server im Linux/Unix-Umfeld administriere, interessiere ich mich natürlich sehr für den Apache Webserver. Grund genug für mich, sich mit der Steuerung ausgiebig zu beschäftigen und dazu ein paar – möglicherweise auch für andere Admins – interessante Informationen zu teilen.

An dieser Stelle möchte ich daher erklären, welche Befehle es gibt und wie man sie benutzt. Zunächst wären da die Kommandos „apachectl“, „apache2ctl“ und „apache2“, wenn man den Apache Webserver 2.2 oder 2.4 nutzt. Aber auch „systemctl“ oder „service“ sieht man häufiger. Da fragt man sich natürlich, wieso es so viele Kommandos gibt und welche man nutzen sollte.

Der Apache Webserver ist zunächst ein Daemon (Dienst) namens „httpd“. Im produktiven Betrieb läuft dieser Dienst dauerhaft und sorgt dafür, dass die Webseiten auf dem jeweiligen Computer (Server genannt) erreichbar sind und das die Anwender beispielsweise Module wie das sehr bekannte „mod_rewrite“ oder Scriptsprachen wie PHP und Python verwenden können.

Das Kommando „apachectl“ ist nur ein Alias, also eine Verknüpfung, für den Befehl „apache2ctl“. Es handelt sich dabei eigentlich nur um ein Steuerungsscript für den Webserver. Wohingegen „apache2“ schon der Webserver selbst ist aber nicht direkt aufgerufen werden sollte. Vor allem unter Debian-basierten Distributionen (z.B. Ubuntu), kann dies sonst in einem „AH00111“-Fehler enden, wenn man nicht vorher mittels „source /etc/apache2/envvars“ die Umgebungsvariablen dafür läd.

Eselsbrücke: Grob gesagt ist also „httpd“ beispielsweise ein Rennwagen und „apache2ctl“ der Rennwagenfahrer.

Nun aber weiter im Text. Schauen wir uns also die oben genannten Kommandos einmal etwas genauer an. Folgendes würde damit, ohne die Umgebungsvariablen (ENVVARS) laden zu müssen, funktionieren:

root@DeinServer:~# apache2 -v
Server version: Apache/2.4.10 (Debian)
Server built:   Sep 23 2017 04:37:43


root@DeinServer:~# apache2 -l
Compiled in modules:
 core.c
 mod_so.c
 mod_watchdog.c
 http_core.c
 mod_log_config.c
 mod_logio.c
 mod_version.c
 mod_unixd.c

Wohingegen diese Kommandos im „AH00111“-Fehler enden werden, sofern man nicht zuvor mittels „source“, wie oben beschrieben, unter Debian-basierten Systemen, die Umgebungsvariablen läd:

root@DeinServer:~# apache2 -V
[...] AH00111: Config variable ${APACHE_LOCK_DIR} is not defined
[...] AH00111: Config variable ${APACHE_PID_FILE} is not defined
[...] AH00111: Config variable ${APACHE_RUN_USER} is not defined
[...] AH00111: Config variable ${APACHE_RUN_GROUP} is not defined
[...] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
[...] AH00111: Config variable ${APACHE_RUN_DIR} is not defined
[...] ...usw....

Ebenso endet:

root@DeinServer:~# apache2 -L

oder

root@DeinServer:~# apache2 -S

Für diese Befehle kann man aber folgendes auch ohne „source“ ausführen:

apachectl -V
apachectl -L
apachectl -S

Und, weil es halt nur ein Alias ist, auch so:

apache2ctl -V
apache2ctl -L
apache2ctl -S

Kommen wir nun zurück zum Apache-Dienst. Während wir also bisher mittels diesen „Controll Interfaces“ auf den Dienst zugreifen und ihm Informationen entlocken können, können wir auch den Dienst, ohne diese Kommandos, direkt zu einer Tätigkeit bewegen. Im nun folgenden Praxisbeispiel wollen wir den Apache einmal neu starten und haben dafür folgende Möglichkeiten:

1.) /etc/init.d/apache2 restart (bzw. graceful oder reload)
2.) apache2ctl -k restart (bzw. graceful oder reload)
3.) service apache2 restart (bzw. graceful oder reload)
4.) systemctl restart apache2 (bzw. graceful oder reload)

Auf die Unterschiede zwischen „restart“, „graceful“ und „reload“ gehe ich weiter unten ein.

1.) Den „init.d“-Dienst findet man nicht auf jedem Linux/Unix-System, unter Debian-basierten jedoch normalerweise immer. Führt man den Befehl so aus, erhält man in der Konsole auch eine Rückgabe und kann den Prozess damit überwachen. Hat halt den Nachteil, dass es nicht unter allen Linux-Distributionen funktioniert.

2.) „apache2ctl“ führt den restart lautlos durch, ohne Rückgabe in der Konsole und ohne Hinweise in den Logfiles dazu. Kann Vorteil aber auch Nachteil sein.

3.) „service“ führt den restart ebenfalls lautlos durch, ohne Rückgabe in der Konsole. Dafür aber mit einem Eintrag im „/var/log/daemon.log“. Der Vorteil von „service“ ist, dass sich Administratoren nicht zu sehr um das verwendete „init“-System kümmern müssen und die Befehle somit unter allen Distributionen gleich funktionieren sollten. Es ist aktuell allerdings nur ein „Wrapper“ für „systemctl“. Vor der Einführung von „systemd“ war es ein Wrapper für init.d-Scripte.

4.) „systemctl“ verhält sich wie „service“. Es ist ein Kommandozeilenwerkzeug für „systemd“ und kann ein bisschen mehr als der „service“-Wrapper. Das würde an dieser Stelle aber den Rahmen und das Themengebiet etwas sprengen, daher gehe ich eventuell in einem eigenen Artikel mal ausführlicher darauf ein.

Kommen wir nun, abschließend, noch zu den Parametern:

reload: Läd einzig die Konfiguration neu ein. „force-reload“ ist übrigens nur ein Alias dafür.

restart: Ist die Kombination aus „stop“ und „start“. Die Serverstatistiken (mod_status) werden dabei resettet. Die Elternprozesse beenden zunächst „unsanft“ die Kind-Prozesse und danach sich selbst um dann komplett neu zu starten.

graceful: Die „nette“ Art- und Weise den Apache neu zu starten. Hierbei dürfen die Kind-Prozesse erst noch alle Anfragen sauber beenden (oder sofort, wenn sie idlen) und dann wird die Konfiguration neu geladen, die Logfiles neu geöffnet aber die Serverstatistiken (mod_status) bleiben erhalten. Jeder Kind-Prozess wird nach Beendigung sauber neu gestartet, der Elternprozess bleibt erhalten. Ein quasi nahezu unterbrechungsfreier Neustart, ohne das ein Besucher der Webseiten etwas davon merken sollte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.