5 savjeta za poboljšanje performansi vašeg Apache web servera


Prema nedavnom izvještaju Netcraft-a (poznate internet kompanije koja između ostalih usluga pruža i statistiku korištenja web pretraživača), Apache nastavlja biti najčešće korišteni web server među web lokacijama i računarima koji se nalaze na Internetu.

Osim toga, Apache i dalje bilježi najveći rast među vrhunskim web serverima, a slijede ga Nginx i IIS. Stoga, ako ste sistemski administrator zadužen za upravljanje Apache instalacijama, morate znati kako osigurati da vaš web server radi na najbolji mogući način prema vašim (ili vašim klijentovim) potrebama.

U ovom članku ćemo razgovarati o nekoliko savjeta koji će vam pomoći da osigurate da će Apache raditi nesmetano i biti u mogućnosti da obradi broj zahtjeva koje očekujete od udaljenih klijenata.

Međutim, imajte na umu da Apache nije dizajniran sa ciljem postavljanja referentnih rekorda – ali, čak i tako, i dalje je sposoban da pruži visoke performanse u gotovo svakom slučaju upotrebe kojeg se možete sjetiti.

SAVJET #1: Uvijek održavajte Apache ažuriranim na najnoviju verziju

Podrazumeva se da je instaliranje najnovije verzije Apache-a verovatno jedna od prvih stvari koje treba da razmotrite. Od 19. novembra 2015., najnovija verzija Apachea dostupna u CentOS 7 spremištima je 2.4.6, dok je u Debianovom 2.4.10.

Međutim, može doći do nedavnog poboljšanja ili ispravke greške koja je dodana novoizdanoj stabilnoj verziji, koja je tada dostupna za preuzimanje i instalaciju iz izvora. Ovdje se također nalaze upute za kompilaciju i instalaciju – samo zapamtite da ako odaberete ovu metodu ažuriranja, možda ćete htjeti napraviti sigurnosnu kopiju vaših trenutnih konfiguracijskih datoteka/web lokacija/virtualnih hostova kao mjera opreza.

U svakom slučaju, svoju trenutno instaliranu verziju možete provjeriti na sljedeći način:

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

Kao pravilo, držite se metode ažuriranja koju daje upravitelj paketa vaše odabrane distribucije (yum update httpd ili aptitude safe-upgrade apache2, za CentOS ili Debian, odnosno) osim ako ne postoji drugi način. Najnovije napomene o izdanju možete pročitati u odjeljku Apache dokumentacija na web stranici projekta Apache HTTP servera.

SAVJET #2: Ako koristite Kernel stariji od 2.4, razmislite o nadogradnji sada

Zašto? Verzije kernela 2.4 i novije imaju po defaultu omogućen sistemski poziv jezgra sendfile. To, zauzvrat, olakšava mrežni prijenos datoteka visokih performansi (koji je poželjan u kontekstu komunikacije web server-klijent) i omogućava Apacheu da brže isporučuje statički sadržaj i sa nižim korištenjem CPU-a izvodeći istovremene operacije čitanja i slanja.

Možete pogledati svoj trenutno instalirani kernel sa:

uname -r

i uporedite ga sa najnovijim stabilnim kernelom na www.kernel.org (4.3 u vrijeme pisanja ovog teksta).

Iako je to proces koji nije namijenjen početnicima, nadogradnja vašeg kernela je zanimljiva vježba za učenje više o unutrašnjosti Linuxa.

SAVJET #3: Odaberite modul za višestruku obradu (MPM) koji najbolje funkcionira za vaš slučaj

U praksi, MPM proširuju modularnu funkcionalnost Apachea omogućavajući vam da odlučite kako konfigurirati web server da se veže na mrežne portove na mašini, prihvata zahtjeve klijenata i koristi podređene procese (i niti, alternativno) za obradu takvih zahtjeva.

Počevši od verzije 2.4, Apache nudi tri različita MPM-a na izbor, ovisno o vašim potrebama:

  1. prefork MPM koristi više podređenih procesa bez niti. Svaki proces obrađuje jednu po jednu vezu bez kreiranja zasebnih niti za svaku. Ne ulazeći u previše detalja, možemo reći da ćete htjeti koristiti ovaj MPM samo kada otklanjate greške u aplikaciji koja koristi, ili ako vaša aplikacija treba da se bavi, module koji nisu sigurni za niti kao što je mod_php.
  2. worker MPM koristi nekoliko niti po podređenom procesu, gdje svaka nit upravlja jednom po jednom vezom. Ovo je dobar izbor za servere sa velikim prometom jer omogućava da se više istovremenih konekcija rukuje sa manje RAM-a nego u prethodnom slučaju.
  3. Konačno, događaj MPM je zadani MPM u većini Apache instalacija za verzije 2.4 i novije. Sličan je radničkom MPM-u po tome što također kreira više niti po podređenom procesu, ali s prednostom: uzrokuje KeepAlive ili idle veze (dok ostaju u tom stanju) da njime rukuje jedna nit, čime se oslobađa memorija koja se može dodijeliti drugim nitima. Ovaj MPM nije pogodan za upotrebu sa modulima koji nisu sigurni za niti kao što je mod_php, za koje se umjesto toga mora koristiti zamjena kao što je PHP-FPM.

Da provjerite MPM koji koristi vaša Apache instalacija, možete učiniti:

httpd -V

Slika ispod pokazuje da ovaj web server koristi prefork MPM.

Da biste ovo promijenili, morat ćete urediti:

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

Gdje može biti mpm_event, mpm_worker ili mpm_prefork.

i dekomentirajte liniju koja učitava željeni modul na sljedeći način:

LoadModule mpm_event_module modules/mod_mpm_event.so

Napomena: Da bi događaj MPM radio u Debianu, možda ćete morati instalirati libapache2-mod-fastcgi paket iz neslobodnog spremišta.

Dodatno, za CentOS će vam trebati php-fpm (zajedno sa fcgi i mod_fcgid) dok se u Debianu to zove php5-fpm< (zajedno sa apache2-mpm-event).

Na kraju, ali ne i najmanje važno, ponovo pokrenite web server i novoinstalirani php-fpm (ili php5-fpm) servis:

Na RedHat/CentOS

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

Na Debian/Ubuntu

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

Iako možete postaviti Apache da koristi određeni MPM, ta konfiguracija se može nadjačati na bazi virtuelnog hosta na isti način kao što je ranije navedeno.

Samo ubacite odgovarajuće oznake u konfiguracijsku datoteku za svaki virtualni host i spremni ste za rad – ali provjerite koristite li samo jedan MPM po vhost-u.

Konačno, imajte na umu da se bez obzira na vašu odabranu distribuciju, php-fpm oslanja na implementaciju FastCGI, što je razlog zašto sam ranije preporučio dodatne instalacije paketa.

Za više detalja i primjera o php-fpm i kako može zajedno sa događajem MPM povećati performanse Apache-a, pogledajte zvaničnu dokumentaciju.

Ovo je ono što vidim nakon promjene zadanog MPM-a iz preforka u događaj u istom okviru prikazanom na prethodnoj slici:

U CentOS 7, morat ćete se uvjeriti da su usluge http i https omogućene putem zaštitnog zida i da mrežni interfejs(i) ) su pravilno dodani u zadanu zonu.

Na primjer:

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

Razlog zašto ovo spominjem je taj što sam nedavno doživio problem gdje su zadane postavke konfiguracije firewalld-a u oblaku VPS-a spriječile php-fpm i Apache da obrađuju php datoteke.

Kao osnovni test (siguran sam da možete smisliti kompliciranije ili stresnije), napravit ću php datoteku koja provjerava postojanje druge datoteke pod nazivom test.php u istom direktoriju dva CentOS-a 7 servera sa istim hardverskim karakteristikama i opterećenjem, ali sa različitim MPM-om. Jedan od njih će koristiti događaj, a drugi će koristiti prefork:

Ovo je php kod koji sam spremio u datoteku pod nazivom checkiffileexists.php:

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

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

Zatim ćemo pokrenuti Apache benchmark alat (ab) sa 200 istovremenih zahtjeva dok se 2000 zahtjeva ne završi:

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

Pokrenimo test i uporedimo rezultate. Obratite pažnju na statistiku performansi:

Kao što vidite, performanse servera sa događajem su veoma superiorne u odnosu na njegov prefork parnjak u svakom aspektu ovog testa.

SAVJET #4: Pametno dodijelite RAM za Apache

Možda najkritičnija hardverska stavka koju treba uzeti u obzir je količina RAM-a dodijeljena za svaki Apache proces. Iako ovo ne možete direktno kontrolirati, možete ograničiti broj podređenih procesa putem MaxRequestWorkers direktive (ranije poznate kao MaxClients u Apacheu 2.2), što će postaviti ograničenja na korištenje RAM-a od strane Apachea. Opet, možete postaviti ovu vrijednost na bazi po hostu ili virtuelnom hostu.

Da biste to učinili, trebate uzeti u obzir prosječnu količinu RAM-a koju koristi Apache, a zatim je pomnožite sa brojem MaxRequestWorkers, a to je količina memorije koja će biti dodijeljena za Apache procese. Jedna stvar koju nikada ne želite da vaš web server radi je da počnete koristiti swap, jer će to značajno smanjiti njegove performanse. Stoga, uvijek trebate držati korištenje RAM-a od strane Apachea u granicama koje možete priuštiti i nikada se ne oslanjati na zamjenu za to.

Na primjer, sljedeći blok će ograničiti broj istovremenih klijenata na 30. Ako više klijenata pogodi host, može doći do kašnjenja ili trenutnog kvara koji se lako može riješiti osvježavanjem pretraživača. Iako se ovo može smatrati nepoželjnim, zdravije je za server, a dugoročno je najbolje i za vašu web lokaciju.

Ovaj blok možete smjestiti unutar /etc/httpd/conf/httpd.conf ili /etc/apache2/apache2.conf, ovisno o tome koristite li CentOS ili Debian.

Imajte na umu da se isti princip primjenjuje na sve MPM-ove – ovdje koristim događaj da nastavim s konceptom navedenim u prethodnom savjetu:

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

U svakom slučaju, toplo se preporučuje da pogledate Apache 2.4 dokumente da vidite koje su direktive dozvoljene za vaš odabrani MPM.

SAVJET #5: Upoznajte svoje aplikacije

Kao pravilo, ne biste trebali učitavati nikakve Apache module koji nisu striktno potrebni da bi vaša aplikacija radila. Ovo će zahtijevati barem cjelokupno poznavanje aplikacija koje se pokreću na vašem serveru, posebno ako ste administrator sistema i postoji još jedan tim zadužen za razvoj.

Možete navesti trenutno učitane module sa:

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

Da ispraznite/onemogućite module u CentOSu, morat ćete komentirati red koji počinje s LoadModule (bilo u glavnoj konfiguracijskoj datoteci ili u pomoćnoj unutar /etc/httpd/conf.modules.d.

S druge strane, Debian pruža alat pod nazivom a2dismod za onemogućavanje modula i koristi se na sljedeći način:

a2dismod module_name

Da biste ga vratili:

a2enmod module_name

U svakom slučaju, ne zaboravite ponovo pokrenuti Apache kako bi promjene stupile na snagu.

Sažetak

U ovom članku smo pregledali 5 savjeta koji će vam pomoći da podesite Apache web server i povećate njegove performanse. Osim toga, trebali biste imati na umu da su optimizacija i performanse bez sigurnosti besmislene, pa ćete možda htjeti pogledati članak o instalaciji mod_pagespeed kako biste poboljšali performanse web servera i članak o savjetima za učvršćivanje Apachea na linux-console.net.

Budući da u ovom članku ne možemo adekvatno pokriti sve aspekte ove teme, možda ćete se sjetiti drugih ideja koje biste željeli podijeliti sa ostatkom zajednice. Ako je tako, slobodno nas obavijestite koristeći formu za komentare ispod.