Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
PHP-FPM<br />
Netzwerk<br />
Client<br />
startet<br />
(PHP-)Interpreter<br />
führt aus<br />
Client<br />
Webserver<br />
Webserver<br />
TCP-Port 9000<br />
Socket<br />
PHP-FPM<br />
Interpreter-Prozess<br />
...<br />
Interpreter-Prozess<br />
Skript<br />
Abbildung 1: Beim CGI-Standard startet der Webserver den Interpreter wie ein<br />
ganz normales Kommandozeilenprogramm.<br />
Abbildung 2: Der Webserver reicht entweder über einen TCP-Port oder einen<br />
Unix Socket die Anfrage an PHP-FPM weiter, der sie von einem PHP-Interpreter-<br />
Prozess abarbeiten lässt.<br />
zeit überschritten haben – inklusive der<br />
verursachenden PHP-Funktion. Das hilft<br />
nicht nur bei der Fehlersuche während<br />
der Entwicklung, sondern deckt auch<br />
Angriffe auf.<br />
Richtig gepoolt<br />
Die PHP-Interpreter-Prozesse lassen sich<br />
zu sogenannten Pools zusammenfassen.<br />
Jeder Pool kann dabei eine eigene PHP-<br />
Konfiguration besitzen <strong>und</strong> seine Prozesse<br />
sogar in eine Chroot-Umgebung<br />
einsperren. Darüber hinaus darf der<br />
Administrator festlegen, unter welchem<br />
Benutzerkonto die Prozesse eines Pools<br />
vor sich hinwerkeln. Eingehende Anfragen<br />
lassen sich dann gezielt an einen der<br />
Pools weiterreichen. Da<strong>mit</strong> könnte man<br />
beispielsweise einen maßgeschneiderten<br />
Pool für das Blog, einen weiteren für das<br />
Forum <strong>und</strong> einen dritten für die offizielle<br />
Website abstellen.<br />
Da jeder Pool die Anfragen auf einer eigenen<br />
TCP-Adresse entgegennimmt, kann<br />
man bei steigender Last der Forums-<br />
Website den zugehörigen Pool auf einen<br />
eigenen, leistungsfähigeren Rechner auslagern<br />
– dazu sind nur ein paar einfache<br />
Änderungen in den Konfigurationsdateien<br />
notwendig.<br />
PHP-FPM kommt sogar <strong>mit</strong> Zusatzmodulen<br />
wie eAccelerator oder APC zurecht,<br />
die den vom PHP-Interpreter kompilierten<br />
Quelltext (Opcodes) puffern. Dies<br />
spart bei der nächsten Anfrage eine erneute<br />
Übersetzung, was wiederum den<br />
Seitenaufbau beschleunigt. Ein Interpreter-Prozess<br />
kann den Opcode-Cache jedoch<br />
(versehentlich) überschreiben oder<br />
zerstören. PHP-FPM überwacht deshalb<br />
den Cache <strong>und</strong> startet sich bei Amok<br />
laufenden Prozessen automatisch einmal<br />
neu.<br />
Startrampe<br />
Seit PHP 5.4.0 gehört PHP-FPM zum offiziellen<br />
PHP-Paket <strong>und</strong> liegt da<strong>mit</strong> auch<br />
den meisten aktuellen Linux-Distributionen<br />
bei. Ein entsprechendes Paket findet<br />
man leicht über den Paketmanager,<br />
meistens heißt es »php5‐fpm«. Eine der<br />
wenigen Ausnahmen ist noch Debian 6<br />
(Squeeze). Dort kann man jedoch PHP-<br />
FPM über das Dotdeb-Repository hinzuholen,<br />
indem man in »/etc/apt/sources.<br />
list« die Zeile:<br />
deb http://packages.dotdeb.org stable all<br />
ergänzt. Das benötigte Paket installiert<br />
dann:<br />
apt‐get update<br />
apt‐get install php5‐fpm<br />
Da man die von den Pools verwendeten<br />
TCP-Ports frei vergeben kann, lässt sich<br />
PHP-FPM übrigens auch parallel zu anderen<br />
FastCGI-Interpretern betreiben.<br />
PHP-FPM ist im Moment auf Linux zugeschnitten,<br />
weshalb es im Windows-<br />
Paket von PHP fehlt. Die dort enthaltene<br />
»php‐cgi.exe« ist nur der herkömmliche<br />
FastCGI-Interpreter. Windows-<br />
Administratoren müssen daher entweder<br />
PHP-FPM umständlich in einer Cygwin-<br />
Umgebung per Hand übersetzen <strong>und</strong> in<br />
Betrieb nehmen oder aber PHP-FPM getrennt<br />
vom Webserver auf einem eigenen<br />
Linux-Rechner laufen lassen. Die letztere<br />
Variante ist dabei die weitaus einfachere,<br />
zumal man das Linux-System <strong>mit</strong> PHP-<br />
FPM auch in eine virtuelle Maschine<br />
verbannen kann. Im Folgenden soll daher<br />
weiterhin die Inbetriebnahme unter<br />
Linux im Vordergr<strong>und</strong> stehen.<br />
Sämtliche Konfigurationsdateien für PHP-<br />
FPM <strong>und</strong> seine PHP-Interpreter-Prozesse<br />
sammelt das Verzeichnis »/etc/php5/<br />
fpm« (vorausgesetzt ,die eigene Distribution<br />
gibt nicht andere Verzeichnisse vor).<br />
Die Einrichtung von PHP-FPM geschieht<br />
in der Konfigurationsdatei »php‐fpm.<br />
CGI-Beschleuniger<br />
Webserver sind eigentlich von Haus aus recht<br />
dumme Gesellen. Sie können lediglich Dateien<br />
<strong>und</strong> so<strong>mit</strong> statische Seiten ausliefern. Um eine<br />
Webseite dynamisch zu erzeugen, braucht der<br />
Webserver Hilfe von einem weiteren Programm –<br />
wie etwa dem PHP-Interpreter. Dieser führt dann<br />
wiederum eines oder mehrere (PHP-)Skripte aus,<br />
die schließlich die Seite zusammenklöppeln. Wie<br />
der Webserver den Interpreter aufrufen <strong>und</strong> dieser<br />
die fertige Seite zurückgeben muss, regelt<br />
seit 1993 ein Standard namens Common Gateway<br />
Interface, kurz CGI. Sobald eine Anfrage<br />
beim Webserver eingeht, setzt dieser ein paar<br />
Umgebungsvariablen <strong>und</strong> startet dann den Interpreter.<br />
Der wiederum wertet die Umgebungsvariablen<br />
aus <strong>und</strong> gibt die erzeugte Webseite über<br />
die Standardausgabe an den Webserver zurück.<br />
Abbildung 1 veranschaulicht das Zusammenspiel<br />
noch einmal.<br />
Bei dieser Vorgehensweise startet der Webserver<br />
bei jeder Anfrage erneut den dicken Interpreter.<br />
Das frisst zum einen Rechenzeit <strong>und</strong><br />
zum anderen auch Hauptspeicher. Häufig dauert<br />
das Laden des Interpreters sogar länger als die<br />
Ausführung des eigentlichen Skriptes. Um die<br />
Antwortzeiten zu erhöhen <strong>und</strong> den Server zu<br />
entlasten, entstand Mitte der 90er-Jahre die<br />
FastCGI-Schnittstelle [1]. Dabei startet der Interpreter<br />
genau einmal <strong>und</strong> läuft dann im Hintergr<strong>und</strong><br />
ständig weiter.<br />
Der Webserver reicht dann die Anfragen über<br />
einen TCP-Port oder einen Unix Domain Socket<br />
an den Interpreter weiter.<br />
Da die Kommunikation über die bekannten Netzwerkstandards<br />
läuft, könnte der Interpreter sogar<br />
auf einem komplett anderen Rechner als<br />
der Webserver laufen. Die gesamte Umgebung<br />
lässt sich so wesentlich besser <strong>und</strong> einfacher<br />
skalieren.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 06-2012<br />
29