Správa linuxového serveru: Thttpd a benchmark webového serveru

Webový server thttpd je minimalistický, hodí se pro maličké osobní, domácí či embedded servery, popřípadě pro VPS s málo RAM. Jelikož nastavení tohoto serveru je relativně jednoduché, bude se druhá část článku zabývat nástrojem ab pro benchmark webového serveru.

Úvod

Pro tentokrát začnu nevýhodami. Thttpd je momentálně nevyvíjený, a to již poměrně dlouhou dobu (poslední verze vyšla koncem roku 2003). Mailing list projektu je sice ještě stále aktivní, ale netroufnu si odpovědět na otázku, zdali vývoj tohoto projektu bude ještě někdy pokračovat. Lze však předpokládat, že případné fatální či bezpečnostní problémy budou řešeny jako doposud, tedy na úrovni správců balíčků v distribucích, které thttpd obsahují. Mezi další nevýhody thttpd patří také absence podpory IPv6, HTTPS a FastCGI (podporuje pouze CGI).

Jeho výhody naopak zahrnují paměťovou nenáročnost (sám zabírá pod 1 MB RAM, při zátěži spotřebovává minimum paměti navíc), rychlost (u statických stránek stíhá víc a rychleji než Apache) a vestavěná podpora pro škrcení síťového provozu (throttling).

Jak už bylo zmíněno, thttpd se hodí především tam, kde je citelný nedostatek paměti a kde nevadí absence pokročilejších funkcí typických pro servery typu Apache. Bude vynikat zejména tam, kde je potřeba servírovat statické stránky. Pokud máte produkční server, popřípadě chcete dynamické stránky, budete spíše uvažovat o lighttpd či Nginx.

Instalace

Je velká pravděpodobnost, že thttpd máte v repozitářích své distribuce, takže by mělo stačit nainstalovat stejnojmenný balíček. V Debianu byste instalaci thttpd provedli takto:

aptitude install thttpd

Základní konfigurace

Primární konfigurační soubor pro thttpd je /etc/thttpd/thttpd.conf. Výchozí nastavení je v Debianu postačující pro provoz na portu 80, přičemž obsah, který thttpd servíruje, má výchozí umístění shodné s Apache, tedy /var/www. Pokud vám toto nastavení vyhovuje, můžete přejít rovnou ke spuštění serveru. V opačném případě můžete tyto hodnoty upravit, třeba takto:

port=8000
dir=/srv/http

Thttpd se na rozdíl od jiných webových serverů v Debianu po instalaci automaticky nespustí, jeho použití je potřeba nejprve povolit v /etc/default/thttpd, kde musíte volbu ENABLED nastavit na yes:

ENABLED=yes

Teprve poté nastartujte thttpd:

/etc/init.d/thttpd start

chroot a bezpečnost

Z bezpečnostních důvodů je doporučeno používat chroot, tj. uzavřít běh serveru v adresáři s obsahem, který má thttpd servírovat. Tak je také thttpd v Debianu ve výchozím stavu nastaven. Pokud vám toto nastavení nevyhovuje, zaměňte volbu chroot za nochroot.

Podobně jako Apache nebo jiné webové servery i thttpd po spuštění změní uživatele z roota na neprivilegovaného uživatele, v Debianu je to uživatel www-data (toto upravuje volba user).

Nastavení throttlingu

Pro domácí servery má thttpd jednu velkou výhodu - má vestavěný throttling, tedy „škrcení“ síťového provozu, což se velmi hodí tam, kde máte škrcený upload (mj. prakticky veškeré domácí ADSL). Throttling se nastavuje ve zvláštním konfiguračním souboru, a sice v /etc/thttpd/throttling.conf. Samotné nastavení může vypadat třeba takto:

**              5000-10000
**.jpg|**.png   5000
files/**        5000

První řádka udává globální nastavení pro všechny soubory, přičemž maximum je stanovené na 10000 bytů za vteřinu. První číslo, tedy 5000, udává minimum. Druhý řádek dává všem jpg a png souborům maximum 5000 bytů za sekundu. Poslední řádka naznačuje, jak by se postupovalo pro všechny soubory v určitém adresáři, v tomto případě se jedná o adresář files, kterému je rovněž nastaveno maximum přenosů na 5000 bytů za sekundu.

Benchmark webového serveru pomocí nástroje ab

Přemýšlíte-li nad tím, jakým způsobem změřit výkon webového serveru při zátěži, můžete zkusit nástroj ab z balíčku apache2-utils. K instalaci vám v Debianu postačí následující příkaz:

aptitude install apache2-utils

Oddělení balíčků je zde velmi prospěšné, neboť nemusíte kvůli tomuto nástroji tahat celou distribuci Apache, postačí vám pouze tento balíček.

Nástroj ab má dva klíčové parametry, a sice celkový počet HTTP žádostí (-n) a počet současně posílaných žádostí (-c). Výchozí hodnotou je u obojího jednička. Pokud tedy chcete otestovat místní server zasláním dvou tisíc žádostí, přičemž současně by se posílalo třicet žádostí, vykonali byste následující příkaz:

ab -n 2000 -c 30 http://127.0.0.1/

Pro ukázku uvádím výstup tohoto příkazu právě v případě thttpd:

Server Software:        thttpd/2.25b
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /
Document Length:        1399 bytes

Concurrency Level:      30
Time taken for tests:   0.135 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      3272000 bytes
HTML transferred:       2798000 bytes
Requests per second:    14760.58 [#/sec] (mean)
Time per request:       2.032 [ms] (mean)
Time per request:       0.068 [ms] (mean, across all concurrent requests)
Transfer rate:          23582.34 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       2
Processing:     0    2   0.5      2       3
Waiting:        0    1   0.6      1       3
Total:          0    2   0.6      2       4

Percentage of the requests served within a certain time (ms)
  50%      2
  66%      2
  75%      2
  80%      3
  90%      3
  95%      3
  98%      3
  99%      3
 100%      4 (longest request)

Ve výpisu jsou patrné podstatné statistické údaje, tedy nejdelší požadavek, během jaké doby byla obsloužena většina požadavků, přenosová rychlost, počet přenesených bytů apod. Pokud to s bechmarkováním budete myslet vážně, určitě se podívejte do manuálové stránky nástroje kvůli ostatním volbám.

Pár slov o benchmarkování

Aby měl jakýkoliv benchmark smysl, je potřeba zadat správné parametry a výsledky správně interpretovat. Už samotná volba testovací stránky skýtá mnoho úskalí. Pokud testujete na statické stránce, ale hodláte nasadit dynamické stránky (resp. webovou aplikaci), nemusí mít test vůbec žádnou vypovídací schopnost. Podobně, testujete-li jednu konkrétní dynamickou stránku, je třeba mít na paměti, že u jiných stránek může být výkon řádově jiný (provádí se jiné SQL dotazy, jiné zpracování dat apod.). Jinými slovy, před započetím testování byste měli mít jasnou představu, co chcete testovat, a měli byste si být jisti, že jste zvolili správnou metodu, jak to otestovat. Určitě nebývá od věci kromě výsledků sledovat i zatížení systému, obsazení paměti a další parametry během samotného benchmarku.

V příkladu výše vás mělo zarazit to, že test byl prováděn z localhostu, tj. přímo na serveru. Takový test může být vhodný, pokud testujete „surový“ výkon webového serveru, kde by mohla síťová vrstva výsledek ovlivnit. Naopak pro testování z pohledu uživatelů webu není dobré síť ignorovat, jelikož její režie si vždy něco vezme. V souvislosti s tím byste si také měli dávat pozor, odkud server testujete, aby vám nízký upload vašeho ISP nezkreslil výsledky.