Zoeken op website

5 tips om de prestaties van uw Apache-webserver te verbeteren


Volgens een recent rapport van Netcraft (een bekend internetbedrijf dat onder andere statistieken over het gebruik van webbrowsers levert), blijft Apache de meest gebruikte webserver onder sites en internetcomputers.

Bovendien blijft Apache de grootste groei ervaren onder de beste webservers, gevolgd door Nginx en IIS. Als u dus een systeembeheerder bent die verantwoordelijk is voor het beheer van Apache-installaties, moet u weten hoe u ervoor kunt zorgen dat uw webserver optimaal presteert, afhankelijk van uw behoeften (of die van uw klant).

In dit artikel bespreken we een paar tips die u zullen helpen ervoor te zorgen dat Apache soepel werkt en het aantal verzoeken kan verwerken dat u van externe clients verwacht.

Houd er echter rekening mee dat Apache niet is ontworpen met het doel benchmarkrecords te vestigen, maar toch is het nog steeds in staat hoge prestaties te leveren in vrijwel elk gebruiksscenario dat u maar kunt bedenken.

TIP #1: Zorg ervoor dat Apache altijd up-to-date is naar de nieuwste versie

Het spreekt voor zich dat het installeren van de nieuwste versie van Apache waarschijnlijk een van de eerste dingen is waar u rekening mee moet houden. Vanaf 19 november 2015 is de nieuwste versie van Apache die beschikbaar is in de opslagplaatsen van CentOS 7 2.4.6, terwijl dat in Debian is >2.4.10.

Er kan echter een recente verbetering of een bugfix zijn toegevoegd aan een nieuw uitgebrachte stabiele versie, die vervolgens beschikbaar wordt gemaakt om vanaf de broncode te downloaden en te installeren. Compilatie- en installatie-instructies worden hier ook gegeven. Houd er rekening mee dat als u voor deze updatemethode kiest, u wellicht uit voorzorg een back-up van uw huidige configuratiebestanden/sites/virtuele hosts wilt maken.

In ieder geval kunt u uw momenteel geïnstalleerde versie als volgt controleren:

httpd -v               [On RedHat/CentOS based systems]
apache2 –v             [On Debian/Ubuntu based systems] 

Als vuistregel: houd u aan de updatemethode die wordt aangeboden door de pakketbeheerder van de door u gekozen distributie (yum update httpd of aptitude safe-upgrade apache2, voor CentOS of Debian, respectievelijk) tenzij het niet anders kan. U kunt de nieuwste releaseopmerkingen lezen in de sectie Apache-documentatie op de Apache HTTP-serverprojectwebsite.

TIP #2: Als u een kernel gebruikt die ouder is dan 2.4, overweeg dan nu een upgrade uit te voeren

Waarom? Bij kernelversies 2.4 en hoger is de kernelsysteemaanroep sendfile standaard ingeschakeld. Dat vergemakkelijkt op zijn beurt hoogwaardige netwerkbestandsoverdrachten (die gewenst zijn in de context van webserver-clientcommunicatie) en stelt Apache in staat om statische inhoud sneller en met een lager CPU-gebruik te leveren door gelijktijdige lees- en verzendbewerkingen uit te voeren.

Je kunt je momenteel geïnstalleerde kernel bekijken met:

uname -r

en vergelijk het met de nieuwste stabiele kernel in www.kernel.org (4.3 op het moment van schrijven).

Hoewel het een proces is dat niet bedoeld is voor beginners, is het upgraden van je kernel een interessante oefening om meer te leren over de interne werking van Linux.

TIP #3: Kies de Multi-Processing Module (MPM) die het beste bij uw situatie past

In de praktijk breiden MPM's de modulaire functionaliteit van Apache uit door u te laten beslissen hoe u de webserver configureert om te binden aan netwerkpoorten op de machine, verzoeken van clients te accepteren en onderliggende processen (en threads, alternatief) om dergelijke verzoeken te behandelen.

Vanaf versie 2.4 biedt Apache drie verschillende MPM's waaruit u kunt kiezen, afhankelijk van uw behoeften:

  1. De prefork MPM gebruikt meerdere onderliggende processen zonder threading. Elk proces verwerkt één verbinding tegelijk zonder voor elke verbinding een aparte thread te creëren. Zonder al te veel in detail te treden, kunnen we zeggen dat u deze MPM alleen wilt gebruiken bij het debuggen van een applicatie die gebruikmaakt van, of als uw applicatie moet omgaan met, niet-thread-safe modules zoals mod_php.
  2. De worker MPM gebruikt verschillende threads per onderliggende processen, waarbij elke thread één verbinding tegelijk afhandelt. Dit is een goede keuze voor servers met veel verkeer, omdat hierdoor meer gelijktijdige verbindingen kunnen worden afgehandeld met minder RAM dan in het vorige geval.
  3. Ten slotte is de event MPM de standaard MPM in de meeste Apache-installaties voor versie 2.4 en hoger. Het is vergelijkbaar met de worker-MPM omdat het ook meerdere threads per onderliggend proces creëert, maar met een voordeel: het veroorzaakt KeepAlive of inactieve verbindingen (terwijl ze in die staat blijven) te worden afgehandeld door een enkele thread, waardoor geheugen wordt vrijgemaakt dat aan andere threads kan worden toegewezen. Deze MPM is niet geschikt voor gebruik met niet-thread-safe modules zoals mod_php, waarvoor in plaats daarvan een vervanging zoals een PHP-FPM moet worden gebruikt.

Om de MPM te controleren die door uw Apache-installatie wordt gebruikt, kunt u het volgende doen:

httpd -V

De onderstaande afbeelding laat zien dat deze specifieke webserver de prefork MPM gebruikt.

Om dit te wijzigen, moet u het volgende bewerken:

/etc/httpd/conf.modules.d/00-mpm.conf          [On RedHat/CentOS based systems]
/etc/apache2/mods-available/<mpm>.load   [On Debian/Ubuntu based systems]

Waarbij mpm_event, mpm_worker of mpm_prefork kan zijn.

en ontkoppel de regel die de gewenste module laadt als volgt:

LoadModule mpm_event_module modules/mod_mpm_event.so

Opmerking: Om de gebeurtenis MPM in Debian te laten werken, moet u mogelijk het libapache2-mod-fastcgi pakket installeren van het niet-gratis opslagplaatsen.

Bovendien heb je voor CentOS php-fpm nodig (samen met fcgi en mod_fcgid), terwijl dit in Debian php5-fpm< wordt genoemd (samen met apache2-mpm-event).

Als laatste, maar daarom niet minder belangrijk, start u de webserver en de nieuw geïnstalleerde php-fpm (of php5-fpm) service opnieuw op:

Op RedHat/CentOS

systemctl restart httpd php-fpm && systemctl enable httpd php-fpm

Op Debian/Ubuntu

systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

Hoewel u Apache kunt instellen om een specifieke MPM te gebruiken, kan die configuratie per virtuele host worden overschreven op dezelfde manier als eerder aangegeven.

Plaats gewoon de bijbehorende tags in het configuratiebestand voor elke virtuele host en u bent klaar om aan de slag te gaan. Zorg er wel voor dat u slechts één MPM per vhost gebruikt.

Houd er ten slotte rekening mee dat, ongeacht de door u gekozen distributie, php-fpm afhankelijk is van de implementatie van FastCGI, wat de reden is waarom ik eerder de aanvullende pakketinstallaties heb aanbevolen.

Voor meer details en voorbeelden over php-fpm en hoe dit samen met de gebeurtenis MPM de prestaties van Apache kan verbeteren, kun je de officiële documentatie raadplegen.

Dit is wat ik zie nadat ik de standaard MPM heb gewijzigd van prefork naar event in hetzelfde vak als in de vorige afbeelding:

In CentOS 7 moet u ervoor zorgen dat de services http en https zijn ingeschakeld via de firewall en dat de netwerkinterface(s) ) correct zijn toegevoegd aan de standaardzone.

Bijvoorbeeld:

firewall-cmd --zone=internal --add-interface=tun6to4 
firewall-cmd --zone=internal --add-interface=tun6to4 --permanent 
firewall-cmd --set-default-zone=internal 
firewall-cmd --add-service=http 
firewall-cmd --add-service=https 
firewall-cmd --add-service=http --permanent 
firewall-cmd --add-service=https --permanent 
firewall-cmd --reload

De reden waarom ik dit ter sprake breng is omdat ik onlangs een probleem heb ondervonden waarbij de standaard firewall-configuratie-instellingen in een cloud-VPS verhinderden dat php-fpm en Apache php-bestanden verwerkten.

Als basistest (je kunt vast wel ingewikkelder of stressvollere tests bedenken) zal ik een php-bestand maken dat het bestaan controleert van een ander bestand met de naam test.php in dezelfde directory van twee CentOS 7 servers met dezelfde hardwarekenmerken en belasting maar met verschillende MPM. Een van hen zal event gebruiken en de andere zal prefork gebruiken:

Dit is de php-code die ik heb opgeslagen in een bestand met de naam checkiffileexists.php:

<?php
$filename = 'test.php';

if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
    echo "The file $filename does not exist";
}
?>

Vervolgens voeren we de Apache-benchmarktool (ab) uit met 200 gelijktijdige verzoeken totdat 2000 verzoeken zijn voltooid:

ab -k -c 100 -n 2000 localhost/checkiffileexists.php

Laten we de test uitvoeren en de resultaten vergelijken. Let op de prestatiestatistieken:

Zoals u kunt zien, zijn de prestaties van de server met gebeurtenis in elk aspect van deze test zeer superieur aan die van zijn prefork tegenhanger.

TIP #4: Wijs RAM verstandig toe voor Apache

Misschien wel het meest kritische hardware-item waarmee rekening moet worden gehouden, is de hoeveelheid RAM die aan elk Apache-proces wordt toegewezen. Hoewel u dit niet direct kunt controleren, kunt u het aantal onderliggende processen wel beperken via de MaxRequestWorkers richtlijn (voorheen bekend als MaxClients in Apache 2.2), wat beperkingen zal stellen aan het RAM-gebruik door Apache. Nogmaals, u kunt deze waarde per host of per virtuele host instellen.

Om dit te doen, moet u de gemiddelde hoeveelheid RAM noteren die door Apache wordt gebruikt, en deze vervolgens vermenigvuldigen met het aantal MaxRequestWorkers, en dat is de hoeveelheid geheugen die zal worden toegewezen voor Apache-processen. Eén ding dat u nooit wilt dat uw webserver doet, is swap gaan gebruiken, omdat dit de prestaties aanzienlijk zal verminderen. Daarom moet u het gebruik van RAM door Apache altijd binnen de grenzen houden die u zich kunt veroorloven en er nooit op vertrouwen dat u daarvoor ruilt.

Het volgende blok beperkt bijvoorbeeld het aantal gelijktijdige clients tot 30. Als meer clients de host raken, kunnen ze een vertraging of een tijdelijke storing ervaren die eenvoudig kan worden opgelost door de browser te vernieuwen. Hoewel dit als onwenselijk kan worden beschouwd, is het gezonder voor de server en op de lange termijn ook het beste voor uw site.

U kunt dit blok binnen /etc/httpd/conf/httpd.conf of /etc/apache2/apache2.conf plaatsen, afhankelijk van of u CentOS of Debian gebruikt.

Houd er rekening mee dat hetzelfde principe van toepassing is op alle MPM's. Ik gebruik hier 'Event' om door te gaan met het concept dat in de vorige tip is beschreven:

<IfModule mpm_event_module>
    StartServers 3
    MinSpareThreads          25
    MaxSpareThreads          75
    ThreadLimit                      64
    ThreadsPerChild          25
    MaxRequestWorkers    30
    MaxConnectionsPerChild    1000
</IfModule>

In ieder geval wordt het ten zeerste aanbevolen dat u de Apache 2.4-documentatie raadpleegt om te zien welke richtlijnen zijn toegestaan voor de door u gekozen MPM.

TIP #5: Ken uw toepassingen

Als vuistregel geldt dat u geen Apache-modules moet laden die niet strikt noodzakelijk zijn om uw applicatie te laten werken. Dit vereist op zijn minst algemene kennis van de applicaties die op uw server draaien, vooral als u een systeembeheerder bent en er een ander team is dat verantwoordelijk is voor de ontwikkeling.

U kunt de momenteel geladen modules weergeven met:

httpd -M          [On RedHat/CentOS based systems]
apache2ctl -M     [On Debian/Ubuntu based systems]

Om modules in CentOS te verwijderen/uit te schakelen, moet u commentaar geven op de regel die begint met LoadModule (in het hoofdconfiguratiebestand of in een hulpbestand binnen /etc/httpd/conf.modules.d.

Aan de andere kant biedt Debian een tool genaamd a2dismod om modules uit te schakelen en wordt als volgt gebruikt:

a2dismod module_name

Om het weer in te schakelen:

a2enmod module_name

Vergeet in beide gevallen niet om Apache opnieuw op te starten, zodat de wijzigingen van kracht worden.

Samenvatting

In dit artikel hebben we 5 tips besproken die u zullen helpen de Apache-webserver af te stemmen en de prestaties ervan te verbeteren. Bovendien moet u onthouden dat optimalisatie en prestaties zonder beveiliging zinloos zijn, dus u kunt ook het artikel install mod_pagespeed raadplegen om de prestaties van de webserver te verbeteren en het artikel Apache-hardeningtips op linux-console.net.

Omdat we in dit artikel niet alle aspecten van dit onderwerp adequaat kunnen behandelen, bedenkt u misschien andere ideeën die u graag met de rest van de gemeenschap wilt delen. Als dat zo is, laat het ons dan gerust weten via het onderstaande reactieformulier.