RAID-Technologie verspricht höhere Performance und mehr Sicherheit beim permanenten Speichern von Daten. Die ADMIN-Redaktion gibt einen Überblick über ... (mehr)

Schwimmbadbau

Die PHP-Interpreter-Prozesse fasst PHP-FPM in Pools zusammen, wobei mindestens ein Pool existieren muss. Für jeden Pool liegt im Unterverzeichnis »/etc/php5/pool.d« genau eine Konfigurationsdatei mit der Endung ».conf« . Den voranstehenden Dateinamen darf man frei wählen, PHP-FPM liest einfach alle ».conf« -Dateien in diesem Verzeichnis nacheinander ein. Um einen Pool vorübergehend zu deaktivieren, muss man folglich nur die Endung der zugehörigen Konfigurationsdatei ändern.

Wurde PHP-FPM über den Paketmanager der Distribution installiert, existiert im Konfigurationsverzeichnis meist schon eine Datei für einen einfachen Pool, unter Debian beispielsweise mit dem Namen »www.conf« . Diese Datei sollte man nicht löschen, sondern sichern: Da in ihr ausführliche Kommentare alle möglichen Einstellungen erklären, dient sie als Nachschlagewerk. Die Informationen auf der PHP-FPM-Homepage [2] und in der PHP-Dokumentation [3] sind hingegen veraltet beziehungsweise unvollständig. Wer keine Beispiel-Datei vorfindet, lädt sich das offizielle PHP-Quellcode-Paket herunter und wirft dann einen Blick in die Datei »php-fpm.conf.in« im Verzeichnis »sapi/fpm« .

Ein Beispiel für eine minimale Konfigurationsdatei zeigt Listing 1: Zu Beginn erhält der Pool in eckigen Klammern den Namen »einpool« . Die darin zusammengefassten Interpreter-Prozesse bearbeiten dann alle Anfragen, die der Webserver über den TCP-Port 9000 an PHP-FPM übergibt. Die nächste Zeile »listen.allowed_clients« stellt sicher, dass am Port 9000 nur Programme anklopfen dürfen, die auf dem gleichen Rechner wie PHP-FPM laufen (»localhost« , IP-Adresse »127.0.0.1« ). Damit verhindert man, dass Angreifer von außen PHP-FPM mit Anfragen zubombardieren oder die PHP-Interpreter sogar für eigene Zwecke missbrauchen. Möchte man hier Anfragen von weiteren IP-Adressen zulassen, hängt man diese einfach durch ein Komma getrennt hintereinander.

Listing 1

Einfacher Pool namens einpool

 

Alle PHP-Interpreter-Prozesse aus dem Pool »einpool« laufen gemäß Listing 1 mit den Rechten des Benutzers »www-data« aus der Gruppe »www-data« – hier also der Einfachheit halber mit denen des Webservers. In einer produktiven Umgebung legt man sicherheitshalber für jeden Pool einen eigenen neuen Benutzer an.

Um keine Ressourcen zu verschwenden, soll PHP-FPM die Interpreter-Prozesse nach Bedarf (»dynamic« ) starten und beenden. Wie »pm.max_children« vorgibt, dürfen dabei in diesem Pool höchstens 96 PHP-Interpreter-Prozesse gleichzeitig laufen. Da jeder Interpreter-Prozess eine Anfrage abarbeitet, kann der Pool aus Listing 1 folglich 96 Anfragen gleichzeitig bedienen.

Wie viele Kind-Prozesse PHP-FPM direkt nach seinem Start aktiviert, legt »pm.start_servers« fest – in Listing 1 sind es 16 Stück. Es handelt sich hierbei wohlgemerkt um die Anzahl der Kind-Prozesse, zusammen mit dem vom Administrator gestarteten Ausgangs-Prozess laufen somit insgesamt 17 Prozesse. Däumchen drehende PHP-Interpreter-Prozesse darf es maximal 70 geben (»pm.max_spare_servers« ). Um für Anfragestürme gewappnet zu sein, lässt Listing 1 immer 10 Stück in Wartestellung laufen (»pm.min_spare_servers« ).

Eine für alle

Die von PHP-FPM gestarteten PHP-Interpreter-Prozesse übernehmen die Einstellungen aus der Datei »/etc/php5/fpm/php.ini« . Ihr Inhalt entspricht der allseits bekannten »php.ini« -Datei. Sie gilt jetzt allerdings für sämtliche Prozesse aus allen Pools. Erhöht man in ihr beispielsweise das »memory_limit« auf »64M« , darf anschließend jeder PHP-Interpreter-Prozess 64 MByte Hauptspeicher seinem PHP-Skript zur Verfügung stellen. Wenn nur der Pool aus Listing 1 existiert, könnten maximal 96 Prozesse gleichzeitig laufen, was im schlimmsten Fall 96 * 64 MByte = 6 GByte Hauptspeicher beanspruchen würde.

Sollen die Prozesse in einem bestimmten Pool abweichende Einstellungen nutzen, legt man diese in der Konfigurationsdatei des Pools (wie in Listing 1) ab, allerdings in einer etwas gewöhnungsbedürftigen Notation. So muss der Name der PHP-Einstellung zwischen den eckigen Klammern von »php_admin_value[]« stehen:

php_admin_value[memory_limit] = 32M

Diese Zeile setzt das »memory_limit« auf 32 MByte. Boolesche Werte (also Einstellungen, die etwas an- und ausschalten) lassen sich analog mit »php_admin_flag[]« überschreiben, hier ein Beispiel mit »log_errors« :

php_admin_flag[log_errors] = on

Nachdem die Konfiguration steht, startet der folgende Aufruf PHP-FPM:

/etc/init.d/php5-fpm start

Die Interpreter-Prozesse laufen jetzt im Hintergrund und warten dort auf Anfragen. Prüfen kann man das etwa mit »netstat -tapn« . In der Ausgabe sollte wie in Abbildung 3 PHP-FPM auftauchen. »ps -A« sollte zudem die angegebene Anzahl PHP-Interpreter-Prozesse mit dem Namen »php-fpm« anzeigen (Abbildung 4). Als Nächstes gilt es, den Webserver auf PHP-FPM aufmerksam zu machen.

Abbildung 3: PHP-FPM lauscht an TCP-Port 9000.
Abbildung 4: Wie in Listing 1 vorgegeben, laufen hier 17 PHP-Interpreter-Prozesse.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2020