Hur man konfigurerar Apache HTTP med MPM Event och PHP-FPM på Ubuntu 18.04

Författaren valde COVID-19 Relief Fund för att få en donation som en del av programmet Write for DOnations.

Introduktion

Apache HTTP-webbservern har utvecklats genom åren för att fungera i olika miljöer och lösa olika behov. Ett viktigt problem som Apache HTTP måste lösa, precis som alla andra webbservrar, är hur man hanterar olika processer för att betjäna en http-protokollförfrågan. Detta innebär att öppna en socket, behandla begäran, hålla anslutningen öppen under en viss tid, hantera nya händelser som inträffar genom anslutningen och returnera det innehåll som producerats av ett program som gjorts i ett visst språk (t.ex. PHP, Perl eller Python). Dessa uppgifter utförs och kontrolleras av en MPM (Multi-Processing Module).

Apache HTTP levereras med tre olika MPM:

  • Pre-fork: En ny process skapas för varje inkommande anslutning som når servern. Varje process är isolerad från de andra, så inget minne delas mellan dem, även om de utför identiska anrop någon gång under utförandet. Detta är ett säkert sätt att köra program som är länkade till bibliotek som inte har stöd för trådning – vanligtvis äldre program eller bibliotek.
  • Worker: En överordnad process ansvarar för att starta en pool av underprocesser, av vilka en del lyssnar på nya inkommande anslutningar och andra serverar det begärda innehållet. Varje process är trådad (en enda tråd kan hantera en anslutning) så att en process kan hantera flera förfrågningar samtidigt. Detta sätt att behandla anslutningar uppmuntrar till bättre resursutnyttjande, samtidigt som stabiliteten bibehålls. Detta är ett resultat av poolen av tillgängliga processer, som ofta har lediga tillgängliga trådar som är redo att omedelbart betjäna nya anslutningar.
  • Händelse: Baserat på worker går denna MPM ett steg längre genom att optimera hur den överordnade processen schemalägger uppgifter till de underordnade processerna och de trådar som är kopplade till dessa. En anslutning förblir öppen i 5 sekunder som standard och stängs om ingen ny händelse inträffar; detta är standardvärdet för keep-alive-direktivet, som behåller den tråd som är kopplad till den. Event MPM gör det möjligt för processen att hantera trådar så att vissa trådar är fria att hantera nya inkommande anslutningar medan andra hålls bundna till de levande anslutningarna. Om man tillåter omfördelning av tilldelade uppgifter till trådar blir resursutnyttjandet och prestandan bättre.

The MPM Event-modulen är en snabb multiprocessmodul som finns tillgänglig på Apache HTTP-webbservern.

PHP-FPM är FastCGI Process Manager för PHP. FastCGI-protokollet är baserat på Common Gateway Interface (CGI), ett protokoll som sitter mellan program och webbservrar som Apache HTTP. Detta gör det möjligt för utvecklare att skriva program separat från webbservrarnas beteende. Programmen kör sina processer självständigt och skickar sin produkt till webbservern via detta protokoll. Varje ny anslutning i behov av behandling av ett program skapar en ny process.

Du kombinerar MPM Event i Apache HTTP med PHP FastCGI Process Manager (PHP-FPM), vilket gör att en webbplats kan laddas snabbare och hantera fler samtidiga anslutningar samtidigt som den använder färre resurser.

I den här handledningen kommer du att förbättra prestandan i LAMP-stacken genom att ändra standardmodulen för multiprocessing från pre-fork till event och genom att använda processhanteraren PHP-FPM för att hantera PHP-kod i stället för det klassiska mod_php i Apache HTTP.

Förutsättningar

För att påbörja den här guiden behöver du följande:

  • En Ubuntu 18.04-server som konfigurerats enligt guiden för Ubuntu 18.04:s initiala serverinstallation, inklusive en sudo icke-rootanvändare och en brandvägg.
  • LAMP-stacken installerad på din server enligt How To Install Linux, Apache, MySQL, PHP (LAMP stack) on Ubuntu 18.04.

Steg 1 – Ändra Multi-Processing Module

Ubuntu ärver skript för att aktivera eller inaktivera Apache HTTP-moduler från sin moderdistribution, Debian. Du kommer att använda denna verktygslåda i det här steget för att inaktivera Pre-fork-modulen och aktivera Event-modulen.

I det här steget kommer du att stoppa Apache HTTP, inaktivera PHP 7.2-modulen som är kopplad till Pre-fork-modulen och sedan inaktivera Pre-fork för att omedelbart aktivera Event-modulen.

Först stoppar du Apache HTTP-tjänsten:

  • sudo systemctl stop apache2

Nu kan du inaktivera PHP 7.2-modulen, som är kopplad till Pre-fork-modulen:

  • sudo a2dismod php7.2

Därefter inaktiverar du Pre-fork MPM-modulen:

  • sudo a2dismod mpm_prefork

Aktivera nu Event MPM-modulen:

  • sudo a2enmod mpm_event

Du har bytt MPM från pre-fork till event och tagit bort PHP 7.2-modulens anslutning mellan PHP och Apache HTTP. I nästa steg installerar du php-fpm-modulen samt de relaterade biblioteken och proxymodulerna. Du konfigurerar Apache HTTP så att den också kan kommunicera med PHP.

Steg 2 – Konfigurera Apache HTTP för att använda FastCGI Process Manager

I det här skedet har du bytt sätt för Apache HTTP att bearbeta anslutningar genom att gå från Pre-fork MPM till Event. På vägen dit har du dock inaktiverat PHP-modulen som kopplade Apache HTTP till alla program som körs på PHP.

I det här steget installerar du PHP-FPM-processorn så att Apache HTTP återigen kan behandla PHP-program. Och du kommer också att installera beroendebiblioteken och aktivera modulerna så att båda kan samarbeta smidigt och snabbare än tidigare.

Installera först php-fpm. Följande kommando installerar paketet PHP-FPM och aktiverar automatiskt tjänsten php7.2-fpm som är integrerad med systemd, så att tjänsten startas vid uppstart:

  • sudo apt install php-fpm

För att kunna kommunicera behöver Apache HTTP och PHP ett bibliotek som möjliggör denna kapacitet. Du ska nu installera libapache2-mod-fcgid, som kan fungera som ett gränssnitt mellan program med webbservrar, och det är specifikt för Apache HTTP. Kommunikationen sker via en UNIX-socket.

Installera det här biblioteket:

  • sudo apt install libapache2-mod-fcgid

Du har installerat php-fpm och libapache2-mod-fcgid, men ingen av dem är aktiverade ännu.

Först aktiverar du php-fpm-modulen med följande kommando:

  • sudo a2enconf php7.2-fpm

För det andra aktiverar du Apache HTTP proxy-modulen:

  • sudo a2enmod proxy

För det tredje aktiverar du FastCGI proxy-modulen i Apache HTTP:

  • sudo a2enmod proxy_fcgi

Note: Du kan läsa konfigurationen av denna interaktion mellan PHP-programmen och Apache HTTP via en UNIX-socket på följande sätt:

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

Allt är nu på plats så du kan starta Apache HTTP. Du gör först en konfigurationskontroll:

  • sudo apachectl configtest
Output
Syntax OK

Därefter kan du fortsätta att starta om Apache HTTP, eftersom den startades automatiskt när du installerade FastCGI-biblioteket libapache2-mod-fcgid:

  • sudo systemctl restart apache2

Du har installerat modulen php-fpm, konfigurerat Apache HTTP så att den fungerar med den, aktiverat de moduler som krävs för att FastCGI-protokollet ska fungera och startat motsvarande tjänster.

Nu när Apache har Event MPM-modulen aktiverad och PHP-FPM finns och körs är det dags att kontrollera att allt fungerar som det är tänkt.

Steg 3 – Kontrollera din konfiguration

För att kontrollera att konfigurationsändringarna har tillämpats ska du köra några tester. Det första kommer att kontrollera vilken multiprocessmodul Apache HTTP använder. Det andra kommer att kontrollera att PHP använder FPM-hanteraren.

Kontrollera Apache HTTP-servern genom att köra följande kommando:

  • sudo apachectl -M | grep 'mpm'

Din utdata kommer att se ut på följande sätt:

Output
mpm_event_module (shared)

Du kan upprepa samma sak för proxy-modulen och FastCGI:

  • sudo apachectl -M | grep 'proxy'

Utmatningen kommer att visa:

Output
proxy_module (shared)proxy_fcgi_module (shared)

Om du vill se hela listan med moduler kan du ta bort den andra delen av kommandot efter -M.

Det är nu dags att kontrollera om PHP använder FastCGI Process Manager. För att göra det skriver du ett litet PHP-skript som visar dig all information som rör PHP.

Kör följande kommando för att skriva en fil med följande namn:

  • sudo nano /var/www/your_domain/info.php

Lägg till följande innehåll i info.php-filen:

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

Besök nu serverns webbadress och lägg till info.php i slutet på följande sätt: http://your_domain/info.php.

Serverens API-post blir FPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

Släck info.php-filen efter denna kontroll så att ingen information om servern avslöjas offentligt:

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

Du har kontrollerat arbetsstatusen för MPM-modulen, modulerna som hanterar FastCGI och hanteringen av PHP-kod.

Slutsats