PHP-FPM auf Ubuntu einrichten
Der Indianer spuckt vergiftete Pfeile…
Ein kleine Anekdote aus dem Alltag eines Web-Developers: Mit dem Start meines eigenen (fern-gehosteten) Servers war ich doch verrückt genug, Plesk zu deaktivieren und mir stattdessen den Virtualmin ins Haus einzuladen. Ich wollte privat einfach dasselbe System wie auf der Arbeit verwenden, um ggf. die Hilfe meiner Kollegen zu beziehen, sollte mal etwas nicht so laufen, wie gewünscht. Und jetzt habe ich den Salat…
Hier ein kleiner Guide, um PHP-FPM auf Ubuntu einrichten zu können.
PS: Den Titel der Überschrift habe ich von meinem Kollegen @niho geklaut. Passte einfach so schön! :)
Die 3 verschiedenen Ausführungs-Varianten von PHP
Namentlich sind das: mod_php
, CGI wrapper
und FCGId
. Oder wie ich sie ab jetzt gern nenne:
- Lahm + Sicherheitslücke,
- Gute Idee, schlechte Ausführung und
- Soll eigentlich FCGI sein, ist aber ein Modul für Apache2 und somit sehr verbuggt…
Was man eigentlich nutzen möchte wäre Fast-CGI (FCGI), aber das wird mit der „reinen“ Virtualmin/Apache Installation einfach nicht geliefert. Unter https://blog.layershift.com/which-php-mode-apache-vs-cgi-vs-fastcgi/ findet man eine ältere, aber noch sehr gute Erklärung zu den Varianten.
Egal mit welchen der mitgelieferten Varianten ich es getestet hatte: Nach ein paar Stunden war meine Seite wieder „down“ und man sah den üblichen „Internal Server Error“.
Die Lösung: PHP-FPM
Onkel Google hatte noch eine vierte Möglichkeit vorgeschlagen: Ein Zusatzpaket für PHP namens „FastCGI Process Manager“ – kurz FPM. Über einige andere Blogs, habe ich mir dann erst mal Zusatzwissen angeeignet:
- http://blog.koenreiniers.nl/guide-to-combining-apache-virtual-hosts-and-php7-fpm/
- http://symfony.com/doc/current/setup/web_server_configuration.html#web-server-apache-fpm
Da diese aber auch nicht die Komplettlösung für mein Problem lieferten, hier noch mal eine Checkliste. Alle Installationsschritte setzen einen Sudoer-Account voraus!
Voraussetzung für FPM sind eine aktuelle PHP Version (7.0.* oder höher) und Apache2 auf Version 2.4.* oder höher sowie einige zusätzliche Module. Für diese Checkliste arbeiten wir mit php7.2
:
- Neben den Standardpaketen „php7.2-common“ und „php7.2-cgi“ wird nun noch das Paket „php7.2-fpm“ benötigt. Unter Ubuntu:
apt-get install php7.2-fpm
. - Für den Apache2 benötigt man außerdem
suexec
,actions
,proxy
,proxy_fcgi
fastcgi
. Diese werden über die Modulverwaltung aktiviert viaa2enmod actions suexec fastcgi proxy proxy_fcgi
. Dafür könnte eine Installation vonlibapache2-mod-fastcgi
zuvor nötig werden.
Falls sich das Paket libapache2-mod-fastcgi
nicht installieren lässt, was auf Ubuntu 16.04 der Fall ist, muss man die sources.list
etwas erweitern:
vim /etc/apt/sources.list
- Man füge ein
multiverse
der Zeile hinzu, die dasxenial
enthält. (ggf. kann dies auch für die Zeile mitxenial-updates
gemacht werden, um mehr Patches zu erhalten) - Datei speichern und mit
apt-get update && apt-get install libapache2-mod-fastcgi
erneut versuchen.
PHP-FPM einrichten
Zuerst aktiviert man php-fpm als Service mit service php7.2-fpm start
und wechselt in den Konfigurationsordner von FPM: cd /etc/php/7.2/fpm/pool.d
.
Hier kann man sich beliebig viele Pools erstellen, die eine Art Zuordnung von Nutzer zu FPM darstellen und somit eine Konfiguration pro Nutzer oder Gruppe erlauben. Für die folgenden Befehle ist der Platzhalten „username“ mit dem gewünschten Linux Nutzer zu ersetzen.
Wir erstellen uns eine neue Konfiguration: vim username.conf
und geben ein:
[username] user = username group = username listen = /run/php/php7.2-fpm.username.sock listen.owner = username listen.group = username pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
Diese Datei erlaubt nun dem Nutzer „username“ den Zugriff auf den Dienst php7.2-fpm
und erstellt einen Socket unter /run/php/php7.2-fpm.username.sock
, dem wir unsere PHP-Dateien zum Kompilieren schicken können. Mit service php7.2-fpm reload
laden wir die neue Konfiguration.
Zuletzt muss der Handler noch im Apachen registriert werden. Dafür wechseln wir in die Apache2 Konfiguration cd /etc/apache2/sites-available
, öffnen die gewünschte .conf
Datei und fügen folgende Zeilen zu (jedem) <VirtualHost>
hinzu:
<FilesMatch \.php$> SetHandler proxy:unix:/var/run/php/php7.2-fpm.username.sock|fcgi://dummy </FilesMatch>
Damit werden alle PHP-Dateien an den FPM-Service gesendet, andere Dateien jedoch nicht, was einen effektiven für unsere Performance gibt! PHP-FPM sollte jetzt fertig eingerichtet sein. Um dies zu testen kann man mit dem allseitsbeliebten Befehl <?php phpinfo();
den Key „Server API“ suchen. Findet man dort den Wert „FPM/FastCGI“, lief alles glatt!
Verbesserungsmöglichkeiten
Apache2 deinstallieren und NGINX nutzen…