Mehrere PHP-Versionen im Apache 2.4 unter Ubuntu 14.04

Ubuntu 14.04 kommt mit Apache 2.4.7 und PHP 5.5.9. Auf der Suche nach einer Möglichkeit, für einzelne VirtualHosts auf einem Hosting-System PHP 7.1 zur Verfügung stellen zu können bin ich auf diverse Anleitungen im Netz gestoßen und möchte hier die für mich am besten funktionierende Variante vorstellen.

Prinzipiell gibt es die Möglichkeit, über ein PPA die PHP-Version im Ubuntu 14.04 zu aktualisieren. Dann hat man allerdings nur noch die neuere PHP-Version, womit (besonders beim Sprung auf PHP 7) alte Websites nicht unbedingt klar kommen. Also bleibt nur die Alternative, PHP 7 selbst zu kompilieren.

Ich habe das tar.gz Archiv (Version 7.1.5) von php.net herunter geladen und auf den Server ins Verzeichnis /usr/local/src/php7 kopiert. Nach dem Entpacken hat man den Quellcode im Verzeichnis /usr/local/src/php7/php-7.1.5:

cd /usr/local/src/php7
tar xzf php-7.1.5.tar.gz
cd php-7.1.5

Der sicherlich komplexeste Schritt folgt nun, nämlich die Konfiguration von PHP. Hier müssen die Parameter an die Anforderungen angepasst werden. Es gibt eine ganze Menge an Optionen, die jeweils auch die passenden Quellen voraussetzen, die natürlich vorher installiert werden sollten. Man kann sich die Optionen mit folgendem Befehl ansehen:

./configure --help | less

Ich habe mit folgender Konfiguration gestartet:

apt-get install libxml2-dev libbz2-dev libcurl4-openssl-dev \
libjpeg-dev libpng-dev libfreetype6-dev libgmp3-dev \
libc-client-dev libicu-dev libsasl2-dev unixodbc-dev \
libpspell-dev libsnmp-dev libxslt-dev

./configure \
--with-libdir=lib64 \
--cache-file=../config.cache \
--prefix=/usr/local/php7-cgi \
--with-config-file-path=/usr/local/php7-cgi/etc \
--disable-debug --disable-rpath \
--with-pic --with-bz2 --with-curl \
--with-freetype-dir=/usr/local/php7-cgi \
--with-png-dir=/usr/local/php7-cgi \
--with-gd --enable-gd-native-ttf \
--with-gettext --with-gmp --with-iconv \
--with-jpeg-dir=/usr/local/php7-cgi \
--with-openssl --with-pspell --with-pcre-regex --with-zlib \
--enable-exif --enable-ftp --enable-sockets \
--enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-wddx \
--with-kerberos --with-unixODBC=/usr \
--enable-shmop --enable-calendar \
--with-libxml-dir=/usr/local/php7-cgi \
--enable-pcntl --enable-mbstring --enable-mbregex --enable-bcmath \
--with-xmlrpc --with-mysqli --with-snmp \
--enable-soap --with-xsl --enable-xmlreader --enable-xmlwriter \
--without-gdbm --enable-pdo --with-pdo-mysql \
--with-pear=/usr/local/php7-cgi/pear \
--without-sqlite3 --without-pdo-sqlite \
--with-config-file-scan-dir=/usr/local/php7-cgi/php.d \
--enable-intl --enable-cgi

Hier wird an mehreren Stellen ein Pfad festgelegt, damit sich das installierte PHP 7 nicht mit dem im System vorhandenen beißt. Ich habe mir /usr/local/php7-cgi als Pfad ausgesucht. Sofern man am Ende des configure-Laufs keine Fehler feststellen kann, sollte man mit folgenden Befehlen kompilieren, testen und installieren können:

make
make test
make install

Nach erfolgreicher Installation kopieren wir noch die PHP-Konfiguration vom PHP 5.5.9 als Startpunkt für PHP 7:

cd /usr/local/php7-cgi/etc
cp -p /etc/php5/apache2/php.ini .
cat /etc/php5/apache2/conf.d/05-opcache.ini >> php.ini

Jetzt muss nur noch in einem gewünschten VirtualHost im Apache auf die neue PHP-Version verwiesen werden. Dazu benötigen wir folgende Zeilen in der VirtualHost-Konfiguration:

ScriptAlias /php7-bin /usr/local/php7-cgi/bin
Action application/x-httpd-php7 /php7-bin/php-cgi

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php7
</FilesMatch>

<Directory "/usr/local/php7-cgi/bin">
    require all granted
</Directory>

Hier wird zunächst ein ScriptAlias definiert, auf welchen dann die Action Direktive verweist, sofern ein Dokument des Mime-Typs application/x-httpd-php7 verarbeitet wird. Der Mime-Typ wird mit SetHandler für alle Dateien gesetzt, deren Namen mit .php enden. Damit das PHP-Binary vom Apache auch ausgeführt werden kann, muss der Zugriff auf das Verzeichnis erlaubt sein. Das erledigt der letzte Block.

Fertig. Apache muss natürlich noch neu gestartet werden (apachectl graceful reicht). Ein Aufruf von phpinfo() sollte jetzt auf diesem VirtualHost die neue PHP-Version anzeigen.

Sollte es beim Apache-Neustart zu folgender Fehlermeldung kommen:

Invalid command 'Action', perhaps misspelled or defined by a module not included in the server configuration

so liegt dies daran, dass das Apache-Modul mod_actions fehlt. Es kann einfach mit folgendem Befehl aktiviert werden:

a2enmod actions
service apache2 restart

Anschließend sollte der Fehler nicht mehr auftreten.