How To Configure Apache HTTP with MPM Event and PHP-FPM on Ubuntu 18.04

Der Autor hat den COVID-19 Relief 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 verschiedene Anforderungen zu erfüllen. Ein wichtiges Problem, das der Apache HTTP wie jeder Webserver lösen muss, ist die Handhabung verschiedener Prozesse, 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 hat einen Thread (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 der zugewiesenen Aufgaben auf die 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 zwischen Anwendungen und Webservern wie Apache HTTP steht. 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-Prozessmanager (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 LAMP-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 Ubuntu 18.04-Server, der gemäß der Anleitung für die anfängliche Servereinrichtung von Ubuntu 18.04 eingerichtet wurde, einschließlich eines sudo-Nicht-Root-Benutzers und einer Firewall.
  • Der LAMP-Stack, der auf Ihrem Server installiert ist, folgt der Anleitung zur Installation von Linux, Apache, MySQL, PHP (LAMP-Stack) auf Ubuntu 18.04.

Schritt 1 – Ändern des Multi-Processing-Moduls

Ubuntu erbt Skripte zum Aktivieren oder Deaktivieren von Apache-HTTP-Modulen von seiner Mutterdistribution, Debian. In diesem Schritt werden Sie dieses Toolset verwenden, um das Pre-fork-Modul zu deaktivieren und das Event-Modul zu aktivieren.

In diesem Schritt werden Sie Apache HTTP stoppen, das mit dem Pre-fork-Modul verknüpfte PHP 7.2-Modul deaktivieren und dann Pre-fork deaktivieren, um das Event-Modul sofort zu aktivieren.

Zuerst stoppen Sie den Apache-HTTP-Dienst:

  • sudo systemctl stop apache2

Jetzt können Sie das PHP 7.2-Modul deaktivieren, das mit dem Pre-fork-Modul verknüpft ist:

  • sudo a2dismod php7.2

Dann deaktivieren Sie das Pre-fork MPM-Modul:

  • sudo a2dismod mpm_prefork

Aktivieren Sie nun das Event MPM-Modul:

  • sudo a2enmod mpm_event

Sie haben das MPM von Pre-Fork auf Event umgestellt und die PHP 7.2-Modulverbindung zwischen PHP und Apache HTTP entfernt. Im nächsten Schritt installieren Sie das php-fpm-Modul sowie die zugehörigen Bibliotheken und Proxy-Module. Sie werden Apache HTTP so konfigurieren, dass es auch mit PHP kommunizieren kann.

Schritt 2 – Konfigurieren von Apache HTTP für die Verwendung des FastCGI Process Managers

In diesem Stadium haben Sie die Art und Weise, wie Apache HTTP Verbindungen verarbeitet, geändert, indem Sie vom Pre-fork MPM auf Event umgestellt haben. Dabei haben Sie jedoch das PHP-Modul deaktiviert, das den Apache HTTP mit jedem auf PHP laufenden Programm verbunden hat.

In diesem Schritt installieren Sie den PHP-FPM-Prozessor, damit der Apache HTTP wieder in der Lage ist, PHP-Programme zu verarbeiten. Außerdem installieren Sie die Abhängigkeitsbibliotheken und aktivieren die Module, damit beide reibungslos und schneller als zuvor zusammenarbeiten können.

Erst installieren Sie php-fpm. Der folgende Befehl installiert das PHP-FPM-Paket und aktiviert automatisch den in systemd integrierten php7.2-fpm-Dienst, so dass der Dienst beim Booten gestartet wird:

  • sudo apt install php-fpm

Um zu kommunizieren, benötigen Apache HTTP und PHP eine Bibliothek, die diese Fähigkeit ermöglicht. Sie werden nun libapache2-mod-fcgid installieren, die als Schnittstelle zwischen Programmen und Webservern dienen kann und speziell für Apache HTTP ist. Diese Kommunikation erfolgt über einen UNIX-Socket.

Installieren Sie diese Bibliothek:

  • sudo apt install libapache2-mod-fcgid

Sie haben php-fpm und libapache2-mod-fcgid installiert, aber beide sind noch nicht aktiviert.

Erst aktivieren Sie das Modul php-fpm mit dem folgenden Befehl:

  • sudo a2enconf php7.2-fpm

Zweitens aktivieren Sie das Modul Apache HTTP proxy:

  • sudo a2enmod proxy

Drittens aktivieren Sie das Modul FastCGI proxy in Apache HTTP:

  • sudo a2enmod proxy_fcgi

Hinweis: Sie können die Konfiguration dieser Interaktion zwischen PHP-Programmen und Apache HTTP über einen UNIX-Socket wie folgt auslesen:

  • cat /etc/apache2/conf-enabled/php7.2-fpm.conf

Jetzt ist alles vorbereitet und Sie können Apache HTTP starten. Zuerst wird die Konfiguration überprüft:

  • sudo apachectl configtest
Output
Syntax OK

Danach kann Apache HTTP neu gestartet werden, da es bei der Installation der FastCGI-Bibliothek libapache2-mod-fcgid automatisch gestartet wurde:

  • sudo systemctl restart apache2

Sie haben das Modul php-fpm installiert, Apache HTTP so konfiguriert, dass es damit arbeiten kann, 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 Multiprocessing-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:

Output
mpm_event_module (shared)

Sie können das Gleiche für das proxy-Modul und FastCGI wiederholen:

  • sudo apachectl -M | grep 'proxy'

Die Ausgabe lautet:

Output
proxy_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 nano /var/www/your_domain/info.php

Fügen Sie den folgenden Inhalt in die Datei info.php ein:

info.php
<?php phpinfo(); ?>

Suchen Sie nun die URL Ihres Servers auf und fügen Sie info.php am Ende wie folgt an: http://your_domain/info.php.

Der Server-API-Eintrag wird FPM/FastCGI sein.

PHP prüft den Server-API-Eintrag FPM/FastCGI

Löschen Sie die Datei info.php nach dieser Prüfung, damit keine Informationen über den Server offengelegt werden:

  • sudo rm /var/www/yourdomain.com/info.php

Sie haben den Arbeitsstatus des MPM-Moduls, der Module, die FastCGI handhaben, und die Handhabung des PHP-Codes geprüft.

Abschluss