Vyhledávání na webu

5 tipů, jak zvýšit výkon vašeho webového serveru Apache


Podle nedávné zprávy společnosti Netcraft (známá internetová společnost poskytující mimo jiné statistiky používání webových prohlížečů) je Apache nadále nejrozšířenějším webovým serverem mezi stránkami a počítači připojenými k internetu.

Kromě toho Apache stále zažívá největší růst mezi nejlepšími webovými servery, následovaný Nginx a IIS. Pokud jste tedy správcem systému, který má na starosti správu instalací Apache, musíte vědět, jak zajistit, aby váš webový server fungoval co nejlépe ze své kapacity podle vašich potřeb (nebo vašeho klienta).

V tomto článku probereme několik tipů, které vám pomohou zajistit, že Apache poběží hladce a bude schopen zvládnout množství požadavků, které očekáváte od vzdálených klientů.

Mějte však prosím na paměti, že Apache nebyl navržen s cílem nastavit benchmarkové rekordy – ale i tak je stále schopen poskytovat vysoký výkon téměř v jakémkoli případě použití, na který si vzpomenete.

TIP #1: Vždy udržujte Apache aktualizovaný na nejnovější verzi

Je samozřejmé, že mít nainstalovanou nejnovější verzi Apache je pravděpodobně jednou z prvních věcí, které musíte zvážit. Od 19. listopadu 2015 je nejnovější verze Apache dostupná v repozitářích CentOS 7 2.4.6, zatímco v Debian je 2.4.10.

Může však dojít k nedávnému vylepšení nebo opravě chyby, která byla přidána do nově vydané stabilní verze, která je poté zpřístupněna ke stažení a instalaci ze zdroje. Zde jsou také uvedeny pokyny ke kompilaci a instalaci – nezapomeňte, že pokud zvolíte tuto metodu aktualizace, možná budete chtít zálohovat své aktuální konfigurační soubory/weby/virtuální hostitele jako preventivní opatření.

V každém případě můžete zkontrolovat aktuálně nainstalovanou verzi následovně:

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

Obecně se držte metody aktualizace poskytované správcem balíčků vámi zvolené distribuce (yum update httpd nebo aptitude safe-upgrade apache2, pro CentOS nebo Debian, respektive), pokud není jiná cesta. Nejnovější poznámky k verzi si můžete přečíst v sekci Dokumentace Apache na webu projektu Apache HTTP server.

TIP #2: Pokud používáte jádro starší než 2.4, zvažte upgrade nyní

Proč? Verze jádra 2.4 a vyšší mají ve výchozím nastavení povoleno systémové volání jádra sendfile. To zase usnadňuje vysoce výkonné síťové přenosy souborů (které jsou požadovány v kontextu komunikace webový server-klient) a umožňuje Apache doručovat statický obsah rychleji as nižším vytížením CPU prováděním simultánních operací čtení a odesílání.

Aktuálně nainstalované jádro můžete zobrazit pomocí:

uname -r

a porovnejte jej s nejnovějším stabilním jádrem na www.kernel.org (4.3 v době psaní tohoto článku).

Přestože se nejedná o proces, který není určen pro začátečníky, upgrade vašeho jádra je zajímavým cvičením, jak se dozvědět více o vnitřních částech Linuxu.

TIP #3: Vyberte si modul pro více zpracování (MPM), který nejlépe vyhovuje vašemu případu

V praxi MPM rozšiřují modulární funkčnost Apache tím, že vám umožňují rozhodnout, jak nakonfigurovat webový server tak, aby se vázal na síťové porty na počítači, přijímal požadavky od klientů a používal podřízené procesy (a vlákna, alternativně) vyřizovat takové požadavky.

Počínaje verzí 2.4 nabízí Apache tři různé MPM, ze kterých si můžete vybrat v závislosti na vašich potřebách:

  1. prefork MPM používá více podřízených procesů bez vláken. Každý proces zpracovává jedno připojení najednou, aniž by pro každé vytvářel samostatná vlákna. Aniž bychom zacházeli do přílišných podrobností, můžeme říci, že tento MPM budete chtít používat pouze při ladění aplikace, která používá, nebo pokud vaše aplikace potřebuje pracovat s moduly, které nejsou bezpečné pro vlákna, jako je mod_php.
  2. worker MPM používá několik vláken na podřízený proces, kde každé vlákno zpracovává jedno připojení najednou. Toto je dobrá volba pro servery s vysokým provozem, protože umožňuje zpracovat více souběžných připojení s menším množstvím paměti RAM než v předchozím případě.
  3. A konečně událost MPM je výchozí MPM ve většině instalací Apache pro verze 2.4 a vyšší. Je podobný pracovnímu MPM v tom, že také vytváří více vláken na podřízený proces, ale s výhodou: způsobuje KeepAlive nebo nečinná připojení (zatímco zůstávají v tomto stavu) být zpracovávány jedním vláknem, čímž se uvolní paměť, která může být přidělena jiným vláknům. Tento MPM není vhodný pro použití s moduly, které nejsou bezpečné pro vlákna, jako je mod_php, pro které je třeba místo toho použít náhradu, jako je PHP-FPM.

Chcete-li zkontrolovat MPM používané vaší instalací Apache, můžete:

httpd -V

Obrázek níže ukazuje, že tento konkrétní webový server používá prefork MPM.

Chcete-li to změnit, budete muset upravit:

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

Kde může být mpm_event, mpm_worker nebo mpm_prefork.

a odkomentujte řádek, který načte požadovaný modul takto:

LoadModule mpm_event_module modules/mod_mpm_event.so

Poznámka: Aby událost MPM fungovala v Debianu, možná budete muset nainstalovat balíček libapache2-mod-fastcgi z non-free úložišť.

Navíc pro CentOS budete potřebovat php-fpm (spolu s fcgi a mod_fcgid), zatímco v Debianu se nazývá php5-fpm< (spolu s apache2-mpm-event).

V neposlední řadě restartujte webový server a nově nainstalovanou službu php-fpm (nebo 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

Ačkoli můžete Apache nastavit tak, aby používal konkrétní MPM, lze tuto konfiguraci přepsat na základě jednotlivých virtuálních hostitelů stejným způsobem, jak bylo uvedeno výše.

Jednoduše vložte odpovídající značky do konfiguračního souboru pro každého virtuálního hostitele a jste připraveni jít – ale ujistěte se, že používáte pouze jeden MPM na vhost.

Na závěr si prosím uvědomte, že bez ohledu na vámi vybranou distribuci se php-fpm spoléhá na implementaci FastCGI, což je důvod, proč jsem instalaci dalších balíčků doporučil dříve.

Další podrobnosti a příklady o php-fpm a o tom, jak může spolu s událostí MPM zvýšit výkon Apache, naleznete v oficiální dokumentaci.

To je to, co vidím po změně výchozího MPM z prefork na událost ve stejném poli zobrazeném na předchozím obrázku:

V CentOS 7 se budete muset ujistit, že jsou přes bránu firewall povoleny služby http a https a že síťová rozhraní ) jsou správně přidány do výchozí zóny.

Například:

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

Důvod, proč to uvádím, je ten, že jsem nedávno zaznamenal problém, kdy výchozí nastavení konfigurace brány firewall v cloudovém VPS bránilo php-fpm a Apache ve zpracování souborů php.

Jako základní test (určitě vás napadnou i složitější nebo stresující) vytvořím php soubor, který zkontroluje existenci dalšího souboru s názvem test.php ve stejném adresáři dvou CentOS 7 serverů se stejnými hardwarovými charakteristikami a zatížením, ale s rozdílným MPM. Jeden z nich bude používat událost a druhý použije prefork:

Toto je php kód, který jsem uložil do souboru s názvem checkiffileexists.php:

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

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

Poté spustíme srovnávací nástroj Apache (ab) s 200 současnými požadavky, dokud nebude dokončeno 2 000:

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

Spustíme test a porovnáme výsledky. Věnujte pozornost statistikám výkonu:

Jak můžete vidět, výkon serveru s událostí je vysoce lepší než jeho protějšek prefork ve všech aspektech tohoto testu.

TIP #4: Rozumně alokujte RAM pro Apache

Snad nejkritičtější hardwarovou položkou, kterou je třeba vzít v úvahu, je množství RAM přidělené pro každý proces Apache. I když to nemůžete ovládat přímo, můžete omezit počet podřízených procesů pomocí direktivy MaxRequestWorkers (dříve známé jako MaxClients v Apache 2.2), což omezí využití paměti RAM Apache. Tuto hodnotu můžete opět nastavit na základě jednotlivých hostitelů nebo virtuálních hostitelů.

Chcete-li to provést, měli byste si poznamenat průměrné množství paměti RAM používané Apache a poté jej vynásobit počtem MaxRequestWorker, což je množství paměti, která bude přidělena procesům Apache. Jedna věc, kterou nikdy nechcete, aby váš webový server dělal, je začít používat swap, protože to výrazně sníží jeho výkon. Proto byste měli vždy udržovat využití paměti RAM Apache v mezích, které si můžete dovolit, a nikdy se nespoléhat na swap.

Například následující blok omezí počet simultánních klientů na 30. Pokud na hostitele zasáhne více klientů, může dojít ke zpoždění nebo dočasnému selhání, které lze snadno vyřešit obnovením prohlížeče. I když to může být považováno za nežádoucí, je to zdravější pro server az dlouhodobého hlediska nejlepší i pro váš web.

Tento blok můžete umístit do /etc/httpd/conf/httpd.conf nebo /etc/apache2/apache2.conf v závislosti na tom, zda používáte CentOS nebo Debian.

Vezměte prosím na vědomí, že stejný princip platí pro všechny MPM – zde používám událost, abych pokračoval s konceptem nastíněným v předchozím tipu:

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

V každém případě se důrazně doporučuje, abyste se podívali do dokumentů Apache 2.4, abyste zjistili, které direktivy jsou povoleny pro vámi vybraný MPM.

TIP #5: Poznejte své aplikace

Obecně platí, že byste neměli načítat žádné moduly Apache, které nejsou nezbytně nutné pro fungování vaší aplikace. To bude vyžadovat alespoň celkovou znalost aplikací běžících na vašem serveru, zvláště pokud jste správce systému a vývoj má na starosti jiný tým.

Aktuálně načtené moduly můžete vypsat pomocí:

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

Chcete-li uvolnit/deaktivovat moduly v CentOS, budete muset zakomentovat řádek, který začíná LoadModule (buď v hlavním konfiguračním souboru, nebo v pomocném v /etc/httpd/conf.modules.d.

Na druhou stranu Debian poskytuje nástroj nazvaný a2dismod pro deaktivaci modulů a používá se následovně:

a2dismod module_name

Chcete-li jej znovu povolit:

a2enmod module_name

V obou případech nezapomeňte restartovat Apache, aby se změny projevily.

Shrnutí

V tomto článku jsme probrali 5 tipů, které vám pomohou vyladit webový server Apache a zvýšit jeho výkon. Kromě toho byste měli pamatovat na to, že optimalizace a výkon bez zabezpečení jsou zbytečné, takže si možná budete chtít přečíst článek o instalaci mod_pagespeed pro zlepšení výkonu webového serveru a článek s tipy na posílení Apache na webu linux-console.net.

Protože v tomto článku nemůžeme dostatečně pokrýt všechny aspekty tohoto tématu, možná vás napadnou další nápady, o které byste se rádi podělili se zbytkem komunity. Pokud ano, dejte nám vědět pomocí níže uvedeného formuláře pro komentáře.