Ubuntu 12.04 LTS – Update auf Apache 2.4 und PHP 5.5

Mit 14.04 ist die neueste LTS von Ubuntu nun schon wieder fast ein Jahr alt, bisher habe ich aber noch nicht die Zeit gefunden, ein Upgrade vorzunehmen. Das einzige was mich momentan an der 12.04 LTS stört ist, dass PHP in den offiziellen Paketen bei Version 5.3 stehen geblieben ist.

Die Lösung dieses Problems gibt es in Form eines PPA von Ondřej Surý. Allerdings bringt dieses Repository nicht nur das php5 Pakete mit, sondern auch apache2, welches zwangsläufig ein Update von Apache2.2 auf 2.4 nach sich ziehen.

Bevor ich groß herum experimentiere, suchte ich nach einer Anleitung, die den Upgrade-Prozess beschreibt. Ich arbeite nicht jeden Tag mit apt-get und dpkg. Diese hier schlägt vor, die apache2-Pakete vorher komplett zu entfernen (Backup von /etc/apache2 und /var/www vorher nicht vergessen!):

$ apt-get remove apache2
$ apt-get remove apache2*
$ apt-get purge apache2 apache2-utils apache2.2-bin apache2-common
$ apt-get autoremove

Warum hier remove und purge nacheinander aufgerufen wird, ist mir nicht ganz klar, ich habe es dennoch so ausgeführt. Anschließend löschte ich noch das Verzeichnis /etc/apach2.

Der nächste Schritt ist, das PPA zu registrieren und apache2 neu zu installieren:

$ add-apt-repository ppa:ondrej/php5
$ apt-get update
$ apt-get install apache2

(Hinweis: Ich habe hier noch kein apt-get upgrade aufgerufen, denn das hätte auch die php5 Pakete aktualisiert. Ich wollte zuerst Apache erfolgreich aktualisieren und mich später um PHP kümmern.)

Während des Installationsprozesses wurde mir klar, dass etwas beim entfernen schief gegangen sein muss, denn ich sollte für alle Konfigurationsdateien entscheiden, ob ich die alte Variante behalten will, oder die neue verwendet werden soll.

Am Ende der Installation kam dann, was kommen musste:

Enabling module mpm_event.
Enabling module authz_core.
Enabling module authz_host.
Enabling module authn_core.
Enabling module auth_basic.
Enabling module access_compat.
ERROR: Module authn_file does not exist!
dpkg: Fehler beim Bearbeiten von apache2 (--configure):
 Unterprozess installiertes post-installation-Skript gab den Fehlerwert 1 zurück
Trigger für libc-bin werden verarbeitet ...
ldconfig deferred processing now taking place
Fehler traten auf beim Bearbeiten von:
 apache2
E: Sub-process /usr/bin/dpkg returned an error code (1)

Leichte Panik machte sich breit. Apache ließ sich zwar starten und antwortete auf HTTP-Requests aber es fehlten einige elementare Module wie alias. Eine Suche nach der Fehlermeldung brachte nichts brauchbares zu Tage, nur die Vorschläge das Paket zu deinstallieren und neu zu installieren. Erst jetzt kam mir der Gedanke zu prüfen, welche Pakete denn überhaupt installiert sind:

$ dpkg --get-selections | grep apache
apache2						install
apache2-bin					install
apache2-data				install
apache2-utils				install
apache2.2-common			deinstalled
libapache2-mod-php5			install

Aha! apache2.2-common und libapache2-mod-php5 müssen noch drauf gewesen sein. Also noch mal alles runter, diesmal direkt über dpkg:

$ dpkg -P apache2
$ dpkg -P apache2-bin
$ dpkg -P apache2-data
$ dpkg -P apache2-utils
$ dpkg -P libapache2-mod-php5
$ dpkg -P apache2.2-common

apache2.2-common lies sich erst entfernen, nach dem alle anderen Pakete entfernt waren. Im Anschluss ließen sich apache2 und dann php5 problemlos installieren.

Zwischenfazit: Nicht einfach alle Shell-Befehle die man liest wortlos übernehmen, sondern kurz überlegen, was der Sinn dahinter ist.

Apache neu Konfigurieren

Beim ersten Start merkt Apache an, dass der ServerName nicht gesetzt ist. Ein kleiner Schönheitsfehler, der leicht zu korrigieren ist. In /etc/apache2/conf-available erstellt man eine Datei servername.conf und schreibt den Namen hinein:

ServerName "localhost"

Nun noch die Konfiguration aktivieren:

$ a2enconf servername

Das ist eine saubere Alternative zu »schreibs in die apache2.conf/httpd.conf«, da das bei Updates nicht Gefahr läuft, überschrieben zu werden.

Als nächstes reaktiviert man alle Module, die bisher verwendet wurden. Dazu ruft man für jeden Modulnamen im Backup von apache2/mods-enabled einmal a2enmod auf:

$ a2enmod alias
$ a2enmod rewrite
// ...

Fehlt noch die Konfiguration für die Virtual Hosts. Dazu kopiert man alle Dateien aus dem Backup von apache2/sites-available nach /etc/apache2/sites-available. In dem Zusammenhang muss man den Dateinamen um das Suffix .conf erweitern, wenn es das noch nicht hat. Ab drei Sites wird das mühsam von Hand zu machen, also automatisiert man es: (In diesem Beispiel liegen die Backups in ~/tmp/apache2/sites-available)

$ cd ~/tmp/apache2/sites-available
$ for i in *; do if [[ "$i" =~ \.conf$ ]]; then cp "$i" /etc/apache2/sites-available; else cp "$i" /etc/apache2/sites-available/"$i".conf; fi done

Zur Erläuterung: Für alle Dateien im aktuellen Verzeichnis wird geprüft, ob der Dateiname auf .conf endet. Falls dem so ist, wird die Datei in das Zielverzeichnis kopiert, andernfalls wird sie beim Kopieren gleich umbenannt.

Jetzt müssen die Sites nur noch aktiviert werden, wieder per Skript:

$ cd /etc/apache2/sites-available
$ for i in *; do a2ensite "${i/.conf}"; done 

Hier wird, wieder für alle Dateien, der Befehl a2ensite aufgerufen und der Dateiname (reduziert um den .conf-Suffix) als Parameter übergeben.

Schließlich noch einen Reload des Apaches durchführen.

$ service apache2 reload

Und freuen…

$ apache2 -v
Server version: Apache/2.4.12 (Ubuntu)
Server built:   Feb  4 2015 14:21:10
$ php -v
PHP 5.5.21-1+deb.sury.org~precise+2 (cli) (built: Jan 26 2015 20:02:42) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

Sudo?

Ich habe alle Befehle als »echter« Root ausgeführt, der unter Ubunut kein Standard ist. Normalerweise müssen die Befehle also mit dem sudo Präfix ausgeführt werden.

Kommentare

Es wurden noch keine Kommentarte zu diesem Artikel geschrieben.

Fragen, Ideen oder Kritik? – Hier ist Platz dafür!

Dein Kommentar

Um ein Kommentar abzugeben, reicht der Text im Kommentarfeld. Die Angabe eines Namens wäre nett, ist aber nicht erforderlich.

Du darfst folgenden HTML-Code verwenden, musst aber nicht:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>