Veebiserverite tarkvara vordlus
Veebiserverite tarkvara võrdlus
Autor: Priit Pääsukene
Lühidalt veebiserveritest
Veebiserverid on programmid, mis oskavad vastata HTTP ja HTTPS päringutele. Tavakasutaja näeb veebiserveri töö tulemusel seda, et brauseri ekraanile kuvatakse ilus ja värviline veebileht. Surfates brauseriga internetis, tähendab pea iga hiireklõps, et brauser saadab veebiserverile päringuid, veebiserver vastab neile, ning tulemuseks on järjekordne lehekülg internetti brauseri ekraanil. AJAX ajastul võidakse veebiserverile päringuid saata pea iga kasutaja poolt esilekutsutud sündmuse puhul - veebilehitseja aktiivseks muutmine, tekstiväljale tähemärgi sisestamine jms. Seega on veebiserveri ülesandeks vastata kasutaja päringule võimalikult kiiresti õige failiga.
Niisiis, veebiserverite kõige tavalisemaks ülesandeks on erinevate failide serveerimine. See on veebiserverite hingeelust aru saamiseks hädavajalik teadmine - veebiserverid ei joonista pilte, ei kuva flash videoid ega raputa su brauseriakent. Veebiserveri ülesandeks on vastata päringule (näiteks "GET /index.php/Main_Page HTTP/1.1") vastava sisuga. See sisu ei pea ilmtingimata tulema failisüsteemis asuvast failist, vaid võib olla genereeritud ka mõne programmi poolt. Tuntumad programmeerimiskeeled mille väljundit me internetis surfates näeme on php, asp, java, python jms.
Veebiserverite populaarsuse kohta peab arvestust netcraft - [[1]]
Võrdluse metoodikast
Lisaks subjektiivsele serverite kirjeldusele jooksutan läbi ka väikese koormustesti erinevate veebiserverite vastu. Testi käigus jälgin serverite koormust ja mälukasutust. Testimiseks kasutana apache poolt loodud utiliiti "ab" ehk apache benchmark. Et testida veebiserverit koormatuse tingimustes kasutan ühe veebiserveri testimiseks vähemalt kahte klienti. Platvormiks on Linuxi distributsiooni Debian viimane versioon (lenny).
Jõudlustesti keskkond: [ klient1 ] <----- 1Gbit ethernet ------> [ server ] [ klient2 ]
Veebiserverid
Apache httpd 2.2
Apache httpd on kõige populaarsem veebiserver internetis. Ta on saadaval pea igale riistvarale ja operatsioonisüsteemile. Google leiab arvukalt näiteid ja tekkinud vigade korral on üsna lihtne abi saada. Veebiserveri koodi haldamise, vigade parandamise jms-ga tegeleb Apache software foundation - [2]
Paigaldus:
Programmi lähtekoodi, dokumentatsiooni ja palju muud huvitavat leiab apache koduleheküljelt httpd veebiserveri projekti alt - [3] Lihtsama vastupanu teed minnes võib leida ka valmispakitud versiooni apache2 servrist. Debiani saab näiteks käsuga apt-get install apache2 installeerida distributsiooni poolt valmis pakitud apache2 serveri. Mina otsustasin kompileerida kõik veebiservrid käsitsi antud süsteemi jaoks.
lahtipakkimine:
cd /usr/src/ wget http://apache.com.saidilt.leitud.url tar zxvf httpd-2.2.15.tar.gz cd httpd-2.2.15
algne konfiguratsioon, kompileerimine, paigaldus: Apache2 kompileerimiseks on vaja paljusid utiliite ja teeke. lisavõimaluste (php, geoip, ssl jms.) kompileerimiseks tuleb linux keskkonnas lisada -dev lõpuga pakke, näiteks libssl-dev. põhifunktsionaalsuse kompileerimiseks on vaja c komilaatorit gcc ja utiliiti make. Käsud vajaliku paigaldamiseks ja veebiserveri kompileerimiseks on:
apt-get install gcc make libssl-dev ./configure make make install
vaikimisi installitakse veebiserver kataloogi /usr/local/apache2 konfiguratsioon asub failis /usr/local/apache2/conf/httpd.conf see konfiguratsioon serveerib apache dokumentatsiooni katalogist /usr/local/apache2/htdocs/. Et Seda käitumist muuta tuleb teha mõned muudatused konfiguratsioonifailis-
Et kõik veebiserverid oleksid võrdses seisus, tekitan lihtsa kodulehekülje kausta /opt/www ja sellele vastava virtuaalse hosti:
<VirtualHost *:80> DocumentRoot /opt/www/ <Directory /opt/www> Allow from all </Directory> </VirtualHost>
Vaikimisi on kasutab apache prefork moodulit. See tähendab, et iga sissetuleva ühenduse kohta tekitatakse protsess. Jõudluse suurendamiseks suurendan maksimaalset kliente teenindavate protsesside arvu 200 paralleelse ühenduseni (kaasa tulnud konfiguratsioonis on see 10):
MaxClients 200
Apache Tomcat 6.0
Apache tomcat on javas kirjutatud veebirakenduste server. Programmeerimise, versioonihalduse ja vigadega tegeleb Apache software foundation -[4] Dokumentatsiooni, näiteid, uudiseid jms. leiab tomcat projekti koduleheküljelt - [5]
Tomcati jooksutamiseks peab olema masinasse installeeritud java. Debiani all saab java interpretaatori pakist sun-java-jre6 (apt-get install sun-java-jre6). Tomcat ei ole klassikaline veebiserver. Lisaks failide serveerimisele kasutatakse teda java rakenduste serveerimisel. Tegemist on nö. applikatsiooniserveriga. Tomcat on vabavaraline kood, mis võimaldab jooksutada Java Servlet ja Java ServerPages tehnoloogiat. Mõistlik on tomcati ette ühendusi puhverdama panna mõni muu veebiserver, näiteks httpd või nginx. Tark on ka lubada applikatsiooniserveri vastuste puhverdamine.
Tomcati installeerimiseks ja käivitamiseks on vaja lihtsalt tomcat lahti pakkida ja käivitada. Täsemad konfiguratsioonid asuvad .xml failidena kataloogis conf/. Mõistlik on tomcati jooksutamiseks tekitada eraldi kasutaja. mina valisin selleks kasutajanimeks "java". Kui seadistustes kõik muutmata jätta, kuulab tomcat serveri pordis 8080.
Käsud, mis viivad tomcati käivitamiseni vaikekonfiguratsiooniga:
useradd -m java su - java wget http://tomcat.apache.org.saidilt.saadud.url tar zxvf apache-tomcat-6.0.26.tar.gz cd apache-tomcat-6.0.26 #Vaikimisi kaasatulnud kodulehe kustutamine rm -r webapps/ROOT #Turvalisuse huvides lülitan välja java appletide manageerimise programmi. chmod 0 webapps/manager webapps/host-manager #sümboolne link veebiserveri juurkataloogi tekitamiseks - ln -s /opt/www webapps/ROOT #Veebiserveri käivitamine bin/startup.sh
Nginx
Nginx on väike, lihtne ja maailmas järjest suuremat populaarsust võitev veebiserver, mille saab alla laadida aadressilt http://www.nginx.org/. Dokumentatsioon ja seadistamise näidised asuvad aadressil http://wiki.nginx.org Nginx eeliseks on tema väiksus. Lisamooduleid on nginx-le hulgim, nimekirja ja konfiguratsiooninäited leiab aadressilt - http://wiki.nginx.org/NginxModules
algseadistamine ja kompileerimine:
Vaikimisi tahetakse kompileerimisel regulaaravaldiste teeki ja räside arvutamiseks openssl teeki. debiani all saab need pakkidest libpcre3-dev ja libssl-dev . Lisaks on vajalik ka gcc ja make olemasolu nagu httpd kopeerimisegi puhul.
käsud:
wget http://nginx.org.kodulehelt.leitud.faili.url tar zxvf nginx-0.7.65.tar.gz cd nginx-0.7.65 ./configure make make install
Nii toimides installeerisid veebiserveri kausta /usr/local/nginx . Konfiguratsioon asub failis /usr/local/nginx/conf/nginx.conf
konfiguratsioonimuudatused:
Et veebiserverid omavahel sassi ei läheks, konfigureerin veebiserveri kuulama porti 83 ja suunan veebiserveri juurkataloogi kausta /opt/www
user www; worker_processes 10; server { listen 83; location / { root /opt/www; index index.html index.htm; } }
veebiserveri käivitamine:
/usr/local/nginx/sbin/nginx
Lighttpd
vaikimisi kompileerumiseks vajas lighthttpd pakki libbz2-dev. käsud:
tar zxvf lighttpd-1.4.26.tgz cd lighttpd-1.4.26 ./configure make make install
vaikimisi installeerus lighthttpd binaar /usr/sbin/ kataloogi käivitumiseks tuli käsitsi tekitada käivitusskript ja konfifailid. Lighthttpd veebilehel olev dokumentatsioon pakkus töötavaid näiteid.
sed -e 's/FOO/lighttpd/g' doc/rc.lighttpd > /etc/init.d/lighttpd chmod a+rx /etc/init.d/lighttpd install -Dp ./doc/lighttpd.conf /etc/lighttpd/lighttpd.conf # update-rc.d lighttpd defaults mkdir /var/log/lighthttpd chown www /var/log/lighthttpd
muudatused vaikimisi konfiguratsioonis -
server.document-root = "/opt/www/" server.port = 84 server.username = "www"
Koormustest
Testimiseks kasutan utiliiti ab (apache benchmark) mis tuleb kaasa apache httpd veebiserveriga. koormustesti tegemiseks kasutan fäikest, suurt ja keskmist faili - 1b, 500kb ja 10Mb.
testin ka erinevate koormustega - 5, 100 ja 500 paralleelset ühendust.
Testi tulemused
5 paralleelset ühendust, väike fail:
httpd:
Requests per second: 5090.12 [#/sec] (mean) Time per request: 0.982 [ms] (mean) Transfer rate: 1237.76 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Total: 0 1 0.6 1 42 load average: 0.1
tomcat
Requests per second: 4866.63 [#/sec] (mean) Time per request: 1.027 [ms] (mean) Transfer rate: 1154.90 [Kbytes/sec] received min mean[+/-sd] median max Total: 0 1 2.8 1 269 Load average: 0.15
nginx
Requests per second: 5027.52 [#/sec] (mean) Time per request: 0.995 [ms] (mean) Transfer rate: 1035.94 [Kbytes/sec] received min mean[+/-sd] median max Total: 0 1 0.2 1 8 Load average: 0.15
lighttpd
Requests per second: 5894.75 [#/sec] (mean) Time per request: 0.848 [ms] (mean) Transfer rate: 1347.04 [Kbytes/sec] received min mean[+/-sd] median max Total: 0 1 0.2 1 4 Load average: 0.15
50 paralleelset ühendust, väike fail
httpd:
Requests per second: 17104.57 [#/sec] (mean) Time per request: 2.923 [ms] (mean) Transfer rate: 4159.22 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 3 0.6 3 21 load average: 0.5
tomcat
Requests per second: 11376.29 [#/sec] (mean) Time per request: 4.395 [ms] (mean) Transfer rate: 2699.75 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 4 4.8 4 109 Load average: 1.38
nginx
Requests per second: 12119.90 [#/sec] (mean) Time per request: 4.125 [ms] (mean) Transfer rate: 2497.71 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 4 1.2 4 137 Load average: 0.20
lighttpd
Requests per second: 12389.67 [#/sec] (mean) Time per request: 4.036 [ms] (mean) Transfer rate: 2831.23 [Kbytes/sec] received min mean[+/-sd] median max Total: 1 4 1.0 4 14 Load average: 0.13
500 paralleelset ühendust, väike fail:
httpd
Requests per second: 13777.05 [#/sec] (mean) Time per request: 36.292 [ms] (mean) Transfer rate: 3350.83 [Kbytes/sec] received min mean[+/-sd] median max Total: 10 36 180.6 22 9030 load average: 5.6
tomcat
Requests per second: 10483.95 [#/sec] (mean) Time per request: 47.692 [ms] (mean) Transfer rate: 2496.95 [Kbytes/sec] received min mean[+/-sd] median max Total: 1 39 265.6 9 3080 Load average: 0.66
nginx
Requests per second: 9437.40 [#/sec] (mean) Time per request: 52.981 [ms] (mean) Transfer rate: 1944.70 [Kbytes/sec] received min mean[+/-sd] median max Total: 9 41 193.9 25 3639 Load average: 0.17
lighttpd
Requests per second: 12923.12 [#/sec] (mean) Time per request: 38.690 [ms] (mean) Transfer rate: 3008.65 [Kbytes/sec] received min mean[+/-sd] median max Total: 21 38 3.1 37 48 Load avg: 0.09
5 paralleelset ühendust, keskmine fail (28 kilobaiti)
httpd
Requests per second: 1638.31 [#/sec] (mean) Time per request: 3.052 [ms] (mean) Transfer rate: 42644.10 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 3 0.7 3 40 load average: 0.8
tomcat
Requests per second: 1583.27 [#/sec] (mean) Time per request: 3.158 [ms] (mean) Transfer rate: 41204.07 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 3 3.3 3 314 Load average: 0.21
nginx
Requests per second: 1619.20 [#/sec] (mean) Time per request: 3.088 [ms] (mean) Transfer rate: 42081.87 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 3 0.4 3 17 Load avg: 0.19
lighttpd
Requests per second: 1743.40 [#/sec] (mean) Time per request: 2.868 [ms] (mean) Transfer rate: 45348.79 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 3 0.3 3 6 Load avg: 0.10
50 paralleelset ühendust, keskmine fail
httpd
Requests per second: 1871.80 [#/sec] (mean) Time per request: 26.712 [ms] (mean) Transfer rate: 48723.66 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 26 229.8 6 4128 Load average: 0.55
tomcat
Requests per second: 1735.21 [#/sec] (mean) Time per request: 28.815 [ms] (mean) Transfer rate: 45158.72 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 28 245.9 6 5018 Load Average: 0.52
nginx
Requests per second: 1794.50 [#/sec] (mean) Time per request: 27.863 [ms] (mean) Transfer rate: 46640.41 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 27 238.4 6 3214 Load avg: 0.30
lighttpd
Requests per second: 2406.26 [#/sec] (mean) Time per request: 20.779 [ms] (mean) Transfer rate: 62628.00 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 18 182.6 6 3010 Load avg: 0.15
500 paralleelset ühendust, keskmine fail
httpd
Requests per second: 1241.74 [#/sec] (mean) Time per request: 402.660 [ms] (mean) Transfer rate: 32327.12 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 359 1667.7 8 26764 load average: 0.2
tomcat
Requests per second: 2098.40 [#/sec] (mean) Time per request: 238.277 [ms] (mean) Transfer rate: 54612.97 [Kbytes/sec] received min mean[+/-sd] median max Total: 1 86 567.8 6 13859 Load average: 1.12
nginx
Requests per second: 1776.33 [#/sec] (mean) Time per request: 281.479 [ms] (mean) Transfer rate: 46174.92 [Kbytes/sec] received min mean[+/-sd] median max Total: 1 216 779.2 7 21007 Load avg: 0.32
lighttpd
Requests per second: 1859.79 [#/sec] (mean) Time per request: 268.848 [ms] (mean) Transfer rate: 48394.98 [Kbytes/sec] received min mean[+/-sd] median max Total: 2 185 690.2 7 4916 Load avg: 0.11
50 paralleelset ühendust, suur fail (10Mb)
httpd
Requests per second: 4.59 [#/sec] (mean) Time per request: 10896.638 [ms] (mean) Transfer rate: 49652.71 [Kbytes/sec] received min mean[+/-sd] median max Total: 208 9541 5294.6 9858 20593 load average: 0.0
tomcat
Requests per second: 4.76 [#/sec] (mean) Time per request: 10502.895 [ms] (mean) Transfer rate: 53123.11 [Kbytes/sec] received min mean[+/-sd] median max Total: 3372 7963 2031.2 8257 14881 Load 0.21
nginx
Requests per second: 5.10 [#/sec] (mean) Time per request: 9804.952 [ms] (mean) Transfer rate: 55050.30 [Kbytes/sec] received min mean[+/-sd] median max Total: 2071 7095 3019.6 6678 16009 Load avg: 0.04
lighttpd
Requests per second: 5.11 [#/sec] (mean) Time per request: 9778.541 [ms] (mean) Transfer rate: 57477.14 [Kbytes/sec] received min mean[+/-sd] median max Total: 2802 8198 3605.2 7041 15664 Load average: 0.04