5 savjeta za poboljšanje performansi vašeg Apache web poslužitelja


Prema nedavnom izvješću Netcrafta (poznate internetske tvrtke koja između ostalih usluga pruža statistiku korištenja web preglednika), Apache je i dalje najčešće korišteni web poslužitelj među stranicama i računalima okrenutim prema Internetu.

Osim toga, Apache nastavlja doživljavati najveći rast među vrhunskim web poslužiteljima, a slijede ga Nginx i IIS. Dakle, ako ste administrator sustava zadužen za upravljanje Apache instalacijama, trebate znati kako osigurati da vaš web poslužitelj radi najbolje što može u skladu s vašim (ili klijentovim) potrebama.

U ovom članku raspravljat ćemo o nekoliko savjeta koji će vam pomoći osigurati da Apache radi glatko i da može obraditi broj zahtjeva koji očekujete od udaljenih klijenata.

Međutim, imajte na umu da Apache nije dizajniran s ciljem postavljanja benchmark rekorda – ali, unatoč tome, i dalje je sposoban pružiti visoku izvedbu u gotovo svim slučajevima korištenja kojih se možete sjetiti.

SAVJET #1: Apache uvijek ažurirajte na najnoviju verziju

Podrazumijeva se da je instaliranje najnovije verzije Apachea vjerojatno jedna od prvih stvari koje morate uzeti u obzir. Od 19. studenog 2015. najnovija verzija Apachea dostupna u spremištima CentOS 7 je 2.4.6, dok je u Debianovim >2.4.10.

Međutim, može doći do nedavnog poboljšanja ili ispravka bugova koji su dodani novoobjavljenoj stabilnoj verziji, koja je tada dostupna za preuzimanje i instalaciju iz izvora. Upute za kompilaciju i instalaciju također su navedene ovdje – samo upamtite da ako odaberete ovu metodu ažuriranja, možda ćete htjeti sigurnosno kopirati svoje trenutne konfiguracijske datoteke/stranice/virtualne hostove kao mjeru 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 nudi 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 Documentation na web stranici projekta Apache HTTP poslužitelja.

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

Zašto? Verzije kernela 2.4 i novije imaju sistemski poziv jezgre sendfile omogućen prema zadanim postavkama. To zauzvrat olakšava mrežne prijenose datoteka visokih performansi (koji su poželjni u kontekstu komunikacije između web poslužitelja i klijenta) i omogućuje Apacheu da isporuči statički sadržaj brže i uz manje korištenje CPU-a izvođenjem simultanih operacija čitanja i slanja.

Svoju trenutno instaliranu jezgru možete vidjeti pomoću:

uname -r

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

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

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

U praksi, MPM-ovi proširuju modularnu funkcionalnost Apachea dopuštajući vam da odlučite kako konfigurirati web poslužitelj da se veže na mrežne priključke na računalu, prihvaća zahtjeve od 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 za odabir, 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 stvaranja zasebnih niti za svaku. Ne ulazeći u previše detalja, možemo reći da ćete htjeti koristiti ovaj MPM samo kada ispravljate pogreške u aplikaciji koja koristi, ili ako vaša aplikacija mora raditi s modulima koji nisu sigurni za niti kao što je mod_php.
  2. Radnički MPM koristi nekoliko niti po procesu djeteta, gdje svaka nit rukuje jednom po jednom vezom. Ovo je dobar izbor za poslužitelje s velikim prometom jer omogućuje rukovanje više istodobnih veza s manje RAM-a nego u prethodnom slučaju.
  3. Konačno, event MPM je zadani MPM u većini Apache instalacija za verzije 2.4 i novije. Sličan je radnom MPM-u po tome što također stvara više niti po procesu djeteta, ali s prednošću: uzrokuje KeepAlive ili idle veze (dok ostaju u tom stanju) da njima rukuje jedna nit, čime se oslobađa memorija koja se može dodijeliti drugim nitima. Ovaj MPM nije prikladan za korištenje s modulima koji nisu sigurni za niti kao što je mod_php, za koje se umjesto njega mora koristiti zamjena kao što je PHP-FPM.

Da biste provjerili MPM koji koristi vaša instalacija Apachea, možete učiniti sljedeće:

httpd -V

Slika ispod pokazuje da ovaj konkretni web poslužitelj koristi prefork MPM.

Da biste to 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 odkomentirajte redak koji učitava željeni modul ovako:

LoadModule mpm_event_module modules/mod_mpm_event.so

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

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

Na kraju, ali ne manje važno, ponovno pokrenite web poslužitelj i novo instaliranu uslugu php-fpm (ili php5-fpm):

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 se konfiguracija može nadjačati na bazi po virtualnom hostu na isti način kao što je ranije navedeno.

Samo ispustite odgovarajuće oznake u konfiguracijsku datoteku za svaki virtualni host i spremni ste za rad – ali budite sigurni da koristite jedan i samo jedan MPM po vhostu.

Na kraju, imajte na umu da se, bez obzira na 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 s događajem MPM povećati izvedbu Apachea, trebali biste pogledati službenu dokumentaciju.

Ovo je ono što vidim nakon promjene zadanog MPM-a iz prefork u event u istom okviru prikazanom na prethodnoj slici:

U CentOS 7 morat ćete provjeriti jesu li usluge http i https omogućene putem vatrozida i jesu li mrežna sučelja ) ispravno dodaju 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 u kojem su zadane konfiguracijske postavke vatrozida u VPS-u u oblaku spriječile php-fpm i Apache u obradi php datoteka.

Kao osnovni test (siguran sam da se možete sjetiti kompliciranijih ili stresnijih), izradit ću php datoteku koja provjerava postojanje druge datoteke pod nazivom test.php u istom direktoriju dvaju CentOS-a 7 poslužitelja s istim hardverskim karakteristikama i opterećenjem, ali s različitim MPM-om. Jedan od njih će koristiti događaj, a drugi će koristiti prefork:

Ovo je php kôd 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) s 200 istovremenih zahtjeva dok se ne izvrši 2000 zahtjeva:

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

Pokrenimo test i usporedimo rezultate. Obratite pozornost na statistiku izvedbe:

Kao što vidite, izvedba poslužitelja s događajem znatno je bolja od njegovog prefork pandana u svakom aspektu ovog testa.

SAVJET #4: Mudro dodijelite RAM za Apache

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

Da biste to učinili, trebali biste zabilježiti prosječnu količinu RAM-a koju koristi Apache, zatim je pomnožiti s brojem MaxRequestWorkers, a to je količina memorije koja će biti dodijeljena za Apache procese. Jedna stvar koju nikada ne želite da vaš web poslužitelj učini je da počne koristiti swap jer će to značajno smanjiti njegovu izvedbu. Stoga biste uvijek trebali držati upotrebu RAM-a od strane Apachea unutar granica koje si možete priuštiti i nikada se ne oslanjati na swap za to.

Na primjer, sljedeći blok će ograničiti broj istodobnih 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 preglednika. Iako se to može smatrati nepoželjnim, zdravije je za poslužitelj, a dugoročno najbolje i za vašu stranicu.

Ovaj blok možete postaviti 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 kako bih nastavio 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, preporučuje se da pogledate dokumente Apache 2.4 kako biste vidjeli koje su direktive dopuštene za vaš odabrani MPM.

SAVJET #5: Upoznajte svoje aplikacije

Kao pravilo, ne biste trebali učitavati Apache module koji nisu nužno potrebni za rad vaše aplikacije. To će zahtijevati barem opće poznavanje aplikacija koje se izvode na vašem poslužitelju, posebno ako ste administrator sustava i postoji još jedan tim zadužen za razvoj.

Možete ispisati trenutno učitane module sa:

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

Za učitavanje/onemogućavanje modula u CentOS-u morat ćete komentirati redak koji počinje s LoadModule (bilo u glavnoj konfiguracijskoj datoteci ili u pomoćnoj unutar /etc/httpd/conf.modules.d.

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

a2dismod module_name

Da biste ga ponovno omogućili:

a2enmod module_name

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

Sažetak

U ovom smo članku pregledali 5 savjeta koji će vam pomoći u podešavanju web poslužitelja Apache i poboljšanju njegovih performansi. Osim toga, trebali biste upamtiti da su optimizacija i izvedba bez sigurnosti besmisleni, pa biste također trebali pogledati instalacijski mod_pagespeed za poboljšanje performansi web poslužitelja i članak o učvršćivanju 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 s ostatkom zajednice. Ako je tako, slobodno nam javite putem obrasca za komentare u nastavku.