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.