5 patarimai, kaip padidinti „Apache“ žiniatinklio serverio našumą


Remiantis naujausia „Netcraft“ (gerai žinomos interneto įmonės, kuri, be kitų paslaugų, teikianti žiniatinklio naršyklės naudojimo statistiką, ataskaitą), Apache ir toliau yra plačiausiai naudojamas žiniatinklio serveris tarp svetainių ir kompiuterių, kuriuose veikia internetas.

Be to, Apache ir toliau patiria didžiausią augimą tarp geriausių žiniatinklio serverių, po to seka Nginx ir IIS. Taigi, jei esate sistemos administratorius, atsakingas už „Apache“ diegimo valdymą, turite žinoti, kaip užtikrinti, kad jūsų žiniatinklio serveris veiktų geriausiai pagal jūsų (arba jūsų kliento) poreikius.

Šiame straipsnyje aptarsime keletą patarimų, kurie padės užtikrinti, kad „Apache“ veiktų sklandžiai ir galėtų apdoroti tiek užklausų, kurių tikitės iš nuotolinių klientų.

Tačiau atminkite, kad „Apache“ nebuvo sukurta siekiant nustatyti etaloninius rekordus, tačiau nepaisant to, ji vis tiek gali užtikrinti aukštą našumą beveik bet kokiu atveju, kai tik galite pagalvoti.

1 PATARIMAS: visada atnaujinkite „Apache“ į naujausią versiją

Savaime suprantama, kad naujausios „Apache“ versijos įdiegimas tikriausiai yra vienas iš pirmųjų dalykų, į kuriuos reikia atsižvelgti. 2015 m. lapkričio 19 d. naujausia „Apache“ versija, pasiekiama CentOS 7 saugyklose, yra 2.4.6, o Debian's yra >2.4.10.

Tačiau neseniai išleista stabili versija gali būti patobulinta arba ištaisyta klaida, kurią vėliau galima atsisiųsti ir įdiegti iš šaltinio. Čia taip pat pateikiamos kompiliavimo ir diegimo instrukcijos – tiesiog atminkite, kad jei pasirinksite šį naujinimo būdą, atsargumo sumetimais galbūt norėsite sukurti atsargines dabartinių konfigūracijos failų/svetainių/virtualių kompiuterių kopijas.

Bet kuriuo atveju galite patikrinti šiuo metu įdiegtą versiją taip:

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

Paprastai laikykitės atnaujinimo metodo, kurį pateikia pasirinkto platinimo paketų valdytojas (yum update httpd arba aptitude safe-upgrade apache2, skirtas CentOS arba Debian, atitinkamai), nebent nėra kito kelio. Naujausias leidimo pastabas galite perskaityti „Apache“ HTTP serverio projekto svetainės „Apache“ dokumentacijos skyriuje.

2 PATARIMAS: jei naudojate senesnį nei 2.4 branduolį, apsvarstykite galimybę atnaujinti dabar

Kodėl? Branduolio versijose 2.4 ir naujesnėse programose pagal numatytuosius nustatymus įgalintas sendfile branduolio sistemos iškvietimas. Tai savo ruožtu palengvina didelio našumo tinklo failų perkėlimą (kurio pageidaujama žiniatinklio serverio ir kliento komunikacijos kontekste) ir leidžia „Apache“ pateikti statinį turinį greičiau ir naudojant mažiau procesoriaus, vienu metu atliekant skaitymo ir siuntimo operacijas.

Šiuo metu įdiegtą branduolį galite peržiūrėti naudodami:

uname -r

ir palyginkite jį su naujausiu stabiliu branduoliu www.kernel.org (4.3 šio rašymo metu).

Nors tai nėra pradedantiesiems skirtas procesas, branduolio atnaujinimas yra įdomus pratimas norint sužinoti daugiau apie Linux vidines dalis.

3 PATARIMAS: pasirinkite jūsų atveju geriausiai tinkantį kelių apdorojimo modulį (MPM)

Praktiškai MPM išplečia modulines Apache funkcijas, leisdamos nuspręsti, kaip sukonfigūruoti žiniatinklio serverį, kad jis prisijungtų prie įrenginio tinklo prievadų, priimtų klientų užklausas ir naudotų antrinius procesus (ir gijas, alternatyviai) tvarkyti tokius prašymus.

Pradedant nuo 2.4 versijos, „Apache“ siūlo tris skirtingus MPM, kuriuos galite pasirinkti, atsižvelgiant į jūsų poreikius:

  1. MPM prefork naudoja kelis antrinius procesus be gijų. Kiekvienas procesas vienu metu apdoroja vieną ryšį, nesukuriant kiekvienam atskirų gijų. Per daug nesigilindami į detales galime pasakyti, kad šį MPM norėsite naudoti tik derindami programą, kuri naudoja arba jei jūsų programai reikia dirbti su gijos nesaugiais moduliais, tokiais kaip mod_php.
  2. MPM darbininkas naudoja kelias gijas vienam antriniam procesui, kur kiekviena gija vienu metu apdoroja vieną ryšį. Tai yra geras pasirinkimas didelio srauto serveriams, nes leidžia vienu metu užmegzti daugiau ryšių naudojant mažiau RAM nei ankstesniu atveju.
  3. Galiausiai, MPM įvykis yra numatytasis MPM daugumoje 2.4 ir naujesnių versijų „Apache“ diegimų. Jis panašus į darbuotojo MPM, nes taip pat sukuria kelias gijas vienam antriniam procesui, bet turi pranašumą: sukelia KeepAlive arba neaktyvius ryšius (kol jie išlieka toje būsenoje). turi būti tvarkoma viena gija, taip atlaisvinant atminties, kurią galima skirti kitoms gijomis. Šis MPM netinka naudoti su gijos nesaugiais moduliais, pvz., mod_php, kurių pakaitalas turi būti naudojamas PHP-FPM.

Norėdami patikrinti MPM, kurį naudoja jūsų „Apache“ diegimas, galite:

httpd -V

Toliau pateiktame paveikslėlyje parodyta, kad šis žiniatinklio serveris naudoja prefork MPM.

Norėdami tai pakeisti, turėsite redaguoti:

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

Kur gali būti mpm_event, mpm_worker arba mpm_prefork.

ir panaikinkite eilutės, kuri įkelia norimą modulį, komentarą taip:

LoadModule mpm_event_module modules/mod_mpm_event.so

Pastaba: kad įvykio MPM veiktų Debian'e, gali tekti įdiegti libapache2-mod-fastcgi paketą iš nelaisvo saugyklos.

Be to, „CentOS“ jums reikės php-fpm (kartu su fcgi ir mod_fcgid), o „Debian“ jis vadinamas php5-fpm< (kartu su apache2-mpm-event).

Paskutinis, bet ne mažiau svarbus dalykas, iš naujo paleiskite žiniatinklio serverį ir naujai įdiegtą php-fpm (arba php5-fpm) paslaugą:

„RedHat“/„CentOS“.

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

„Debian“/„Ubuntu“.

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

Nors galite nustatyti, kad „Apache“ naudotų konkretų MPM, tą konfigūraciją galima nepaisyti kiekvienam virtualiam kompiuteriui tokiu pat būdu, kaip nurodyta anksčiau.

Tiesiog įmeskite atitinkamas žymas į kiekvieno virtualiojo pagrindinio kompiuterio konfigūracijos failą ir būsite pasiruošę – bet įsitikinkite, kad naudojate vieną ir tik vieną MPM vienam Vhost.

Galiausiai atminkite, kad nepaisant jūsų pasirinkto platinimo, php-fpm priklauso nuo FastCGI diegimo, todėl anksčiau rekomendavau įdiegti papildomus paketus.

Norėdami gauti daugiau informacijos ir pavyzdžių apie php-fpm ir kaip jis kartu su įvykio MPM gali padidinti Apache našumą, žr. oficialią dokumentaciją.

Štai ką matau pakeitęs numatytąjį MPM iš prefork į įvykį tame pačiame laukelyje, parodytame ankstesniame paveikslėlyje:

Naudodami CentOS 7 turėsite įsitikinti, kad http ir https paslaugos yra įjungtos per užkardą ir kad tinklo sąsaja (-os) ) yra tinkamai įtraukti į numatytąją zoną.

Pavyzdžiui:

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

Priežastis, kodėl tai pateikiu, yra ta, kad neseniai susidūriau su problema, kai numatytieji ugniasienės konfigūracijos nustatymai debesies VPS neleido php-fpm ir Apache apdoroti php failų.

Kaip pagrindinį testą (esu tikras, kad galite galvoti apie sudėtingesnius ar įtemptus), sukursiu php failą, kuris patikrins, ar tame pačiame dviejų CentOS kataloge yra kito failo pavadinimu test.php. 7 serveriai su tomis pačiomis techninės įrangos charakteristikomis ir apkrova, bet su skirtingu MPM. Vienas iš jų naudos įvykį, o kitas naudos prefork:

Tai yra php kodas, kurį išsaugojau faile, pavadintame checkiffileexists.php:

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

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

Tada paleisime „Apache“ etalono įrankį (ab) su 200 vienu metu pateiktų užklausų, kol bus užbaigta 2000 užklausų:

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

Atlikime testą ir palyginkime rezultatus. Atkreipkite dėmesį į našumo statistiką:

Kaip matote, serverio su įvykiu našumas yra labai pranašesnis už prefork atitikmenį visais šio testo aspektais.

4 PATARIMAS: protingai paskirkite RAM „Apache“.

Ko gero, svarbiausias aparatinės įrangos elementas, į kurį reikia atsižvelgti, yra RAM kiekis, skirtas kiekvienam „Apache“ procesui. Nors negalite to tiesiogiai valdyti, galite apriboti antrinių procesų skaičių naudodami MaxRequestWorkers direktyvą (anksčiau vadintą MaxClients Apache 2.2), o tai apribos „Apache“ RAM naudojimą. Vėlgi, šią reikšmę galite nustatyti kiekvienam pagrindiniam arba virtualiam kompiuteriui.

Norėdami tai padaryti, turėtumėte atkreipti dėmesį į vidutinį „Apache“ naudojamą RAM kiekį, tada padauginkite jį iš MaxRequestWorkers skaičiaus ir tai bus atminties kiekis, kuris bus skirtas „Apache“ procesams. Vienas dalykas, kurio niekada nenorite, kad jūsų žiniatinklio serveris darytų, yra pradėti naudoti apsikeitimo funkciją, nes tai žymiai sumažins jo našumą. Taigi, jūs visada turėtumėte neviršyti „Apache“ RAM naudojimo ribų, kurias galite sau leisti, ir niekada nepasikliauti jos apsikeitimu.

Pavyzdžiui, šis blokas apribos vienu metu veikiančių klientų skaičių iki 30. Jei prie pagrindinio kompiuterio pateks daugiau klientų, jie gali vėluoti arba patirti trumpalaikį gedimą, kurį galima lengvai išspręsti atnaujinus naršyklę. Nors tai gali būti laikoma nepageidautina, tai naudingiau serveriui, o ilgainiui – geriausia ir jūsų svetainei.

Šį bloką galite įdėti į /etc/httpd/conf/httpd.conf arba /etc/apache2/apache2.conf, priklausomai nuo to, ar naudojate CentOS ar Debian.

Atminkite, kad tas pats principas taikomas visiems MPM – čia naudoju įvykį, kad tęsčiau ankstesniame patarime aprašytą koncepciją:

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

Bet kuriuo atveju labai rekomenduojama peržiūrėti „Apache 2.4“ dokumentus, kad sužinotumėte, kurios direktyvos leidžiamos jūsų pasirinktam MPM.

5 PATARIMAS: žinokite savo programas

Paprastai neturėtumėte įkelti jokių Apache modulių, kurie nėra būtini, kad programa veiktų. Tam reikės bent bendrų žinių apie jūsų serveryje veikiančias programas, ypač jei esate sistemos administratorius ir yra kita komanda, atsakinga už kūrimą.

Šiuo metu įkeltus modulius galite išvardyti naudodami:

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

Jei norite iškrauti/išjungti modulius CentOS, turėsite pakomentuoti eilutę, kuri prasideda LoadModule (pagrindiniame konfigūracijos faile arba pagalbiniame faile /etc/httpd/conf.modules.d.

Kita vertus, Debian suteikia įrankį, pavadintą a2dismod, kad išjungtų modulius ir naudojamas taip:

a2dismod module_name

Norėdami vėl įjungti:

a2enmod module_name

Bet kuriuo atveju nepamirškite iš naujo paleisti „Apache“, kad pakeitimai įsigaliotų.

Santrauka

Šiame straipsnyje apžvelgėme 5 patarimus, kurie padės suderinti „Apache“ žiniatinklio serverį ir padidinti jo našumą. Be to, turėtumėte atsiminti, kad optimizavimas ir našumas be saugumo yra beprasmiški, todėl galbūt norėsite kreiptis į diegimo mod_pagespeed, kad pagerintumėte žiniatinklio serverio našumą, ir „Apache“ tvirtinimo patarimų straipsnį linux-console.net.

Kadangi šiame straipsnyje negalime pakankamai aprėpti visų šios temos aspektų, galbūt kils kitų idėjų, kuriomis norėtumėte pasidalinti su likusia bendruomene. Jei taip, nedvejodami praneškite mums naudodami toliau pateiktą komentarų formą.