Hur man konfigurerar Apache HTTP med MPM Event och PHP-FPM på FreeBSD 12.0

Författaren har valt Open Internet/Free Speech 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 underordnade processer, varav 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.

Händelsemodulen MPM Event är en snabb multiprocessmodul som finns tillgänglig på webbservern Apache HTTP.

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 webbservarnas beteende. Programmen kör sina processer självständigt och skickar sin produkt till webbservern via detta protokoll. Varje ny anslutning som behöver bearbetas av ett program skapar en ny process.

Då en webbplats kombinerar MPM-händelsen i Apache HTTP med PHP FastCGI Process Manager (PHP-FPM) kan den 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 FAMP-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 istället för den 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 FreeBSD 12.0-server som konfigurerats enligt den här guiden.
  • FAMP-stacken installerad på din server enligt den här handledningen.
  • Access till en användare med root-privilegier (eller tillåtet genom att använda sudo) för att kunna göra konfigurationsändringar.

Steg 1 – Ändra Multi-Processing Module

Du börjar med att leta efter pre-fork-direktivet i httpd.conf-filen. Detta är den huvudsakliga konfigurationsfilen för Apache HTTP där du kan aktivera och inaktivera moduler. Du kan redigera och ställa in direktiv som t.ex. den lyssnande porten där Apache HTTP ska servera innehåll eller platsen för det innehåll som ska visas i den här filen.

För att göra de här ändringarna använder du programmet nl, number line, med flaggan -ba för att räkna och numrera rader så att ingenting blir felmatchat i ett senare skede. I kombination med grep kommer detta kommando först att räkna alla rader i den fil som anges i sökvägen, och när det är klart kommer det att söka efter den teckensträng du letar efter.

Kör följande kommando så att programmet nl kommer att bearbeta och numrera raderna i httpd.conf. Därefter kommer grep att bearbeta resultatet genom att söka efter den givna teckensträngen 'mod_mpm_prefork':

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'

Som resultat kommer du att se något som liknar:

Output
67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so

Låt oss redigera rad 67 med din textredigerare. I den här handledningen använder du vi, som är standardredigeraren på FreeBSD:

  • sudo vi +67 /usr/local/etc/apache24/httpd.conf

Lägg till en #-symbol i början av raden så att den här raden kommenteras ut, så här:

/usr/local/etc/apache24/httpd.conf
...# LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so...

Då du lägger till #-symbolen har du inaktiverat MPM-modulen pre-fork.

Nu hittar du händelsedirektivet i samma httpd.conf fil.

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event

Du kommer att se utdata som liknar följande:

Output
...66 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...

Nu tar du bort #-symbolen på rad 66 för att aktivera Event MPM:

  • sudo vi +66 /usr/local/etc/apache24/httpd.conf

Direktivet kommer nu att se ut på följande sätt:

/usr/local/etc/apache24/httpd.conf
...LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...

Nu när du har bytt konfiguration från MPM pre-fork till event kan du ta bort mod_php73-paketet som ansluter PHP-processorn till Apache HTTP, eftersom det inte längre är nödvändigt och kommer att störa om det finns kvar i systemet:

  • sudo pkg remove -y mod_php73

Säkerställ att konfigurationen är korrekt genom att köra följande kommando för att testa:

  • sudo apachectl configtest

Om du ser Syntax OK i utmatningen kan du starta om Apache HTTP-servern:

  • sudo apachectl restart

Anmärkning: Om det finns andra HTTP-anslutningar som körs på servern rekommenderas en mjuk omstart i stället för en vanlig omstart. Detta säkerställer att användarna inte blir utstötta och förlorar sin anslutning:

  • sudo apachectl graceful

Du har bytt MPM från pre-fork till event och tagit bort mod_php73-modulanslutningen PHP till Apache HTTP. I nästa steg installerar du PHP-FPM-modulen och konfigurerar Apache HTTP så att den kan kommunicera med PHP snabbare.

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

FreeBSD har flera versioner av PHP som stöds och som du kan installera via pakethanteraren. På FreeBSD kompileras olika binärer för de olika tillgängliga versionerna istället för att använda en enda som de flesta GNU/Linux-distributioner erbjuder i sina standardförråd. För att följa bästa praxis använder du den version som stöds, vilket du kan kontrollera på PHP:s sida för stödda versioner.

I det här steget lägger du till PHP-FPM som en tjänst som startar vid uppstart. Du konfigurerar också Apache HTTP för att arbeta med PHP genom att lägga till en särskild konfiguration för modulen samt aktivera ytterligare några moduler i httpd.conf.

Först lägger du till 'php_fpm_enable=YES' i /etc/rc.conf-filen så att PHP-FPM-tjänsten kan starta. Det gör du med kommandot sysrc:

  • sudo sysrc php_fpm_enable="YES"

Nu lägger du till modulen php-fpm i Apache-modulens katalog, så att den är konfigurerad för att användas av Apache HTTP. Skapa följande fil för att göra detta:

  • sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf

Häll in följande i 030_php-fpm.conf:

/usr/local/etc/apache24/modules.d/030_php-fpm.conf
<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>

Detta anger att om modulen 'proxy_fcgi' är aktiverad liksom 'dir_module' så ska alla bearbetade filer som matchar tilläggen inom parentes hanteras av FastCGI-processhanteraren som körs på den lokala maskinen via port 9000 – som om den lokala maskinen vore en proxyserver. Det är här som PHP-FPM-modulen och Apache HTTP kopplas samman. För att uppnå detta kommer du att aktivera ytterligare moduler under det här steget.

För att aktivera proxymodulen söker du först efter den i filen httpd.conf:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so

Du kommer att se en utdata som liknar följande:

Output
...129 #LoadModule proxy_module libexec/apache24/mod_proxy.so...

Du tar bort kommentaren i raden genom att ta bort symbolen #:

  • sudo vi +129 /usr/local/etc/apache24/httpd.conf

Raden kommer att se ut på följande sätt när den har redigerats:

/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_module libexec/apache24/mod_proxy.so...

Nu kan du aktivera FastCGI-modulen. Hitta modulen med följande kommando:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so

Du kommer att se något som liknar följande:

Output
...133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...

Du kan nu avkommentera rad 133 som du redan har gjort med de andra modulerna:

  • sudo vi +133 /usr/local/etc/apache24/httpd.conf

Du lämnar raden så här:

/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...

När detta är gjort startar du tjänsten PHP-FPM:

  • sudo service php-fpm start

Och du startar om Apache så att den laddar in de senaste konfigurationsändringarna som innehåller PHP-modulen:

  • sudo apachectl restart

Du har installerat PHP-FPM-modulen, 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 proxymodulen 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 mycket litet PHP-skript som kommer att visa dig all information som rör PHP.

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

  • sudo vi /usr/local/www/apache24/data/info.php

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

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

Bege dig nu till serverns URL och lägg till info.php i slutet på följande sätt: http://your_server_IP_address/info.php.

Server-API-posten blir FPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

Håll dig till att radera info.php-filen efter den här kontrollen så att ingen information om servern avslöjas för allmänheten.

  • sudo rm /usr/local/www/apache24/data/info.php

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

Slutsats

Leave a Reply