Nginx in Kombination mit PHP und der MySQL-Datenbank bzw. dem performanteren Form MariaDB ist ein gängiger Stack für Webseiten und Anwendungen. Im neuen PHP 7 hat sich gegenüber dem Vorgänger 5.6 einiges getan, was sich bereits anhand der Versionsnummer vermuten lässt. Es macht daher Sinn, 7 statt 5.x zu verwenden, sofern möglich. Leider bietet Ubuntu dies noch nicht in ihren Paketquellen an, sodass wir hierfür auf eine Drittanbieter-Quelle zurückgreifen müssen. Dazu greifen wir auf das Repository von Ondřej Surý zurück, der auch für die Wartung der PHP-Paketquellen unter Debian zuständig ist.
PHP 7 installieren
Beginnen wir mit dem etwas aufwändigeren Teil. Zunächst muss die Paketquelle hinzugefügt werden:
sudo add-apt-repository ppa:ondrej/php
Wichtig ist hierbei, dass der System-Zeichensatz auf UTF-8 gesetzt ist. Ansonsten schlägt das Hinzufügen möglicherweise fehl, da der Name des Autors Sonderzeichen enthält. Dies kann mit dem Befehl locale
geprüft werden:
daniel@server:~$ locale LANG=de_DE.UTF-8
In diesem Beispiel ist alles in Ordnung. Wird hier jedoch ein anderer Zeichensatz als UTF-8 ausgegeben, muss dieser zunächst geändert werden:
sudo locale-gen "de_DE.UTF-8" && sudo sudo dpkg-reconfigure locales
Wurde die Paketquelle erfolgreich hinzugefügt, ist wie üblich deren Aktualisierung notwendig:
sudo apt-get update
Nun können wir die nötigen Pakete installieren:
sudo apt-get install php7.0 php7.0-fpm php7.0-mysql
php7.0
bringt die Laufzeitumgebung für PHP 7 mit, also sozusagen der Kern. Um PHP-FPM für Nginx nutzen zu können, wird php7.0-fpm
benötigt. Um die MySQL-Erweiterung von PHP nutzen zu können, installieren wir schlussendlich noch php7.0-mysql
.
Hat alles funktioniert, sollte der Befehl php -v
uns die installierte Version zeigen, etwa:
daniel@server:~$ php -v PHP 7.0.10-2+deb.sury.org~xenial+1 (cli) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.10-2+deb.sury.org~xenial+1, Copyright (c) 1999-2016, by Zend Technologies
PHP-FPM konfigurieren
Zunächst bearbeiten wir die global von allen PHP-FPM Instanzen genutzte php.ini im Pfad /etc/php/7.0/fpm/php.ini
und fügen am besten an den Anfang folgende Zeile ein:
cgi.fix_pathinfo = 1
Standardmäßig nutzt PHP-FPM den Unix-Socket /run/php/php7.0-fpm.sock
. Es ist eine gute Idee, Unix-Sockets statt TCP zu nutzen, da diese etwas weniger Overhead verursachen. Allerdings fehlen noch die nötigen Berechtigungen, damit PHP-FPM den Socket erstellen kann. Werden die Berechtigungen nicht in der Konfiguration geändert, läuft der zugreifende Prozess mit den Rechten von www-root:
sudo chown www-data:www-data /run/php/php7.0-fpm.sock && sudo service php7.0-fpm restart
Nginx installieren und konfigurieren
Der Nginx Webserver kann direkt über die Paketquellen von Ubuntu mit folgendem Befehl installiert werden:
sudo apt-get install nginx
Die Standard-Seite entfernen wir am besten direkt und erstellen mit einem Texteditor (nano, vi, usw) eine neue:
cd /etc/nginx/sites-enabled rm default nano test-page
Als minimale Test-Konfiguration kann folgender vHost eingefügt werden:
server { listen 80; root /var/www/html; index index.php index.html; location ~ \.php$ { try_files $uri =404; include fastcgi.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } }
Die try_files
Zeile ist aus Sicherheitsgründen notwendig, insbesondere wenn Datei-Uploads von Außen erlaubt sein sollten. Um das ganze zu testen, erzeugen wir eine Index-Datei, welche die Php-Info ausgibt:
sudo bash -c 'echo "<?php phpinfo();" > /var/www/html/2.php'
Rufen wir nun unseren Testserver (z.B. 192.168.178.10) im Browser per HTTP auf, sollte uns die Php-Info begrüßen: