Sådan konfigureres Apache HTTP med MPM Event og PHP-FPM på FreeBSD 12.0

Forfatteren har valgt Open Internet/Free Speech Fund til at modtage en donation som en del af Write for DOnations-programmet.

Introduktion

Apache HTTP-webserveren har udviklet sig gennem årene til at fungere i forskellige miljøer og løse forskellige behov. Et vigtigt problem, som Apache HTTP skal løse, er som enhver webserver, hvordan man håndterer forskellige processer for at betjene en http-protokolanmodning. Dette indebærer at åbne en socket, behandle anmodningen, holde forbindelsen åben i en vis periode, håndtere nye hændelser, der opstår gennem denne forbindelse, og returnere det indhold, der er produceret af et program, der er lavet i et bestemt sprog (f.eks. PHP, Perl eller Python). Disse opgaver udføres og styres af et MPM (Multi-Processing Module).

Apache HTTP leveres med tre forskellige MPM:

  • Pre-fork: Der oprettes en ny proces for hver indgående forbindelse, der når serveren. Hver proces er isoleret fra de andre, så der deles ingen hukommelse mellem dem, selv om de udfører identiske kald på et tidspunkt i deres udførelse. Dette er en sikker måde at køre programmer, der er knyttet til biblioteker, som ikke understøtter threading – typisk ældre programmer eller biblioteker.
  • Worker: En overordnet proces er ansvarlig for at starte en pulje af underordnede processer, hvoraf nogle lytter efter nye indgående forbindelser, og andre serverer det ønskede indhold. Hver proces er trådopdelt (en enkelt tråd kan håndtere én forbindelse), så én proces kan håndtere flere anmodninger samtidig. Denne metode til behandling af forbindelser tilskynder til bedre ressourceudnyttelse, samtidig med at stabiliteten opretholdes. Dette er et resultat af puljen af tilgængelige processer, som ofte har ledige tilgængelige tråde, der er klar til straks at betjene nye forbindelser.
  • Begivenhed: Baseret på worker går denne MPM et skridt videre ved at optimere, hvordan den overordnede proces planlægger opgaver til de underordnede processer og de tråde, der er knyttet til disse. En forbindelse forbliver som standard åben i 5 sekunder og lukkes, hvis der ikke sker nogen ny hændelse; dette er standardværdien for keep-alive-direktivet, som bevarer den tilknyttede tråd. Event MPM gør det muligt for processen at administrere tråde, således at nogle tråde er frie til at håndtere nye indgående forbindelser, mens andre holdes bundet til de levende forbindelser. Ved at tillade omfordeling af tildelte opgaver til tråde opnås en bedre ressourceudnyttelse og ydeevne.

MPM Event-modulet MPM er et hurtigt multiprocesseringsmodul, der er tilgængeligt på Apache HTTP-webserveren.

PHP-FPM er FastCGI Process Manager for PHP. FastCGI-protokollen er baseret på Common Gateway Interface (CGI), en protokol, der befinder sig mellem programmer og webservere som Apache HTTP. Dette gør det muligt for udviklere at skrive programmer uafhængigt af webservernes adfærd. Programmerne kører deres processer uafhængigt og sender deres produkt til webserveren via denne protokol. Hver ny forbindelse, der skal behandles af et program, opretter en ny proces.

Gennem at kombinere MPM-hændelsen i Apache HTTP med PHP FastCGI Process Manager (PHP-FPM) kan et websted indlæses hurtigere og håndtere flere samtidige forbindelser, samtidig med at der bruges færre ressourcer.

I denne vejledning forbedrer du FAMP-stackens ydeevne ved at ændre standardmodulet for multiprocessing fra pre-fork til event og ved at bruge PHP-FPM-processtyring til at håndtere PHP-kode i stedet for den klassiske mod_php i Apache HTTP.

Forudsætninger

Hvor du begynder denne vejledning skal du bruge følgende:

  • En FreeBSD 12.0-server, der er opsat efter denne vejledning.
  • FAMP-stakken, der er installeret på din server efter denne vejledning.
  • Access til en bruger med root-privilegier (eller tilladt ved at bruge sudo) for at kunne foretage konfigurationsændringer.

Stræk 1 – Ændring af multiprocesseringsmodulet

Du begynder med at lede efter pre-fork-direktivet i filen httpd.conf. Dette er den vigtigste konfigurationsfil for Apache HTTP, hvor du kan aktivere og deaktivere moduler. Du kan redigere og indstille direktiver som f.eks. den lytteport, hvor Apache HTTP skal servere indhold, eller placeringen af det indhold, der skal vises i denne fil.

For at foretage disse ændringer bruger du programmet nl, number line, med -ba-flaget til at tælle og nummerere linjer, så der ikke er noget, der ikke passer sammen på et senere tidspunkt. Kombineret med grep vil denne kommando først tælle alle linjerne i den fil, der er angivet i stien, og når den er færdig, vil den søge efter den tegnstreng, du leder efter.

Kør følgende kommando, så programmet nl vil behandle og nummerere linjerne i httpd.conf. Derefter vil grep behandle output ved at søge efter den angivne tegnstreng 'mod_mpm_prefork':

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

Som output vil du se noget, der ligner:

Output
67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so

Lad os redigere linje 67 med din teksteditor. I denne vejledning bruger du vi, som er standardeditoren på FreeBSD:

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

Føj et #-symbol til i begyndelsen af linjen, så denne linje er kommenteret ud, som her:

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

Gennem at tilføje #-symbolet har du deaktiveret pre-fork MPM-modulet.

Nu finder du hændelsesdirektivet i den samme httpd.conf fil.

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

Du vil se output, der ligner følgende:

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

Nu fjerner du #-symbolet i linje 66 for at aktivere Event MPM:

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

Direktivet vil nu se ud som følger:

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

Nu, hvor du har skiftet konfigurationen fra MPM pre-fork til event, kan du fjerne mod_php73-pakken, der forbinder PHP-processoren med Apache HTTP, da den ikke længere er nødvendig og vil forstyrre, hvis den forbliver på systemet:

  • sudo pkg remove -y mod_php73

Sørg for, at konfigurationen er korrekt ved at køre følgende kommando for at teste:

  • sudo apachectl configtest

Hvis du ser Syntax OK i dit output, kan du genstarte Apache HTTP-serveren:

  • sudo apachectl restart

Bemærk: Hvis der er andre kørende HTTP-forbindelser på din server, anbefales det at foretage en graceful restart i stedet for en almindelig genstart. Dette vil sikre, at brugerne ikke bliver skubbet ud og mister deres forbindelse:

  • sudo apachectl graceful

Du har skiftet MPM fra pre-fork til event og fjernet mod_php73 modulforbindelsen PHP til Apache HTTP. I næste trin installerer du PHP-FPM-modulet og konfigurerer Apache HTTP, så den kan kommunikere med PHP hurtigere.

Stræk 2 – Konfiguration af Apache HTTP til at bruge FastCGI Process Manager

FreeBSD har flere understøttede versioner af PHP, som du kan installere via pakkehåndteringsprogrammet. På FreeBSD kompileres forskellige binære filer af de forskellige tilgængelige versioner i stedet for kun at bruge en enkelt, som de fleste GNU/Linux-distributioner tilbyder i deres standardrepositorier. For at følge bedste praksis skal du bruge den understøttede version, som du kan tjekke på PHP’s side om understøttede versioner.

I dette trin skal du tilføje PHP-FPM som en kørende tjeneste, der skal starte ved opstart. Du konfigurerer også Apache HTTP til at arbejde med PHP ved at tilføje en dedikeret konfiguration for modulet samt aktivere nogle yderligere moduler i httpd.conf.

Først skal du tilføje 'php_fpm_enable=YES' til /etc/rc.conf-filen, så PHP-FPM-tjenesten kan starte. Det gør du ved at bruge kommandoen sysrc:

  • sudo sysrc php_fpm_enable="YES"

Nu skal du tilføje modulet php-fpm i Apache-modulets mappe, så det er konfigureret til at blive brugt af Apache HTTP. Opret følgende fil for at gøre det:

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

Føj følgende til 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>

Dette angiver, at hvis modulet 'proxy_fcgi' er aktiveret såvel som 'dir_module', så skal alle behandlede filer, der matcher udvidelserne i parentes, håndteres af FastCGI-proceshåndteringen, der kører på den lokale maskine via port 9000 – som om den lokale maskine var en proxyserver. Det er her, at PHP-FPM-modulet og Apache HTTP er forbundet med hinanden. For at opnå dette skal du aktivere yderligere moduler under dette trin.

For at aktivere proxymodulet skal du først søge efter det i filen httpd.conf:

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

Du vil se output svarende til følgende:

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

Du udkommenterer linjen ved at fjerne #-symbolet:

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

Linjen vil se ud som følger, når den er redigeret:

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

Nu kan du aktivere FastCGI-modulet. Find modulet med følgende kommando:

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

Du vil se noget, der ligner følgende:

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

Udkommenter nu linje 133, som du allerede har gjort med de andre moduler:

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

Du efterlader linjen som følger:

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

Når dette er gjort, starter du PHP-FPM-tjenesten:

  • sudo service php-fpm start

Og du genstarter Apache, så den indlæser de seneste konfigurationsændringer, der indeholder PHP-modulet:

  • sudo apachectl restart

Du har installeret PHP-FPM-modulet, konfigureret Apache HTTP til at fungere med det, aktiveret de nødvendige moduler for at FastCGI-protokollen kan fungere, og startet de tilsvarende tjenester.

Nu hvor Apache har Event MPM-modulet aktiveret, og PHP-FPM er til stede og kører, er det tid til at kontrollere, at alt fungerer efter hensigten.

Stræk 3 – Kontrol af din konfiguration

For at kontrollere, at konfigurationsændringerne er blevet anvendt, skal du køre nogle tests. Den første vil kontrollere, hvilket multiprocesseringsmodul Apache HTTP bruger. Den anden vil verificere, at PHP bruger FPM-manageren.

Kontroller Apache HTTP-serveren ved at køre følgende kommando:

  • sudo apachectl -M | grep 'mpm'

Din output vil være som følger:

Output
mpm_event_module (shared)

Du kan gentage det samme for proxy-modulet og FastCGI:

  • sudo apachectl -M | grep 'proxy'

Opdatet vil vise:

Output
proxy_module (shared)proxy_fcgi_module (shared)

Hvis du ønsker at se hele listen over modulerne, kan du fjerne den anden del af kommandoen efter -M.

Det er nu tid til at kontrollere, om PHP bruger FastCGI Process Manager. For at gøre det skal du skrive et meget lille PHP-script, der viser dig alle oplysninger vedrørende PHP.

Kør følgende kommando for at skrive en fil med følgende navn:

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

Føj følgende indhold til filen info.php:

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

Besøg nu din servers URL-adresse og tilføj info.php til sidst på følgende måde: http://your_server_IP_address/info.php.

Server-API-posten vil være FPM/FastCGI.

PHP Screening af server-API-posten FPM/FastCGI

Husk at slette info.php-filen efter denne kontrol, så ingen oplysninger om serveren bliver offentligt tilgængelige.

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

Du har kontrolleret arbejdsstatus for MPM-modulet, modulerne, der håndterer FastCGI, og håndteringen af PHP-kode.

Konklusion

Leave a Reply