HHVM als PHP-Interpreter für NginX

Wir haben im letzten Kapitel den Webserver NginX installiert. Mit Bordmitteln kann der Webserver aber ’nur‘ statische Seiten ausliefern. PHP kann er nicht interpretieren.
Auf PHP basieren aber eine Menge populärer Projekte. Also brauchen wir einen Interpreter für PHP – den Hypertext Preprocessor…

PHP bekommt man normalerweise über die Linux Distribution. Aktuell ist im Augenblick v5.6. Die Version 6 wird übersprungen und Version 7 ist in den Startlöchern. Sie soll einen Neuanfang des PHP-Projekts markieren. Schneller, besser, sicherer und ohne alten Ballast.

Es wird naturgemäß eine Weile dauern, bis v7.0 in den Distributionen Einzug hält. Und ältere PHP-Versionen werden dort teilweise sehr schlecht gepflegt. Auf meinen älteren Ubuntu-Servern (12.04 LTS) ist noch v5.3 im System. Und es wird nicht geupdated. Möchte man eine neue Version, muss man die selber mit der heißen Nadel reinstricken. Was bei meinem letzten Versuch kläglich scheiterte…
Sehr problematisch ist dabei, dass die ersten WEB-Projekte den Support für die v5.3 einstellen. So kann es durchaus einmal passieren, dass wir eines Morgens aufwachen und WordPress nach einem Update nicht mehr läuft. Und das wäre nicht nur ärgerlich, sondern eine Katastrophe.

Außerdem sind die gängigen PHP-Versionen alle ziemlich langsam, wenn man sich nicht diverser Tricks und Kniffe bedient.

Die HipHop Virtual Machine

Ende 2011 wurde ein Projekt aus der Taufe gehoben, welches die Unzulänglichkeiten von PHP durch eine andere Architektur zu kompensieren versuchte. Die Geburtsstunde der HHVM.

Großen Anteil an der Entwicklung hatte Facebook, da die Plattform von einer schnellen PHP-Ausführung natürlich enorm profitiert. Man wollte eine auf Leistung optimierte PHP-Schnittstelle bauen, um die Last der FB-Server zu reduzieren. Und so, wie es aussieht, ist den Jungs das auch gelungen.

Vier Jahre sind eine sehr kurze Zeit für eine Web-Technologie, um sie schon ‚produktiv‘ einzusetzen. Aber bei allen meinen Tests hatte ich mit den neueren Versionen der HHVM keine Probleme, keinen Absturz, Hänger oder Aussetzer. Darum möchte ab jetzt von nativem ‚PHP‘ auf die HHVM umsteigen.

Außerdem hege ich die Hoffnung, dass HHVM konstant weiterentwickelt wird und auch noch nach Jahren kontinuierlich Updates dafür herauskommen. Auf diese Weise würde auf unserem Server immer eine aktuelle PHP-Version laufen. Und wir müssten nicht – wie bei Ubuntu – nach nur drei Jahren mit einer völlig veralteten Version allein gelassen im Regen stehen…
Nun, „Fingers Crossed“ :)

Update 15.11.2015
Auf einer der Debian Test-Maschinen kam passend dazu gerade diese ‚wunderschöne‘ End-of-Life Meldung für PHP 5.4:
php-end-of-life-meldung

Hier wird uns nonchalant erklärt, dass PHP 5.4 keine Updates mehr erfahren wird. Sicherheitslöcher werden nur noch gestopft, wenn sie kraterartige Ausmaße eines Meteoriteneinschlags aufweisen. Man möge doch bitte die Distribution upgraden. Also von Debian 7 auf Debian 8 wechseln. Na vielen Dank auch! Ganz bestimmt…
/Update

Mehr zum Projekt findest Du auf der Homepage unter http://hhvm.com/
Aktuelle Nachrichten postet das Team auf ihr Blog: http://hhvm.com/blog

Vorbereitungen

„Natürlich“ ist die HHVM nicht in Debian 7 zu finden. Und die ersten Versuche, vor zwei Jahren, die HHVM selbst zu kompilieren… Nun, Schwamm d’rüber :)
Aber das HHVM-Team war nicht untätig und Du bekommst mittlerweile für fast jedes *NIX/NUX ein vorkompiliertes Paket. Danke schön!

Die Instruktionen für Debian 7 findest Du auf folgender Seite:
https://github.com/facebook/hhvm/wiki/Prebuilt-Packages-on-Debian-7

Legen wir los!

Repositories hinzufügen
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449

echo deb http://dl.hhvm.com/debian wheezy main | tee /etc/apt/sources.list.d/hhvm.list

HHVM installieren

apt-get update && apt-get install hhvm

[* * * * Bildschirmausgabe * * * *]

Die folgenden zusätzlichen Pakete werden installiert:
fontconfig-config fonts-droid ghostscript gsfonts imagemagick-common libavahi-client3 libc-client2007e libcups2 libcupsimage2 libelf1 libevent-2.0-5 libfontconfig1 libgd2-xpm libgmp10 libgs9 libgs9-common libice6 libicu48 libijs-0.35 libjasper1 libjbig0 libjbig2dec0 liblcms2-2 liblqr-1-0 libltdl7 libmagickcore5 libmagickwand5 libmcrypt4 libmemcached10 libmemcachedutil2 libonig2 libpaper-utils libpaper1 libsm6 libtbb2 libtiff4 libunwind7 libvpx1 libxpm4 libxt6 libyaml-0-2 mlock poppler-data ttf-dejavu-core x11-common
Vorgeschlagene Pakete:
ghostscript-cups ghostscript-x hpijs uw-mailutils cups-common libgd-tools libjasper-runtime liblcms2-utils libmagickcore5-extra libmcrypt-dev mcrypt poppler-utils fonts-japanese-mincho
fonts-ipafont-mincho fonts-japanese-gothic fonts-ipafont-gothic fonts-arphic-ukai fonts-arphic-uming fonts-unfonts-core
Die folgenden Pakete werden ENTFERNT:
libgd2-noxpm
Die folgenden NEUEN Pakete werden installiert:
fontconfig-config fonts-droid ghostscript gsfonts hhvm imagemagick-common libavahi-client3 libc-client2007e libcups2 libcupsimage2 libelf1 libevent-2.0-5 libfontconfig1 libgd2-xpm libgmp10 libgs9 libgs9-common libice6 libicu48 libijs-0.35 libjasper1 libjbig0 libjbig2dec0 liblcms2-2 liblqr-1-0 libltdl7 libmagickcore5 libmagickwand5 libmcrypt4 libmemcached10 libmemcachedutil2 libonig2 libpaper-utils libpaper1 libsm6 libtbb2 libtiff4 libunwind7 libvpx1 libxpm4 libxt6 libyaml-0-2 mlock poppler-data ttf-dejavu-core x11-common
0 aktualisiert, 46 neu installiert, 1 zu entfernen und 1 nicht aktualisiert.
Es müssen 54,6 MB an Archiven heruntergeladen werden.
Nach dieser Operation werden 84,5 MB Plattenplatz zusätzlich benutzt.

[* * * * Bildschirmausgabe ENDE * * * *]

55 MB laden, 85 MB auf der Platte… Ganz schön groß mit allen Bibliotheken!
Wenn die Installation der Pakete erfolgreich beendet wurde, sehen wir folgenden Text:

[* * * * Bildschirmausgabe * * * *]

********************************************************************
* HHVM is installed.
*
* Running PHP web scripts with HHVM is done by having your
* webserver talk to HHVM over FastCGI. Install nginx or Apache,
* and then:
* $ sudo /usr/share/hhvm/install_fastcgi.sh
* $ sudo /etc/init.d/hhvm restart
* (if using nginx) $ sudo /etc/init.d/nginx restart
* (if using apache) $ sudo /etc/init.d/apache restart
*
* Detailed FastCGI directions are online at:
* https://github.com/facebook/hhvm/wiki/FastCGI
*
* If you’re using HHVM to run web scripts, you probably want it
* to start at boot:
* $ sudo update-rc.d hhvm defaults
*
* Running command-line scripts with HHVM requires no special setup:
* $ hhvm whatever.php
*
* You can use HHVM for /usr/bin/php even if you have php-cli
* installed:
* $ sudo /usr/bin/update-alternatives \
* –install /usr/bin/php php /usr/bin/hhvm 60
********************************************************************

[* * * * Bildschirmausgabe ENDE * * * *]

Und diese Anweisungen setzen wir jetzt um…

HHVM einrichten

/usr/share/hhvm/install_fastcgi.sh

/usr/bin/update-alternatives --install /usr/bin/php php /usr/bin/hhvm 60

update-rc.d hhvm defaults

service hhvm restart && service nginx restart

Gut, das war’s!
Die HHVM sollte jetzt installiert und eingerichtet sein. Schauen wir mal nach…

php -v
HipHop VM 3.9.1 (rel)
Compiler: tags/HHVM-3.9.1-0-g0f72cfc2f0a01fdfeb72fbcfeb247b72998a66db
Repo schema: 6416960c150a4a4726fda74b659105ded8819d9c

Sehr schön, HHVM läuft :)

Seit ich an den Tutorials arbeite, sind wir von Version 3.7 über 3.8 auf nunmehr 3.9 aufgestiegen. Das Projekt wird wohl sehr aktiv nach vorne getrieben…
Jedes Update verlief ohne Probleme und die Webseiten sind auch ohne Schwierigkeiten oder weiteren Anpassungen einfach weitergelaufen. Genau so, wie man es sich vorstellt!

Update 14.10.2015:
HHVM macht den Port 9000 nicht nur lokal, sondern über das Internet erreichbar auf. Unsere Firewall lässt darauf zwar nichts kommen, aber schön ist es trotzdem nicht. Das ändern wir mal schnell:

Anpassen der HHVM server.ini
hhvm-server-ini-vorherhhvm-server-ini-nachher

nano /etc/hhvm/server.ini
### Unterhalb von der „Port“-Anweisung bitte diese zwei Zeilen einfügen:
hhvm.server.host = localhost
hhvm.server.ip = 127.0.0.1

Speichern und beenden.
Nun starten wir die HHVM neu
service hhvm restart

Sehen wir mal nach, was die Verbindung macht…
netstat -pnat
netstat-nach-hhvm-server-localhost

Nun haben wir nicht mehr 0.0.0.0:9000, sondern 127.0.0.1:9000 in der hhvm-Zeile. Unsere Maschine lauscht also nur noch ‚lokal‘ – Ziel erreicht!
/Update

Update 29.10.2015:
Wir sollten noch eine Hand voll Parameter festlegen, da die Standard-Werte mitunter zu kurz gefasst sind.
Dazu bearbeiten wir die Datei „php.ini“ im hhvm-Config-Verzeichnis…

nano /etc/hhvm/php.ini
### Den Block „Basic Settings“ einfach unten per Copy/Paste anfügen. Der Strichpunkt kommentiert die Zeile aus.

; Basic Settings
max_execution_time = 300
max_input_time = 60
memory_limit = 128M
post_max_size = 12M
upload_max_filesize = 12M

Speichern und beenden.
Nun starten wir die HHVM neu
service hhvm restart

Dadurch sollten spätere Scripts und Seiten fehlerfreier laufen. Gerade Piwik mit einer großen Datenbank ’sprengt‘ manchmal die Ausführungszeiten…
/Update

Update 29.10.2015:
Dieser „Bug“ hat mich ein paar Tage beschäftigt. Wie so oft ist es nur eine winzige Kleinigkeit…

Bei der Ausführung eines PHP-Scripts ist bei mir immer folgende Fehlermeldung aufgetaucht:
Failed to initialize central HHBC repository:
Failed to initialize schema in /var/www/.hhvm.hhbc:

Zum Zähne ausbeißen!

Probier mal einen
ls -la /var

und schau Dir das „www“ Verzeichnis an:
drwxr-xr-x 6 root root 4096 Okt 29 15:47 www

Bingo :/ „Gehört“ dem root-Benutzer. Und die HHVM kann hier nicht schreiben.

Lösung:
chown www-data:www-data /var/www

Check:
ls -la /var

Jetzt sollte da stehen
drwxr-xr-x 6 www-data www-data 4096 Okt 29 15:47 www

Und wie durch ein Wunder laufen nun alle Scripts :)
/Update

Bei der Installation der HHVM wird im NginX-Konfig-Verzeichnis eine neue Conf-Datei angelegt. Sinnigerweise heißt sie hhvm.conf. Sehen wir sie uns einmal an:

cat /etc/nginx/hhvm.conf
location ~ \.(hh|php)$ {
fastcgi_keep_conn on;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

Dieses Modul kümmert sich dann um die Initialisierung und Kommunikation zwischen NginX und der HHVM. Fügen wir dieses Modul in eine vHOST-Conf-Datei ein, wird dadurch die PHP-Funktionalität aktiviert.

Einfach – Genial

Aber grau ist alle Theorie…
Im dritten Kapitel fügen wir alles zusammen. Am Beispiel von „Adminer“ konfigurieren wir den NginX mit SSL, Passwortschutz und PHP-Unterstützung. Puh!

Haftungsausschluss!

Bitte lies Dir den Disclaimer durch, bevor Du eine Anleitung umsetzt...

Anzeige *

2 Kommentare zu “HHVM als PHP-Interpreter für NginX”

  1. wäre es nicht besser, den HHVM über einen Socket anstatt über eine TCP-Verbindung laufen zu lassen?

    In dem Fall sollte in der „server.ini“ , statt der Port-Aweisung „hhvm.server.port = 9000“ besser „hhvm.server.file_socket=/var/run/hhvm/hhvm.sock“ stehen
    man könnte sich in diesem Fall auch das Zufügen der Localhost-Bindung sparen, da ja dann HHVM als Socket auf dem Server läuft und weniger Ressourcen beansprucht

    Zusätzlich muß man dann aber auch bei der Socket-Variante, in die „hhvm.conf“ im nginx-Verzeichnis diese Anweisung mit einbinden. „fastcgi_pass unix:/var/run/hhvm/hhvm.sock;“

    Beste Grüße

Kommentar verfassen

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