Apache Tutorial 1: Apache Kompilieren

Title: Apache Kompilieren
Author: Christian Folini
Tutorial Nr: 1
Erscheinungsdatum: 21.10.2010
Schwierigkeit: Leicht
Dauer: 1/2h

Was machen wir?

Wir kompilieren einen Apache Webservers für ein Testsystem

Warum tun wir das?

Im professionellen Einsatz des Webservers geschieht es regelmässig, dass besondere Bedürfnisse (Security, zusätzliche Debug-Messages, spezielle Funktionalität dank eines neuen Patches etc.) einen zwingen, sich von den Distributionspaketen zu verabschieden und rasch eigene Binaries herzustellen. In diesem Fall ist es wichtig, dass die Infrastruktur bereit steht und man erste Erfahrungen mit dem Kompilieren und Produktivschalten der eigenen Binaries mitbringt. Zudem lässt sich in einem Laborsetup leichter mit einem selbst kompilierten Apache arbeiten, was auch beim Debuggen von Vorteil ist.

Schritt 1: Bereitmachen des Verzeichnisbaumes für den Sourcecode

Prinzipiell spielt es keine grosse Rolle, wo der Sourcecode liegt. Das Folgende ist ein Vorschlag, der sich am File Hierarchy Standard orientiert. Der FHS definiert den Pfadbaum eines Unix-Systems; also die Ablagestruktur für sämtliche Dateien.

$> sudo mkdir /usr/src/apache
$> sudo chown `whoami` /usr/src/apache

Schritt 2: Herunterladen des Sourcecodes

Jetzt laden wir den Programmcode vom Netz herunter. Man kann das mit dem Browser direkt von Apache tun, oder man schont die Bandbreite des Apache Projektes und zieht ihn mittels wget von einem Mirror.

$> cd /usr/src/apache
$> wget http://apache.mirror.clusters.cc/httpd/httpd-2.2.21.tar.gz

Der gepackte Sourcecode hat etwa eine Grösse von 6MB.

Schritt 3: Überprüfen der Checksumme

Normalerweise geht nichts schief. Aber es ist eine gute Angewohnheit, Sourcecode auf seine Integrität hin zu prüfen. Dazu laden wir die Checksumme der Sourcecodedatei direkt von Apache herunter. Sicherheitshalber verwenden wir dazu eine gesicherte Verbindung. Ohne https macht das keinen grossen Sinn.

$> wget https://www.apache.org/dist/httpd/httpd-2.2.21.tar.gz.sha1

Beide Files, der Sourcecode und die kleine Prüfsummendatei sollten nebeneinander in /usr/src/apache liegen. Zeit die Prüfsumme zu testen:

$> sha1sum --check httpd-2.2.21.tar.gz.sha1

Wir erwarten Folgendes als Antwort:

httpd-2.2.21.tar.gz: OK

Schritt 4: Entpacken und Compiler Konfigurieren

Nach der Überprüfung können wir das Paket entpacken.

$> tar xvzf httpd-2.2.21.tar.gz

Das ergibt nun etwa 38MB.

Wir gehen nun in das Verzeichnis und konfigurieren den Compiler mit unseren Eingaben und mit Informationen zu unserem System. Neben den Optionen der Kommando-Zeile sucht sich das Configure-Skript selbst sehr viele Informationen zu unserem System zusammen. Dies Infos werden dann für den Compiler bereit gestellt.

$> cd httpd-2.2.21
$> ./configure --prefix=/opt/apache-2.2.21 --with-mpm=worker --enable-mods-shared=all --with-included-apr

Hier bestimmen wir das Zielverzeichnis für den zukünftigen Apache Webserver; wieder konform mit dem FHS. Wichtig ist die nächste Option with-mpm. Damit bestimmen wir das sogenannte Prozessmodell des Servers. Das ist – vereinfacht gesagt – so etwas wie der Motorentyp der Maschine: Benzin oder Diesel. In unserem Fall stehen worker, prefork und ein paar experimentelle Motoren zur Verfügung. Wir nehmen hier den worker, der etwas schneller ist und sich neben einigen Nachteilen vor allem für das Bereitstellen statischer Files und als Secure Reverse Proxy eignet. Mehr Infos zur bisweilen komplizierten Wahl des richtigen Motors liefert das Apache Projekt.

Dann bestimmen wir noch, dass wie alle (all) Module mitkompilieren möchten. Dabei ist zu wissen, dass all hier nicht wirklich alle bedeutet. Aus historischen Gründen meint all nur sämtliche Kern-Module Und nn definieren wir, dass wir die dem Programmcode beiliegende APR benutzen möchten. Wenn das MPM der Motor war, dann ist das APR sowas wie das Chassis der Maschine.

Der Configure-Befehl beschwert sich oft über fehlende Komponenten. Ist klar: Ohne funktionierenden Compiler können wir nicht kompilieren und das Configure hat die Aufgabe nachzusehen, ob alles gut beisammen ist.

Sachen, die typischerweise fehlen, sind Folgende:

  • binutils
  • gcc
  • zlibc
  • zlib1g-dev (je nach Distribution mag dieses Paket anders heissen)

Das lässt sich leicht beheben, indem man sie mit den Hilfsmitteln der eigenen Distribution nachinstalliert. Danach configure neu ausführen, eventuell nochmals zwei, drei Mal etwas nachinstallieren und irgendwann läuft das Skript dann erfolgreich durch.

Schritt 5: Kompilieren

Nun sind wir bereit für den Compiler. Hier sollte nun nichts mehr schief gehen.

$> make

Das dauert einen Moment und aus den 38MB werden gut 70MB.

Schritt 7: Installieren

Wenn das geklappt hat, dann installieren wir den selbst gebauten Apache Webserver. Wir müssen das Installieren durch den Superuser vornehmen lassen. Aber danach schauen wir gleich zu, dass wir wieder in Besitz des Webservers kommen. Für ein Testsystem ist das viel praktischer.

$> sudo make install
Auch die Installation dauert eine Weile.
$> sudo chown -R `whoami` /opt/apache-2.2.21

Und jetzt noch ein Kniff: Wenn man professionell mit Apache arbeitet, dann hat man oft mehrere verschiedene Versionen nebeneinander auf der Testmaschine. Verschiedene Versionen, verschiedene Patches, andere Module etc. führen zu recht mühsamen und langsamen Pfaden mit Versionsnummern und weiteren Beschreibungen. Ich mache es dann jeweils so, dass ich einen Softlink von /apache auf den aktuellen Apache Webserver lege. Dabei ist darauf zu achten, dass auch der Softlink uns und nicht dem root-User gehört (Dies wird bei der Konfiguration des Servers wichtig).

$> sudo ln -s /opt/apache-2.2.21 /apache
$> sudo chown `whoami` --no-dereference /apache
$> cd /apache

Unser Webserver hat nun also einen klaren Pfad, der ihn mit der Versionsnummer eindeutig beschreibt. Im Alltag verwenden wir aber einfach /apache für den Zugriff. Das erleichtert die Arbeit.

Schritt 8: Starten

Dann wollen wir mal sehen, ob die Maschine anspringt. Das müssen wir für den Moment wieder durch den Superuser erledigen lassen:

$> sudo ./bin/httpd -X

Das ist wieder ein Kniff für den Testbetrieb: Apache ist eigentlich ein Daemon der im Hintergrund läuft. Für einfache Tests ist das aber eher nervig, da wir den Daemon andauernd starten, stoppen, neu laden und sonstwie manipulieren müssen. Mit der Option -X teilen wir Apache mit, dass er sich das mit dem Daemon erst mal sparen und dass er schön im Vordergrund als Single-Prozess/-Thread bleiben soll. Auch das hilft bei der Arbeit.

Vermutlich gibt es nun beim Start eine Warnung:

httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

Das ist nicht weiter schlimm und wir können sie für den Moment ignorieren.

Schritt 9: Ausprobieren

Die Maschine läuft nun also. Aber funktioniert sie auch? Zeit für den Funktionstest: Wir sprechen den Apache mit dem Browser unter folgendem Link an:

http://127.0.0.1

Da erwarten wir dann Folgendes:


Im Browser zeigt der Apache ein erstes Lebenszeichen.

Super! Ziel erreicht: Der selbst kompilierte Apache läuft.

Zurück in die Shell und Abschalten des Servers mit STRG-C oder für uns Schweizer mit CTRL-C.

Schritt 10 (Bonus): Ansehen des Binaries und der Module

Der Webserver läuft nun also. Aber vielleicht möchten wir ihn noch etwas genauer ansehen und mit den Fingern über die Karosserie streichen. Informationen zu unserem Binary erhalten wir wie folgt:

$> ./bin/httpd -V
Server version: Apache/2.2.21 (Unix)
Server built:   Oct 21 2010 08:20:43
Server's Module Magic Number: 20051115:25
Server loaded:  APR 1.4.2, APR-Util 1.3.10
Compiled using: APR 1.4.2, APR-Util 1.3.10
Architecture:   32-bit
Server MPM:     Worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/worker"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/opt/apache-2.2.21"
 -D SUEXEC_BIN="/opt/apache-2.2.21/bin/suexec"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

Da wird die Version angegeben, wann wir kompiliert haben, das APR kommt wieder zur Sprache und weiter unten das MPM. Ganz unten finden wir übrigens den Hinweis auf das Standard-Konfigurationsfile des Webservers und etwas darüber den Pfad, unter dem wir das Errorlog finden können.

Man kann aber noch etwas mehr aus dem System rausholen und ihn etwa nach den Modulen fragen, welche fix in den Server hineinkompiliert sind:

$> ./bin/httpd -l
Compiled in modules:
  core.c
  worker.c
  http_core.c
  mod_so.c

Diese und die obenstehenden Informationen helfen bei der Fehlersuche und wenn man einen Bugreport einsenden will. Dies sind typischerweise auch die ersten Fragen, welche gestellt werden.

Das Binary selbst (/apache/bin/httpd) ist übrigens ungefähr 1.2MB gross und die Liste der Module sieht folgendermassen aus:

$> ls -lh modules
total 2.5M
-rw-r--r-- 1 myuser src  8.9K 2010-10-21 16:47 httpd.exp
-rwxr-xr-x 1 myuser root  28K 2010-10-21 16:53 mod_actions.so
-rwxr-xr-x 1 myuser root  38K 2010-10-21 16:53 mod_alias.so
-rwxr-xr-x 1 myuser root  23K 2010-10-21 16:53 mod_asis.so
-rwxr-xr-x 1 myuser root  29K 2010-10-21 16:52 mod_auth_basic.so
-rwxr-xr-x 1 myuser root  62K 2010-10-21 16:52 mod_auth_digest.so
-rwxr-xr-x 1 myuser root  24K 2010-10-21 16:52 mod_authn_anon.so
-rwxr-xr-x 1 myuser root  28K 2010-10-21 16:52 mod_authn_dbd.so
-rwxr-xr-x 1 myuser root  24K 2010-10-21 16:52 mod_authn_dbm.so
-rwxr-xr-x 1 myuser root  22K 2010-10-21 16:52 mod_authn_default.so
-rwxr-xr-x 1 myuser root  25K 2010-10-21 16:52 mod_authn_file.so
-rwxr-xr-x 1 myuser root  29K 2010-10-21 16:52 mod_authz_dbm.so
-rwxr-xr-x 1 myuser root  22K 2010-10-21 16:52 mod_authz_default.so
-rwxr-xr-x 1 myuser root  30K 2010-10-21 16:52 mod_authz_groupfile.so
-rwxr-xr-x 1 myuser root  30K 2010-10-21 16:52 mod_authz_host.so
-rwxr-xr-x 1 myuser root  27K 2010-10-21 16:52 mod_authz_owner.so
-rwxr-xr-x 1 myuser root  23K 2010-10-21 16:52 mod_authz_user.so
-rwxr-xr-x 1 myuser root  73K 2010-10-21 16:53 mod_autoindex.so
-rwxr-xr-x 1 myuser root  29K 2010-10-21 16:52 mod_cern_meta.so
-rwxr-xr-x 1 myuser root  73K 2010-10-21 16:53 mod_cgid.so
-rwxr-xr-x 1 myuser root 152K 2010-10-21 16:53 mod_dav_fs.so
-rwxr-xr-x 1 myuser root 280K 2010-10-21 16:53 mod_dav.so
-rwxr-xr-x 1 myuser root  48K 2010-10-21 16:52 mod_dbd.so
-rwxr-xr-x 1 myuser root  53K 2010-10-21 16:52 mod_deflate.so
-rwxr-xr-x 1 myuser root  29K 2010-10-21 16:53 mod_dir.so
-rwxr-xr-x 1 myuser root  29K 2010-10-21 16:52 mod_dumpio.so
-rwxr-xr-x 1 myuser root  24K 2010-10-21 16:52 mod_env.so
-rwxr-xr-x 1 myuser root  31K 2010-10-21 16:52 mod_expires.so
-rwxr-xr-x 1 myuser root  49K 2010-10-21 16:52 mod_ext_filter.so
-rwxr-xr-x 1 myuser root  40K 2010-10-21 16:52 mod_filter.so
-rwxr-xr-x 1 myuser root  44K 2010-10-21 16:52 mod_headers.so
-rwxr-xr-x 1 myuser root  30K 2010-10-21 16:52 mod_ident.so
-rwxr-xr-x 1 myuser root  39K 2010-10-21 16:53 mod_imagemap.so
-rwxr-xr-x 1 myuser root  95K 2010-10-21 16:52 mod_include.so
-rwxr-xr-x 1 myuser root  43K 2010-10-21 16:53 mod_info.so
-rwxr-xr-x 1 myuser root  64K 2010-10-21 16:52 mod_log_config.so
-rwxr-xr-x 1 myuser root  31K 2010-10-21 16:52 mod_log_forensic.so
-rwxr-xr-x 1 myuser root  25K 2010-10-21 16:52 mod_logio.so
-rwxr-xr-x 1 myuser root  59K 2010-10-21 16:52 mod_mime_magic.so
-rwxr-xr-x 1 myuser root  44K 2010-10-21 16:53 mod_mime.so
-rwxr-xr-x 1 myuser root  76K 2010-10-21 16:53 mod_negotiation.so
-rwxr-xr-x 1 myuser root  38K 2010-10-21 16:52 mod_reqtimeout.so
-rwxr-xr-x 1 myuser root 129K 2010-10-21 16:53 mod_rewrite.so
-rwxr-xr-x 1 myuser root  32K 2010-10-21 16:52 mod_setenvif.so
-rwxr-xr-x 1 myuser root  30K 2010-10-21 16:53 mod_speling.so
-rwxr-xr-x 1 myuser root  52K 2010-10-21 16:53 mod_status.so
-rwxr-xr-x 1 myuser root  33K 2010-10-21 16:52 mod_substitute.so
-rwxr-xr-x 1 myuser root  29K 2010-10-21 16:52 mod_unique_id.so
-rwxr-xr-x 1 myuser root  29K 2010-10-21 16:53 mod_userdir.so
-rwxr-xr-x 1 myuser root  32K 2010-10-21 16:52 mod_usertrack.so
-rwxr-xr-x 1 myuser root  22K 2010-10-21 16:53 mod_version.so
-rwxr-xr-x 1 myuser root  31K 2010-10-21 16:53 mod_vhost_alias.so

Das sind nun alle Module, welche von Apache zusammen mit dem Server verteilt werden. Weitere Module gibt es von Drittanbietern. Alle brauchen wir kaum, aber einige will man fast immer dabei haben: Sie sind nun schon vorkonfiguriert.

Verweise

Changelog

  • 13. April 2013: Link to http://httpd.apache.org/docs/trunk/programs/configure.html
  • 12. Oktober 2011: Version von 2.2.17 auf 2.2.21 erhöht
  • 27. Februar 2011: Erklärung zu FHS
  • 25. Februar 2011: "cd" Kommando bei Schritt 1 gestrichen (Wiederholung in Schritt 2), Rechtschreibfehler korrigiert
  • 7. Februar 2011: Rechtschreibfehler korrigiert
  • 1. Januar 2011: Rechtschreibfehler korrigiert
  • 6. November 2010: Ownership des Softlinks /apache angepasst
  • 21. Oktober 2010: Überarbeitet
  • 20. Oktober 2010: Erstellt