5 tip til at forbedre ydeevnen på din Apache-webserver


Ifølge en nylig rapport fra Netcraft (et velkendt internetfirma, der blandt andet leverer statistikker til brug af webbrowser), er Apache fortsat den mest anvendte webserver blandt websteder og computere, der vender mod internettet.

Derudover oplever Apache den største vækst blandt de bedste webservere efterfulgt af Nginx og IIS. Således, hvis du er en systemadministrator med ansvar for administration af Apache-installationer, skal du vide, hvordan du kan sikre, at din webserver fungerer bedst af sin kapacitet i henhold til dine (eller din klients) behov.

I denne artikel vil vi diskutere et par tip, der hjælper dig med at sikre, at Apache kører problemfrit og er i stand til at håndtere det antal anmodninger, du forventer fra fjernklienter.

Vær dog opmærksom på, at Apache ikke var designet med det formål at sætte benchmarkrekorder - men alligevel er det stadig i stand til at levere høj ydeevne i næsten enhver brugssag, du måtte tænke på.

TIP # 1: Hold altid Apache opdateret til den nyeste version

Det siger sig selv, at det at have den nyeste version af Apache installeret sandsynligvis er en af de første ting, du skal overveje. Den 19. november 2015 er den seneste version af Apache, der er tilgængelig i CentOS 7-arkiverne, 2.4.6, hvorimod i Debian er 2.4.10.

Der kan dog være en nylig forbedring eller en fejlrettelse, der er blevet føjet til en nyudgivet stabil version, som derefter gøres tilgængelig til download og installation fra kilden. Kompilations- og installationsinstruktioner findes også her - husk bare, at hvis du vælger denne opdateringsmetode, vil du muligvis sikkerhedskopiere dine nuværende konfigurationsfiler/websteder/virtuelle værter som en sikkerhedsforanstaltning.

Under alle omstændigheder kan du kontrollere din aktuelt installerede version som følger:

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

Som en tommelfingerregel skal du holde dig til opdateringsmetoden, der leveres af pakkehåndteringen af din valgte distribution ( yum update httpd eller aptitude safe-upgrade apache2 , til CentOS eller Debian, henholdsvis) medmindre der ikke er nogen anden måde. Du kan læse de seneste udgivelsesnoter i afsnittet Apache-dokumentation på webstedet Apache HTTP-serverprojekt.

TIP # 2: Hvis du bruger en kerne ældre end 2,4, skal du overveje at opgradere nu

Hvorfor? Kerneversion 2.4 og derover har sendfile-kernesystemopkaldet aktiveret som standard. Dette letter igen højtydende netværksfiloverførsler (som ønskes i forbindelse med webserver-klientkommunikation) og gør det muligt for Apache at levere statisk indhold hurtigere og med lavere CPU-udnyttelse ved at udføre samtidige læse- og sendeoperationer.

Du kan se din aktuelt installerede kerne med:

# uname -r

og sammenlign den med den seneste stabile kerne i www.kernel.org (4.3 på tidspunktet for denne skrivning).

Selv om det er en proces, der ikke er beregnet til begyndere, er opgradering af din kerne en interessant øvelse for at lære mere om internt i Linux.

TIP # 3: Vælg det Multi-Processing Module (MPM), der fungerer bedst til din sag

I praksis udvider MPM'er Apache's modulære funktionalitet ved at lade dig beslutte, hvordan du konfigurerer webserveren til at binde sig til netværksporte på maskinen, acceptere anmodninger fra klienter og bruge underordnede processer (og tråde, alternativt) til at håndtere sådanne anmodninger.

Begyndende med version 2.4 tilbyder Apache tre forskellige MPM'er at vælge imellem afhængigt af dine behov:

  1. prefork MPM bruger flere underordnede processer uden threading. Hver proces håndterer en forbindelse ad gangen uden at oprette separate tråde til hver. Uden at gå for meget i detaljer kan vi sige, at du kun vil bruge denne MPM, når du fejler en applikation, der bruger, eller hvis din applikation skal håndtere ikke-trådsikre moduler som mod_php.
  2. arbejdstager MPM bruger flere tråde pr. underordnede processer, hvor hver tråd håndterer en forbindelse ad gangen. Dette er et godt valg for servere med høj trafik, da det gør det muligt at håndtere flere samtidige forbindelser med mindre RAM end i det foregående tilfælde.
  3. Endelig er -hændelsen MPM standard MPM i de fleste Apache-installationer til version 2.4 og nyere. Det ligner arbejdstager-MPM, fordi det også skaber flere tråde pr. Barneproces, men med en fordel: det får KeepAlive eller inaktiv forbindelser (mens de forbliver i den tilstand) håndteres af en enkelt tråd og frigør hukommelse, der tildeles andre tråde. Denne MPM er ikke egnet til brug med ikke-trådsikre moduler som mod_php, hvor en erstatning af en sådan PHP-FPM skal bruges i stedet.

For at kontrollere MPM, der bruges af din Apache-installation, kan du gøre:

# httpd -V

Billedet nedenfor viser, at netop denne webserver bruger prefork MPM.

For at ændre dette skal du redigere:

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

Hvor kan være mpm_event, mpm_worker eller mpm_prefork.

og fjern kommentar til linjen, der indlæser det ønskede modul således:

LoadModule mpm_event_module modules/mod_mpm_event.so

Bemærk: For at få begivenheden MPM til at fungere i Debian, skal du muligvis installere libapache2-mod-fastcgi-pakken fra de ikke-frie arkiver.

Derudover har du brug for php-fpm til CentOS (sammen med fcgi og mod_fcgid), mens det i Debian kaldes php5-fpm (sammen med apache2-mpm-event).

Sidst, men ikke mindst, genstart webserveren og den nyinstallerede php-fpm (eller php5-fpm) -tjeneste:

# systemctl restart httpd php-fpm && systemctl enable httpd php-fpm
# systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

Selvom du kan indstille Apache til at bruge en bestemt MPM, kan denne konfiguration tilsidesættes pr. Virtuel vært på samme måde som tidligere angivet.

Bare slip de tilsvarende tags i konfigurationsfilen for hver virtuel vært, så er du klar til at gå - men sørg for at bruge en og kun en MPM pr. Vhost.

Endelig skal du bemærke, at uanset din valgte distribution er php-fpm afhængig af implementeringen af FastCGI, hvilket er grunden til, at jeg anbefalede de ekstra pakkeinstallationer tidligere.

For flere detaljer og eksempler på php-fpm, og hvordan det kan sammen med begivenheden MPM øge Apache-ydeevnen, skal du henvise til den officielle dokumentation.

Dette er hvad jeg ser efter at have ændret standard MPM fra prefork til begivenhed i samme boks som vist i det forrige billede:

I CentOS 7 skal du sørge for, at http- og https-tjenesterne er aktiveret via firewallen, og at netværksgrænsefladen (e) tilføjes korrekt til standardzonen.

For eksempel:

# 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

Årsagen til, at jeg bringer dette op, er fordi jeg for nylig har oplevet et problem, hvor standard firewalld-konfigurationsindstillingerne i en sky VPS forhindrede php-fpm og Apache i at behandle php-filer.

Som en grundlæggende test (jeg er sikker på, at du kan tænke på mere komplicerede eller stressende), opretter jeg en php-fil, der kontrollerer eksistensen af en anden fil ved navn test.php i samme bibliotek med to CentOS 7 servere med samme hardwareegenskaber og indlæsning, men med forskellige MPM. En af dem bruger begivenhed, og den anden bruger præfork:

Dette er den php-kode, som jeg har gemt i en fil med navnet checkiffileexists.php :

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

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

Derefter kører vi Apache-benchmarkværktøjet (ab) med 200 samtidige anmodninger, indtil 2000 anmodninger er gennemført:

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

Lad os køre testen og sammenligne resultaterne. Vær opmærksom på præstationsstatistikken:

Som du kan se, er ydelsen til serveren med begivenhed meget bedre end dens præfork-modstykke i alle aspekter af denne test.

TIP # 4: Tildel RAM klogt til Apache

Måske er det mest kritiske hardwareelement, der skal tages i betragtning, mængden af RAM, der er allokeret til hver Apache-proces. Mens du ikke kan kontrollere dette direkte, kan du begrænse antallet af underordnede processer gennem MaxRequestWorkers-direktivet (tidligere kendt som MaxClients i Apache 2.2), hvilket vil sætte grænser for RAM-brugen af Apache. Igen kan du indstille denne værdi pr. Vært eller pr. Virtuel vært.

For at gøre dette skal du være opmærksom på den gennemsnitlige mængde RAM, der bruges af Apache, derefter multiplicere det med antallet af MaxRequestWorkers, og det er den mængde hukommelse, der tildeles til Apache-processer. En ting, du aldrig vil have, at din webserver skal gøre, er at begynde at bruge swap, da det vil reducere dens ydeevne betydeligt. Således skal du altid holde brugen af RAM fra Apache inden for de grænser, du har råd til, og aldrig stole på at bytte til det.

For eksempel vil den følgende blok begrænse antallet af samtidige klienter til 30. Hvis flere klienter rammer værten, kan de opleve en forsinkelse eller en kortvarig fejl, der let kan løses ved at opdatere browseren. Selvom dette kan betragtes som uønsket, er det sundere for serveren og i det lange løb også bedst for dit websted.

Du kan placere denne blok inde i /etc/httpd/conf/httpd.conf eller /etc/apache2/apache2.conf , afhængigt af om du bruger CentOS eller Debian.

Bemærk, at det samme princip gælder for alle MPM'er - jeg bruger begivenhed her for at fortsætte med konceptet beskrevet i forrige tip:

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

Under alle omstændigheder anbefales det stærkt, at du henviser til Apache 2.4-dokumenterne for at se, hvilke direktiver der er tilladt for din valgte MPM.

TIP # 5: Kend dine applikationer

Som en tommelfingerregel skal du ikke indlæse Apache-moduler, der ikke er strengt nødvendige for, at din applikation fungerer. Dette kræver i det mindste en samlet viden om de applikationer, der kører på din server, især hvis du er systemadministrator, og der er et andet team med ansvar for udvikling.

Du kan liste de aktuelt indlæste moduler med:

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

For at aflæsse/deaktivere moduler i CentOS skal du kommentere linjen, der begynder med LoadModule (enten i hovedkonfigurationsfilen eller i en hjælpelinje inde i /etc/httpd/conf.modules.d.

På den anden side leverer Debian et værktøj kaldet a2dismod til at deaktivere moduler og bruges som følger:

# a2dismod module_name

Sådan aktiveres det igen:

# a2enmod module_name

I begge tilfælde skal du huske at genstarte Apache for at ændringerne skal træde i kraft.

Resume

I denne artikel har vi gennemgået 5 tip, der hjælper dig med at indstille Apache-webserveren og øge dens ydeevne. Derudover skal du huske, at optimering og ydeevne uden sikkerhed er meningsløs, så du vil muligvis også henvise til artiklen om Apache-hærdningstips i linux-console.net.

Da vi ikke i tilstrækkelig grad kan dække alle aspekterne af dette emne i denne artikel, vil du måske tænke på andre ideer, som du gerne vil dele med resten af samfundet. I så fald er du velkommen til at fortælle os ved hjælp af nedenstående kommentarformular.