How To Configure Apache HTTP with MPM Event and PHP-FPM on FreeBSD 12.0
Der Autor hat den Open Internet/Free Speech Fund ausgewählt, um eine Spende im Rahmen des Write for DOnations-Programms zu erhalten.
Einführung
Der Apache HTTP-Webserver hat sich im Laufe der Jahre weiterentwickelt, um in verschiedenen Umgebungen zu funktionieren und unterschiedliche Anforderungen zu erfüllen. Ein wichtiges Problem, das der Apache HTTP, wie jeder andere Webserver auch, zu lösen hat, ist der Umgang mit verschiedenen Prozessen, um eine HTTP-Protokollanfrage zu bedienen. Dazu gehört das Öffnen eines Sockets, die Verarbeitung der Anfrage, das Offenhalten der Verbindung für einen bestimmten Zeitraum, die Verarbeitung neuer Ereignisse, die über diese Verbindung auftreten, und die Rückgabe des Inhalts, der von einem Programm in einer bestimmten Sprache (wie PHP, Perl oder Python) erzeugt wurde. Diese Aufgaben werden von einem Multi-Processing-Modul (MPM) ausgeführt und gesteuert.
Apache HTTP verfügt über drei verschiedene MPM:
- Pre-fork: Für jede eingehende Verbindung, die den Server erreicht, wird ein neuer Prozess erstellt. Jeder Prozess ist von den anderen isoliert, so dass kein Speicher zwischen ihnen geteilt wird, selbst wenn sie an einem bestimmten Punkt ihrer Ausführung identische Aufrufe ausführen. Dies ist eine sichere Methode, um Anwendungen auszuführen, die mit Bibliotheken verknüpft sind, die kein Threading unterstützen – in der Regel ältere Anwendungen oder Bibliotheken.
- Worker: Ein Elternprozess ist dafür verantwortlich, einen Pool von Kindprozessen zu starten, von denen einige auf neue eingehende Verbindungen warten und andere die angeforderten Inhalte bereitstellen. Jeder Prozess ist mit einem Thread versehen (ein einzelner Thread kann eine Verbindung bearbeiten), so dass ein Prozess mehrere Anfragen gleichzeitig bearbeiten kann. Diese Methode zur Behandlung von Verbindungen fördert eine bessere Ressourcennutzung bei gleichzeitiger Wahrung der Stabilität. Dies ist ein Ergebnis des Pools verfügbarer Prozesse, der oft freie verfügbare Threads bereithält, um neue Verbindungen sofort zu bedienen.
- Ereignis: Basierend auf Worker geht dieses MPM einen Schritt weiter, indem es optimiert, wie der übergeordnete Prozess Aufgaben an die untergeordneten Prozesse und die mit diesen verbundenen Threads verteilt. Eine Verbindung bleibt standardmäßig 5 Sekunden lang offen und wird geschlossen, wenn kein neues Ereignis eintritt; dies ist der Standardwert der keep-alive-Direktive, die den ihr zugeordneten Thread beibehält. Der Event MPM ermöglicht es dem Prozess, Threads so zu verwalten, dass einige Threads frei sind, um neue eingehende Verbindungen zu bearbeiten, während andere an die aktiven Verbindungen gebunden bleiben. Die Umverteilung von zugewiesenen Aufgaben auf Threads ermöglicht eine bessere Ressourcennutzung und Leistung.
Das MPM Event-Modul ist ein schnelles Multiprocessing-Modul, das auf dem Apache HTTP-Webserver verfügbar ist.
PHP-FPM ist der FastCGI-Prozessmanager für PHP. Das FastCGI-Protokoll basiert auf dem Common Gateway Interface (CGI), einem Protokoll, das sich zwischen Anwendungen und Webservern wie dem Apache HTTP befindet. Dies ermöglicht es Entwicklern, Anwendungen unabhängig vom Verhalten der Webserver zu schreiben. Die Programme führen ihre Prozesse unabhängig voneinander aus und übermitteln ihr Produkt über dieses Protokoll an den Webserver. Jede neue Verbindung, die von einer Anwendung verarbeitet werden muss, erzeugt einen neuen Prozess.
Durch die Kombination des MPM-Ereignisses in Apache HTTP mit dem PHP FastCGI Process Manager (PHP-FPM) kann eine Website schneller laden und mehr gleichzeitige Verbindungen verarbeiten, während weniger Ressourcen verbraucht werden.
In diesem Tutorial werden Sie die Leistung des FAMP-Stacks verbessern, indem Sie das Standard-Multiprocessing-Modul von Pre-Fork auf Event ändern und den PHP-FPM-Prozessmanager zur Verarbeitung von PHP-Code anstelle des klassischen mod_php
in Apache HTTP verwenden.
Voraussetzungen
Bevor Sie mit dieser Anleitung beginnen, benötigen Sie folgendes:
- Einen FreeBSD 12.0 Server, der gemäß dieser Anleitung eingerichtet wurde.
- Den FAMP-Stack, der gemäß dieser Anleitung auf Ihrem Server installiert wurde.
- Zugang zu einem Benutzer mit Root-Rechten (oder mit sudo), um Konfigurationsänderungen vornehmen zu können.
Schritt 1 – Ändern des Multi-Processing-Moduls
Sie beginnen mit der Suche nach der pre-fork-Anweisung in der Datei httpd.conf
. Dies ist die Hauptkonfigurationsdatei für Apache HTTP, in der Sie Module aktivieren und deaktivieren können. In dieser Datei können Sie Direktiven bearbeiten und festlegen, wie z. B. den Listening-Port, an dem Apache HTTP Inhalte bereitstellt, oder den Speicherort der anzuzeigenden Inhalte.
Um diese Änderungen vorzunehmen, verwenden Sie das Programm nl
, number line, mit dem Flag -ba
, um die Zeilen zu zählen und zu nummerieren, damit später nichts durcheinander gerät. In Kombination mit grep
zählt dieser Befehl zunächst alle Zeilen in der im Pfad angegebenen Datei und sucht dann nach der gesuchten Zeichenfolge.
Führen Sie den folgenden Befehl aus, damit das Programm nl
die Zeilen in httpd.conf
verarbeitet und nummeriert. Dann verarbeitet grep
die Ausgabe, indem es nach der angegebenen Zeichenkette 'mod_mpm_prefork'
sucht:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'
Als Ausgabe sehen Sie etwas Ähnliches wie:
Output 67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
Bearbeiten Sie nun Zeile 67 mit Ihrem Texteditor. In dieser Anleitung verwenden Sie vi
, den Standardeditor von FreeBSD:
- sudo vi +67 /usr/local/etc/apache24/httpd.conf
Fügen Sie ein #
-Symbol am Anfang der Zeile ein, damit diese Zeile auskommentiert wird, etwa so:
...# LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so...
Durch das Anhängen des #
-Symbols haben Sie das Pre-Fork MPM-Modul deaktiviert.
Nun finden Sie die Ereignisanweisung in der gleichen httpd.conf
Datei.
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event
Sie werden eine Ausgabe ähnlich der folgenden sehen:
Output...66 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...
Nun entfernen Sie das Symbol #
in Zeile 66, um das Event MPM zu aktivieren:
- sudo vi +66 /usr/local/etc/apache24/httpd.conf
Die Direktive lautet nun wie folgt:
...LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...
Nachdem Sie die Konfiguration vom MPM-Pre-Fork auf Event umgestellt haben, können Sie das mod_php73
-Paket, das den PHP-Prozessor mit Apache HTTP verbindet, entfernen, da es nicht mehr notwendig ist und stört, wenn es im System verbleibt:
- sudo pkg remove -y mod_php73
Stellen Sie sicher, dass die Konfiguration korrekt ist, indem Sie den folgenden Befehl zum Testen ausführen:
- sudo apachectl configtest
Wenn Sie Syntax OK
in Ihrer Ausgabe sehen, können Sie den Apache-HTTP-Server neu starten:
- sudo apachectl restart
Hinweis: Wenn andere HTTP-Verbindungen auf Ihrem Server laufen, wird ein sanfter Neustart anstelle eines regelmäßigen Neustarts empfohlen. Dadurch wird sichergestellt, dass Benutzer nicht verdrängt werden und ihre Verbindung verlieren:
- sudo apachectl graceful
Sie haben das MPM von Pre-Fork auf Event umgestellt und das mod_php73
-Modul Verbindung PHP zu Apache HTTP entfernt. Im nächsten Schritt werden Sie das Modul PHP-FPM installieren und Apache HTTP so konfigurieren, dass es schneller mit PHP kommunizieren kann.
Schritt 2 – Konfigurieren von Apache HTTP für die Verwendung des FastCGI-Prozessmanagers
FreeBSD hat mehrere unterstützte PHP-Versionen, die Sie über den Paketmanager installieren können. Unter FreeBSD werden verschiedene Binärdateien der verschiedenen verfügbaren Versionen kompiliert, anstatt nur eine zu verwenden, wie es die meisten GNU/Linux-Distributionen in ihren Standard-Repositories anbieten. Um der Best Practice zu folgen, verwenden Sie die unterstützte Version, die Sie auf der Seite PHP’s supported versions nachlesen können.
In diesem Schritt fügen Sie PHP-FPM als laufenden Dienst hinzu, der beim Booten gestartet wird. Außerdem konfigurieren Sie Apache HTTP für die Zusammenarbeit mit PHP, indem Sie eine spezielle Konfiguration für das Modul hinzufügen und einige weitere Module in httpd.conf
aktivieren.
Zunächst fügen Sie 'php_fpm_enable=YES'
an die Datei /etc/rc.conf
an, damit der PHP-FPM-Dienst starten kann. Dazu verwenden Sie den Befehl sysrc
:
- sudo sysrc php_fpm_enable="YES"
Nun fügen Sie das Modul php-fpm
in das Apache-Modulverzeichnis ein, damit es für die Verwendung durch Apache HTTP konfiguriert ist. Erstellen Sie dazu die folgende Datei:
- sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf
Fügen Sie Folgendes in 030_php-fpm.conf
ein:
<IfModule proxy_fcgi_module> <IfModule dir_module> DirectoryIndex index.php </IfModule> <FilesMatch "\.(php|phtml|inc)$"> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch></IfModule>
Dies besagt, dass, wenn das Modul 'proxy_fcgi'
sowie 'dir_module'
aktiviert ist, alle verarbeiteten Dateien, die mit den Erweiterungen in Klammern übereinstimmen, vom FastCGI-Prozessmanager, der auf dem lokalen Rechner läuft, über Port 9000
verarbeitet werden sollen – als ob der lokale Rechner ein Proxy-Server wäre. Dies ist der Punkt, an dem das PHP-FPM-Modul und Apache HTTP miteinander verbunden sind. Um dies zu erreichen, werden Sie in diesem Schritt weitere Module aktivieren.
Um das Proxy-Modul zu aktivieren, suchen Sie es zunächst in der Datei httpd.conf
:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so
Sie werden eine Ausgabe ähnlich der folgenden sehen:
Output...129 #LoadModule proxy_module libexec/apache24/mod_proxy.so...
Die Zeile wird auskommentiert, indem das Symbol #
entfernt wird:
- sudo vi +129 /usr/local/etc/apache24/httpd.conf
Die Zeile sieht nach der Bearbeitung wie folgt aus:
...LoadModule proxy_module libexec/apache24/mod_proxy.so...
Nun können Sie das FastCGI-Modul aktivieren. Suchen Sie das Modul mit folgendem Befehl:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so
Sie werden etwas ähnliches wie das Folgende sehen:
Output...133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...
Dekommentieren Sie nun die Zeile 133, wie Sie es bereits bei den anderen Modulen getan haben:
- sudo vi +133 /usr/local/etc/apache24/httpd.conf
Sie werden die Zeile wie folgt belassen:
...LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...
Nachdem dies erledigt ist, starten Sie den PHP-FPM-Dienst:
- sudo service php-fpm start
Und Sie starten Apache neu, damit er die letzten Konfigurationsänderungen lädt, die das PHP-Modul beinhalten:
- sudo apachectl restart
Sie haben das PHP-FPM-Modul installiert, Apache HTTP so konfiguriert, dass es funktioniert, die notwendigen Module aktiviert, damit das FastCGI-Protokoll funktioniert, und die entsprechenden Dienste gestartet.
Nun, da Apache das Event MPM Modul aktiviert hat und PHP-FPM vorhanden ist und läuft, ist es an der Zeit, zu überprüfen, ob alles wie vorgesehen funktioniert.
Schritt 3 – Überprüfen der Konfiguration
Um zu überprüfen, ob die Konfigurationsänderungen übernommen wurden, werden Sie einige Tests durchführen. Der erste prüft, welches Multi-Processing-Modul Apache HTTP verwendet. Mit dem zweiten wird überprüft, ob PHP den FPM-Manager verwendet.
Überprüfen Sie den Apache-HTTP-Server, indem Sie den folgenden Befehl ausführen:
- sudo apachectl -M | grep 'mpm'
Ihre Ausgabe wird wie folgt aussehen:
Outputmpm_event_module (shared)
Sie können das gleiche für das Proxy-Modul und FastCGI wiederholen:
- sudo apachectl -M | grep 'proxy'
Die Ausgabe lautet:
Outputproxy_module (shared)proxy_fcgi_module (shared)
Wenn Sie die gesamte Liste der Module sehen möchten, können Sie den zweiten Teil des Befehls nach -M
entfernen.
Es ist nun an der Zeit zu überprüfen, ob PHP den FastCGI Process Manager verwendet. Dazu schreiben Sie ein kleines PHP-Skript, das Ihnen alle Informationen zu PHP anzeigt.
Führen Sie den folgenden Befehl aus, um eine Datei mit folgendem Namen zu schreiben:
- sudo vi /usr/local/www/apache24/data/info.php
Fügen Sie den folgenden Inhalt in die Datei info.php ein:
<?php phpinfo(); ?>
Rufen Sie nun die URL Ihres Servers auf und fügen Sie info.php
am Ende wie folgt an: http://your_server_IP_address/info.php
.
Der Server-API-Eintrag wird FPM/FastCGI.
Vergessen Sie nicht, die Datei info.php
nach dieser Prüfung zu löschen, damit keine Informationen über den Server öffentlich bekannt werden.
- sudo rm /usr/local/www/apache24/data/info.php
Sie haben den Arbeitsstatus des MPM-Moduls, der Module, die FastCGI handhaben, und die Handhabung von PHP-Code überprüft.
Leave a Reply