nginx mit HHVM und PHP-FPM im Parallelbetrieb

Achtung! Dieser Artikel ist älter als ein Jahr. Der Inhalt ist möglicherweise nicht mehr aktuell!

 

Parallel zum Upgrade von Debian 7 auf Debian 8 habe ich meinen Apache Webserver durch nginx ausgetauscht. Der Grund: Ich hätte alle meine Konfigurationsdateien komplett neu entwickeln müssen (von Apache 2.2 auf Apache 2.4). Deshalb wollte ich den neuen Super-Webserver nginx ausprobieren.

Da ich schon Arbeiten an meiner Web-Struktur angefangen habe, wollte ich komplett aufräumen und meine PHP Umgebung sauber an nginx anbinden. Vorher hatte ich eine SuExec Umgebung mit FCGI-Wrapper-Script im Einsatz.

Letztens habe ich etwas über die Facebook Hip Hop Virtual Machine gelesen – ein PHP Ersatz mit besserer Performance. Da ich sowieso am neu aufsetzen der kompletten Logik war, wollte ich dieses Wunderding mal ausprobieren. Schnell stellte sich aber heraus, dass nicht alles mit der HHVM abbildbar ist, zum Beispiel die GnuPG Anbindung, die ich für meinen Proxychecker brauche. Also brauche ich ebenfalls eine native PHP Lösung. Und sowas strukturiert man am besten mit PHP-FPM.

Schön ist, dass beide Backends ein FastCGI Interface bieten und unabhängig voneinander installiert und betrieben werden können. Jeder nginx Server/(vHost) soll dann selbst entscheiden können, welches PHP Backend verwendet werden soll.

Das ganze soll so aussehen:

hhvm_php-fpm

Optional: Deinstallation apache2

Nach dem Upgrade von Debian habe ich den Apache Webserver deinstalliert und den Konfigurationsordner verschoben, damit ein Script (das später läuft) nicht irritiert wird:

:~$ apt-get remove apache2*
:~$ mv /etc/apache2 /etc/apache2-backup

Installation und Konfiguration nginx

Installation des Webservers

nginx ist bei Debian 8.1 bereits in den Standardrepositories enthalten und kann somit via Paketmanager installiert werden:

:~$ apt-get install nginx

Damit ist die Basis schon mal gelegt.

Optional: Benutzer wechseln

Der Webserver läuft standardmäßig unter dem User www-data. Aufgrund meiner Altlast habe ich aber alles unter dem Unix Benutzer veloc1ty laufen lassen. Damit nginx mit dem richtigen Benutzer arbeitet, habe ich in der Datei /etc/nginx/nginx.conf eine Änderung vorgenommen:

user www-data;

wurde zu

user veloc1ty;

Danach muss nginx neu gestartet werden.

Installation HHVM

Etwas komplizierter ist die Installation vom HHVM.

Hinzufügen der Repositories

Die HHVM binaries befinden sich nicht in den Standardrepositories. Deshalb muss man eins hinzufügen:

:~$ wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | apt-key add -
:~$ echo deb http://dl.hhvm.com/debian jessie main > /etc/apt/sources.list.d/hhvm.list
:~$ apt-get update

Installation

Nun kann HHVM via Paketmanager hinzugefügt werden:

:~$ apt-get install hhvm

Danach muss man noch die entsprechende FastCGI Konfigurationsdatei für nginx erstellen. Dafür biete HHVM ein Script:

:~$ bash /usr/share/hhvm/install_fastcgi.sh

Danach sollte sich im Ordner /etc/nginx eine Datei mit dem Namen hhvm.conf befinden.

Optional: Benutzer wechseln

HHVM läuft ebenfalls mit dem Benutzer www-data. Aus den selben Gründen wie bei nginx wechsle ich den Benutzer. In der Datei /etc/default/hhvm ändert man

# RUN_AS_USER=""
# RUN_AS_GROUP=""

zu

RUN_AS_USER="veloc1ty"
RUN_AS_GROUP="veloc1ty"

ab. Danach muss man noch im Filesystem Rechte ändern:

chown -R veloc1ty:veloc1ty /var/run/hhvm

Sobald man hhvm neu startet ist der zweite Teil auch schon geschafft.

Installation PHP-FPM

Installation

PHP-FPM ist in den Standardrepositories vorhanden und kann einfach via Paketmanager installiert werden:

:~$ apt-get install php5-fpm

Optional: Benutzer wechseln

Auch PHP-FPM läuft standardmäßig unter www-data. Deshalb muss ich auch hier den Standardbenutzer wechseln. Den Benutzer kann man in der Datei /etc/php5/fpm/pool.d/www.conf ändern:

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = veloc1ty
group = veloc1ty

Danach PHP-FPM neu starten.

Konfiguration des FastCGI Interfaces

Anders als bei HHVM lauscht PHP-FPM standardmäßig auf eine Unix-Socket. Das würde aber nicht auf das oben beschriebene Szenario passen. Damit PHP-FPM auf 127.0.0.1:9001 lauscht ändert man in der Datei /etc/php5/fpm/pool.d/www.conf folgende Optionen ab:

[...]

;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9001

[...]

; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
; must be separated by a comma. If this value is left blank, connections will be
; accepted from any ip address.
; Default Value: any
listen.allowed_clients = 127.0.0.1

Danach PHP-FPM neu starten.

nginx FastCGI Konfiguration

Damit nginx nun das FastCGI Interface von PHP-FPM ansprechen kann, braucht man noch die entsprechende Konfigurationsdatei. Dabei habe ich mich an der Datei erstellt, die HHVM erstellt hat mit angepassten Parametern.

Meine Datei unter /etc/nginx/php-fpm.conf sieht wie folgt aus:

location ~ \.(php)$ {
 fastcgi_keep_conn on;
 fastcgi_pass 127.0.0.1:9001;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params;
}

Geändert wurde der Port (von 9000 auf 90001) und dass keine Hack-Dateien (.hh) an PHP-FPM geschickt werden.

Erstellt man nun einen Server kann einfach via „include hhvm.conf;“ HHVM als PHP Backend bestimmt werden, oder mit „include php-fpm.conf;“ PHP-FPM. Beispiel:

server {
     [...]

     server_name blog.veloc1ty.de;
     include hhvm.conf;
     # include php-fpm.conf;

     [...]
}

Du hast einen Kommentar, einen Wunsch oder eine Verbeserung? Schreib mir doch eine E-Mail! Die Infos dazu stehen hier.

🖇️ = Link zu anderer Webseite
🔐 = Webseite nutzt HTTPS (verschlüsselter Transportweg)
Zurück