5 tips for å øke ytelsen til Apache Web Server


I følge en fersk rapport fra Netcraft (et kjent Internett-selskap som blant annet tilbyr statistikk om nettleserbruk), fortsetter Apache å være den mest brukte nettserveren blant nettsteder og datamaskiner som vender mot Internett.

I tillegg fortsetter Apache å oppleve den største veksten blant de beste webserverne, etterfulgt av Nginx og IIS. Derfor, hvis du er en systemadministrator med ansvar for å administrere Apache-installasjoner, må du vite hvordan du sørger for at webserveren din yter best mulig kapasitet i henhold til dine (eller kundens) behov.

I denne artikkelen vil vi diskutere noen få tips som vil hjelpe deg å sikre at Apache vil kjøre problemfritt og være i stand til å håndtere antallet forespørsler du forventer fra eksterne klienter.

Vær imidlertid oppmerksom på at Apache ikke ble designet med mål om å sette standardrekorder – men likevel er den i stand til å gi høy ytelse i nesten alle brukstilfeller du kan tenke deg.

TIPS #1: Hold alltid Apache oppdatert til den nyeste versjonen

Det sier seg selv at det å ha den nyeste versjonen av Apache installert sannsynligvis er noe av det første du må vurdere. Fra 19. november 2015 er den nyeste versjonen av Apache tilgjengelig i CentOS 7-repositoriene 2.4.6, mens i Debians er >2.4.10.

Det kan imidlertid være en nylig forbedring eller en feilretting som er lagt til en nylig utgitt stabil versjon, som deretter gjøres tilgjengelig for nedlasting og installasjon fra kilden. Kompilerings- og installasjonsinstruksjoner er også gitt her - bare husk at hvis du velger denne oppdateringsmetoden, vil du kanskje sikkerhetskopiere gjeldende konfigurasjonsfiler/nettsteder/virtuelle verter som en forholdsregel.

Uansett kan du sjekke din installerte versjon som følger:

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

Som en tommelfingerregel, hold deg til oppdateringsmetoden gitt av pakkebehandleren for din valgte distribusjon (yum update httpd eller aptitude safe-upgrade apache2, for CentOS eller Debian, henholdsvis) med mindre det ikke er noen annen måte. Du kan lese de siste versjonsmerknadene i Apache Documentation-delen på nettsiden til Apache HTTP-serverprosjektet.

TIPS #2: Hvis du bruker en kjerne eldre enn 2.4, bør du vurdere å oppgradere nå

Hvorfor? Kjerneversjoner 2.4 og nyere har sendfil-kjernen-systemkallet aktivert som standard. Det letter igjen nettverksfiloverføringer med høy ytelse (som ønskes i sammenheng med nettserver-klient-kommunikasjon) og gjør det mulig for Apache å levere statisk innhold raskere og med lavere CPU-utnyttelse ved å utføre samtidige lese- og sendeoperasjoner.

Du kan se din installerte kjerne med:

uname -r

og sammenlign den med den siste stabile kjernen i www.kernel.org (4.3 når dette skrives).

Selv om det er en prosess som ikke er ment for nybegynnere, er oppgradering av kjernen en interessant øvelse for å lære mer om det interne i Linux.

TIPS #3: Velg den multiprosesseringsmodulen (MPM) som fungerer best for ditt tilfelle

I praksis utvider MPM-er den modulære funksjonaliteten til Apache ved å la deg bestemme hvordan du skal konfigurere webserveren til å binde seg til nettverksporter på maskinen, akseptere forespørsler fra klienter og bruke underordnede prosesser (og tråder, alternativt) for å håndtere slike forespørsler.

Fra og med versjon 2.4 tilbyr Apache tre forskjellige MPM-er å velge mellom, avhengig av dine behov:

  1. prefork MPM bruker flere underordnede prosesser uten tråding. Hver prosess håndterer én tilkobling om gangen uten å lage separate tråder for hver. Uten å gå i for mye detaljer, kan vi si at du vil ønske å bruke denne MPM bare når du feilsøker en applikasjon som bruker, eller hvis applikasjonen din trenger å håndtere, ikke-trådsikre moduler som mod_php.
  2. worker MPM bruker flere tråder per underordnede prosesser, der hver tråd håndterer én tilkobling om gangen. Dette er et godt valg for høytrafikkservere ettersom det lar flere samtidige tilkoblinger håndteres med mindre RAM enn i forrige tilfelle.
  3. Til slutt, event MPM er standard MPM i de fleste Apache-installasjoner for versjon 2.4 og nyere. Den ligner på arbeider-MPM ved at den også oppretter flere tråder per underordnet prosess, men med en fordel: den forårsaker KeepAlive- eller uaktive-forbindelser (mens de forblir i den tilstanden) skal håndteres av en enkelt tråd, og dermed frigjøre minne som kan allokeres til andre tråder. Denne MPM er ikke egnet for bruk med ikke-trådsikre moduler som mod_php, som en erstatning slik PHP-FPM må brukes i stedet.

For å sjekke MPM som brukes av Apache-installasjonen, kan du gjøre:

httpd -V

Bildet nedenfor viser at denne nettserveren bruker prefork MPM.

For å endre dette, må 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 avkommenter linjen som laster den ønskede modulen slik:

LoadModule mpm_event_module modules/mod_mpm_event.so

Merk: For å få arrangementet MPM til å fungere i Debian, må du kanskje installere pakken libapache2-mod-fastcgi fra den ikke-gratis depoter.

I tillegg, for CentOS trenger du php-fpm (sammen med fcgi og mod_fcgid), mens det i Debian heter php5-fpm< (sammen med apache2-mpm-event).

Sist, men ikke minst, start nettserveren på nytt og den nylig installerte php-fpm (eller php5-fpm) tjenesten:

På RedHat/CentOS

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

På Debian/Ubuntu

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

Selv om du kan sette Apache til å bruke en spesifikk MPM, kan den konfigurasjonen overstyres på en per-virtuell vertsbasis på samme måte som angitt tidligere.

Bare slipp de tilsvarende taggene i konfigurasjonsfilen for hver virtuelle vert, og du er klar til å gå – men sørg for at du bruker én og bare én MPM per vhost.

Til slutt, vær oppmerksom på at uavhengig av din valgte distribusjon, php-fpm er avhengig av implementeringen av FastCGI, som er grunnen til at jeg anbefalte tilleggspakkeinstallasjonene tidligere.

For flere detaljer og eksempler på php-fpm og hvordan det sammen med arrangementet MPM kan øke ytelsen til Apache, bør du se den offisielle dokumentasjonen.

Dette er hva jeg ser etter å ha endret standard MPM fra prefork til hendelse i samme boks som vist i forrige bilde:

I CentOS 7 må du sørge for at http- og https-tjenestene er aktivert gjennom brannmuren, og at nettverksgrensesnittet(e) ) er riktig lagt til standardsonen.

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

Grunnen til at jeg tar dette opp er fordi jeg nylig opplevde et problem der standard brannmurkonfigurasjonsinnstillinger i en sky-VPS forhindret php-fpm og Apache fra å behandle php-filer.

Som en grunnleggende test (jeg er sikker på at du kan tenke på mer kompliserte eller stressende), vil jeg lage en php-fil som sjekker eksistensen av en annen fil kalt test.php i samme katalog med to CentOS 7 servere med samme maskinvareegenskaper og belastning, men med forskjellig MPM. En av dem vil bruke hendelse og den andre vil bruke pregaffel:

Dette er php-koden som jeg har lagret i en fil som heter checkiffileexists.php:

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

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

Deretter kjører vi Apache benchmark-verktøyet (ab) med 200 samtidige forespørsler til 2000 forespørsler er fullført:

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

La oss kjøre testen og sammenligne resultatene. Vær oppmerksom på resultatstatistikken:

Som du kan se, er ytelsen til serveren med hendelse svært overlegen dens prefork motpart i alle aspekter av denne testen.

TIPS #4: Tildel RAM klokt for Apache

Det kanskje mest kritiske maskinvareelementet som må tas i betraktning er mengden RAM som er tildelt for hver Apache-prosess. Selv om du ikke kan kontrollere dette direkte, kan du begrense antallet underordnede prosesser gjennom MaxRequestWorkers-direktivet (tidligere kjent som MaxClients i Apache 2.2), som vil sette begrensninger på RAM-bruken til Apache. Igjen kan du angi denne verdien per vert eller per virtuell vert.

For å gjøre dette, bør du legge merke til den gjennomsnittlige mengden RAM som brukes av Apache, og deretter multiplisere den med antall MaxRequestWorkers, og det er mengden minne som vil bli tildelt for Apache-prosesser. En ting du aldri vil at webserveren skal gjøre er å begynne å bruke swap, da det vil redusere ytelsen betydelig. Derfor bør du alltid holde Apaches bruk av RAM innenfor grensene du har råd til og aldri stole på å bytte for det.

For eksempel vil den følgende blokken begrense antallet samtidige klienter til 30. Hvis flere klienter treffer verten, kan de oppleve en forsinkelse eller en kortvarig feil som enkelt kan løses ved å oppdatere nettleseren. Selv om dette kan anses som uønsket, er det sunnere for serveren og i det lange løp best for nettstedet ditt også.

Du kan plassere denne blokken i /etc/httpd/conf/httpd.conf eller /etc/apache2/apache2.conf, avhengig av om du bruker CentOS eller Debian.

Vær oppmerksom på at det samme prinsippet gjelder for alle MPM – jeg bruker event her for å fortsette med konseptet som er skissert i forrige tips:

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

Uansett anbefales det på det sterkeste at du refererer til Apache 2.4-dokumentene for å se hvilke direktiver som er tillatt for din valgte MPM.

TIPS #5: Kjenn applikasjonene dine

Som en tommelfingerregel bør du ikke laste inn noen Apache-moduler som strengt tatt ikke er nødvendige for at applikasjonen din skal fungere. Dette vil kreve minst en generell kunnskap om applikasjonene som kjører på serveren din, spesielt hvis du er systemadministrator og det er et annet team som er ansvarlig for utviklingen.

Du kan liste de aktuelle modulene med:

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

For å laste ut/deaktivere moduler i CentOS, må du kommentere linjen som begynner med LoadModule (enten i hovedkonfigurasjonsfilen eller i en hjelpefil i /etc/httpd/conf.modules.d.

På den annen side gir Debian et verktøy kalt a2dismod for å deaktivere moduler og brukes som følger:

a2dismod module_name

For å aktivere den tilbake:

a2enmod module_name

I begge tilfeller, husk å starte Apache på nytt for at endringene skal tre i kraft.

Sammendrag

I denne artikkelen har vi gjennomgått 5 tips som vil hjelpe deg å justere Apache-nettserveren og øke ytelsen. I tillegg bør du huske at optimalisering og ytelse uten sikkerhet er meningsløst, så det kan være lurt å referere til install mod_pagespeed for å forbedre nettserverytelsen og Apache-herdingtips-artikkelen i linux-console.net også.

Siden vi ikke kan dekke alle aspektene ved dette emnet tilstrekkelig i denne artikkelen, vil du kanskje tenke på andre ideer du vil dele med resten av fellesskapet. I så fall, gi oss gjerne beskjed ved å bruke kommentarskjemaet nedenfor.