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.

PHP-FPM auf Ubuntu einrichten: Internal Server Error

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:

  1. Lahm + Sicherheitslücke,
  2. Gute Idee, schlechte Ausführung und
  3. 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:

  1. http://blog.koenreiniers.nl/guide-to-combining-apache-virtual-hosts-and-php7-fpm/
  2. 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 via a2enmod actions suexec fastcgi proxy proxy_fcgi. Dafür könnte eine Installation von libapache2-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:

  1. vim /etc/apt/sources.list
  2. Man füge ein multiverse der Zeile hinzu, die das xenial enthält. (ggf. kann dies auch für die Zeile mit xenial-updates gemacht werden, um mehr Patches zu erhalten)
  3. 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…

Kommentar hinterlassen

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