Hoe Apache HTTP te configureren met MPM Event en PHP-FPM op FreeBSD 12.0
De auteur heeft het Open Internet/Free Speech Fund geselecteerd om een donatie te ontvangen als onderdeel van het Write for DOnations programma.
Introductie
De Apache HTTP webserver is in de loop der jaren geëvolueerd om in verschillende omgevingen te werken en verschillende behoeften op te lossen. Een belangrijk probleem dat Apache HTTP moet oplossen, zoals elke webserver, is hoe verschillende processen moeten worden afgehandeld om een http-protocolverzoek af te handelen. Dit omvat het openen van een socket, het verwerken van het verzoek, het openhouden van de verbinding gedurende een bepaalde periode, het verwerken van nieuwe gebeurtenissen die via die verbinding plaatsvinden, en het terugzenden van de inhoud die is geproduceerd door een programma dat in een bepaalde taal is gemaakt (zoals PHP, Perl, of Python). Deze taken worden uitgevoerd en gecontroleerd door een Multi-Processing Module (MPM).
Apache HTTP wordt geleverd met drie verschillende MPM:
- Pre-fork: Een nieuw proces wordt aangemaakt voor elke inkomende verbinding die de server bereikt. Elk proces is geïsoleerd van de anderen, dus er wordt geen geheugen tussen hen gedeeld, ook al voeren ze op een bepaald punt in hun uitvoering identieke aanroepen uit. Dit is een veilige manier om applicaties te draaien die gekoppeld zijn aan bibliotheken die geen threading ondersteunen-typisch oudere applicaties of bibliotheken.
- Worker: Een ouder proces is verantwoordelijk voor het starten van een pool van kind processen, waarvan sommige luisteren voor nieuwe inkomende verbindingen, en anderen dienen de gevraagde inhoud. Elk proces is threaded (een enkele thread kan een verbinding afhandelen) zodat een proces meerdere aanvragen tegelijk kan afhandelen. Deze methode om verbindingen te behandelen bevordert een beter gebruik van hulpbronnen, terwijl de stabiliteit toch behouden blijft. Dit is een gevolg van de pool van beschikbare processen, die vaak vrij beschikbare threads heeft, klaar om onmiddellijk nieuwe verbindingen te bedienen.
- Gebeurtenis: Gebaseerd op worker, gaat deze MPM nog een stap verder door te optimaliseren hoe het ouderproces taken inplant naar de kindprocessen en de daaraan gekoppelde threads. Een verbinding blijft standaard 5 seconden open en sluit als er geen nieuwe gebeurtenis plaatsvindt; dit is de standaardwaarde van de keep-alive richtlijn, die de eraan gekoppelde thread behoudt. Het Event MPM stelt het proces in staat threads te beheren, zodat sommige threads vrij zijn om nieuwe inkomende verbindingen af te handelen, terwijl andere gebonden blijven aan de live verbindingen. Het toestaan van herverdeling van toegewezen taken aan threads zorgt voor een beter gebruik van bronnen en betere prestaties.
De Event MPM module is een snelle multi-processing module die beschikbaar is op de Apache HTTP web server.
PHP-FPM is de FastCGI Process Manager voor PHP. Het FastCGI-protocol is gebaseerd op de Common Gateway Interface (CGI), een protocol dat tussen applicaties en webservers zoals Apache HTTP zit. Dit laat ontwikkelaars toe om toepassingen te schrijven los van het gedrag van web servers. Programma’s voeren hun processen onafhankelijk uit en geven hun product via dit protocol door aan de webserver. Elke nieuwe verbinding die door een applicatie moet worden verwerkt, maakt een nieuw proces aan.
Door het MPM Event in Apache HTTP te combineren met de PHP FastCGI Process Manager (PHP-FPM) kan een website sneller laden en meer gelijktijdige verbindingen afhandelen, terwijl minder middelen worden gebruikt.
In deze tutorial zul je de prestaties van de FAMP stack verbeteren door de standaard multi-processing module te veranderen van pre-fork naar event en door de PHP-FPM process manager te gebruiken om PHP code af te handelen in plaats van de klassieke mod_php
in Apache HTTP.
Voorvereisten
Voordat u met deze gids begint heeft u het volgende nodig:
- Een FreeBSD 12.0 server die volgens deze gids is opgezet.
- De FAMP stack die volgens deze handleiding op uw server is geïnstalleerd.
- Toegang tot een gebruiker met root-rechten (of toegestaan met sudo) om configuratiewijzigingen door te voeren.
Stap 1 – De Multi-Processing Module wijzigen
U begint met het zoeken naar de pre-fork richtlijn in het httpd.conf
bestand. Dit is het hoofdconfiguratiebestand voor Apache HTTP waarin u modules kunt in- en uitschakelen. U kunt directives zoals de luisterpoort waar Apache HTTP inhoud zal serveren of de locatie van de weer te geven inhoud in dit bestand bewerken en instellen.
Om deze veranderingen aan te brengen, gebruikt u het nl
, number line, programma, met de -ba
vlag om regels te tellen en te nummeren, zodat er later niets verkeerd wordt weergegeven. In combinatie met grep
zal dit commando eerst alle regels tellen in het bestand dat in het pad is opgegeven, en als het klaar is, zal het zoeken naar de tekenreeks die u zoekt.
Voer het volgende commando uit, zodat het programma nl
de regels in httpd.conf
zal verwerken en nummeren. Daarna zal grep
de uitvoer verwerken door te zoeken naar de gegeven tekenreeks 'mod_mpm_prefork'
:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'
Als uitvoer zult u iets zien dat lijkt op:
Output 67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
Laten we regel 67 bewerken met uw teksteditor. In deze handleiding gebruikt u vi
, dat is de standaard editor op FreeBSD:
- sudo vi +67 /usr/local/etc/apache24/httpd.conf
Voeg een #
-symbool toe aan het begin van de regel zodat deze regel wordt uitgecommentarieerd, zoals dit:
...# LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so...
Door het #
-symbool toe te voegen, hebt u de pre-fork MPM-module uitgezet.
Nu vindt u de event directive in hetzelfde httpd.conf
bestand.
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event
U ziet uitvoer vergelijkbaar met de volgende:
Output...66 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...
Nu verwijdert u het #
symbool in regel 66 om de Event MPM in te schakelen:
- sudo vi +66 /usr/local/etc/apache24/httpd.conf
De directive zal nu als volgt luiden:
...LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...
Nu u de configuratie hebt omgeschakeld van de MPM pre-fork naar event, kunt u het mod_php73
pakket dat de PHP processor verbindt met Apache HTTP verwijderen, aangezien het niet langer nodig is en zal storen als het op het systeem blijft staan:
- sudo pkg remove -y mod_php73
Zorg ervoor dat de configuratie correct is door het volgende commando uit te voeren om te testen:
- sudo apachectl configtest
Als u Syntax OK
in uw uitvoer ziet, kunt u de Apache HTTP server herstarten:
- sudo apachectl restart
Note: Als er andere lopende HTTP verbindingen op uw server zijn, wordt een “graceful restart” aanbevolen in plaats van een gewone herstart. Dit zal ervoor zorgen dat gebruikers niet worden weggedrukt, doordat ze hun verbinding verliezen:
- sudo apachectl graceful
Je hebt de MPM van pre-fork naar event omgeschakeld en de mod_php73
module verbinding PHP met Apache HTTP verwijderd. In de volgende stap installeert u de module PHP-FPM en stelt u Apache HTTP zo in dat het sneller met PHP kan communiceren.
Stap 2 – Apache HTTP instellen om de FastCGI procesmanager te gebruiken
FreeBSD heeft verschillende ondersteunde versies van PHP die u via de pakketbeheerder kunt installeren. Op FreeBSD worden verschillende binaries van de verschillende beschikbare versies gecompileerd in plaats van er slechts een te gebruiken zoals de meeste GNU/Linux distributies in hun standaard repositories aanbieden. Om de beste praktijk te volgen wordt de ondersteunde versie gebruikt, die gecontroleerd kan worden op PHP’s ondersteunde versies pagina.
In deze stap wordt PHP-FPM toegevoegd als een draaiende service die bij het opstarten wordt gestart. Je zult ook Apache HTTP configureren om met PHP te werken door een speciale configuratie voor de module toe te voegen en door enkele andere modules in httpd.conf
in te schakelen.
Voreerst voeg je 'php_fpm_enable=YES'
toe aan het /etc/rc.conf
bestand zodat de PHP-FPM service kan starten. U doet dat met het sysrc
commando:
- sudo sysrc php_fpm_enable="YES"
Nu voegt u de php-fpm
module toe aan de Apache module directory, zodat deze geconfigureerd is om gebruikt te worden door Apache HTTP. Maak daarvoor het volgende bestand aan:
- sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf
Voeg het volgende toe aan 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>
Dit stelt dat als de module 'proxy_fcgi'
is ingeschakeld, evenals de 'dir_module'
, alle verwerkte bestanden die overeenkomen met de extensies tussen haakjes, moeten worden afgehandeld door de FastCGI procesmanager die op de lokale machine draait via poort 9000
-alsof de lokale machine een proxyserver is. Dit is waar de PHP-FPM module en Apache HTTP met elkaar in verbinding staan. Om dit te bereiken, zult u tijdens deze stap nog meer modules activeren.
Om de proxy module te activeren, zoekt u deze eerst in het httpd.conf
bestand:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so
U zult uitvoer zien zoals hieronder:
Output...129 #LoadModule proxy_module libexec/apache24/mod_proxy.so...
U maakt het commentaar op de regel ongedaan door het symbool #
te verwijderen:
- sudo vi +129 /usr/local/etc/apache24/httpd.conf
De regel zal er na bewerking als volgt uitzien:
...LoadModule proxy_module libexec/apache24/mod_proxy.so...
Nu kunt u de FastCGI module activeren. Zoek de module met het volgende commando:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so
U ziet iets wat lijkt op het volgende:
Output...133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...
Nu verwijdert u het commentaar van regel 133, zoals u ook al bij de andere modules hebt gedaan:
- sudo vi +133 /usr/local/etc/apache24/httpd.conf
U laat de regel als volgt staan:
...LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...
Als dit is gebeurd, start u de PHP-FPM service:
- sudo service php-fpm start
En u herstart Apache zodat het de laatste configuratie wijzigingen laadt waarin de PHP module is opgenomen:
- sudo apachectl restart
U heeft de PHP-FPM module geinstalleerd, Apache HTTP geconfigureerd om er mee te werken, de benodigde modules ingeschakeld om het FastCGI protocol te laten werken, en de corresponderende services gestart.
Nu Apache de Event MPM module heeft ingeschakeld en PHP-FPM aanwezig is en draait, is het tijd om te controleren of alles werkt zoals bedoeld.
Stap 3 – Uw configuratie controleren
Om te controleren of de veranderingen in de configuratie zijn toegepast, zult u een aantal tests uitvoeren. De eerste controleert welke multi-processing module Apache HTTP gebruikt. De tweede zal controleren of PHP de FPM manager gebruikt.
Controleer de Apache HTTP server door het volgende commando uit te voeren:
- sudo apachectl -M | grep 'mpm'
Uw uitvoer zal er als volgt uitzien:
Outputmpm_event_module (shared)
U kunt hetzelfde herhalen voor de proxy module en FastCGI:
- sudo apachectl -M | grep 'proxy'
De uitvoer ziet er als volgt uit:
Outputproxy_module (shared)proxy_fcgi_module (shared)
Wenst u de volledige lijst van modules te zien, dan kunt u het tweede deel van het commando na -M
verwijderen.
Het is nu tijd om te controleren of PHP de FastCGI Process Manager gebruikt. Om dit te doen schrijft u een heel klein PHP script dat u alle informatie met betrekking tot PHP laat zien.
Run het volgende commando om een bestand te schrijven met de volgende naam:
- sudo vi /usr/local/www/apache24/data/info.php
Voeg de volgende inhoud toe aan het bestand info.php:
<?php phpinfo(); ?>
Nu gaat u naar de URL van uw server en voegt u info.php
toe aan het eind, als volgt: http://your_server_IP_address/info.php
.
De Server API entry zal FPM/FastCGI.
Denk eraan om het info.php
bestand te verwijderen na deze controle zodat er geen informatie over de server publiekelijk bekend wordt gemaakt.
- sudo rm /usr/local/www/apache24/data/info.php
U hebt de werkstatus gecontroleerd van de MPM-module, de modules die de FastCGI afhandelen, en de afhandeling van PHP-code.
Leave a Reply