Vladas Palubinskas HTTP serverių rinkos apžvalga ir išvados:
Hiawatha išsiskiria švara, patvarumu ir žmoniškumu —
, 2016-12-09.

Hiawatha

Esu dažnai klausinėjamas, vis tenka teisintis, tai bent glaustai surašysiu, kodėl visų pripažintą HTTP serverį „Apache“ pakeičiau mažiau žinomu „NginX“, bet ir šį išbandęs pašalinau, o jų vietoje įdiegiau ir jau tvirtai pasiryžau kliautis „Hiawatha“ — niekam negirdėta, nė specialistams nežinoma, tikriausiai pirmąja Lietuvoje.

„Apačiui“ apibūdinti neverta plėtotis — tai nesaugus griozdas, eikvojantis techninius išteklius, pirmiausia kompiuterio „atmintį“ (RAM), o dūstantis jau nuo nedidelės darbo apkrovos. Imantis rimtesnių darbų, tenka su „Apačiumi“ įkinkyti ir visokių stiprintuvų, antai „Vikimedijos“ fondas įdarbinęs Apache Traffic Server su Web Accelerator ir kitais ėdriais traukliais. Be svarbios priežasties remtis „Apačiumi“ save gerbiančiam meistrui turėtų būti gėda. Bet jis tebėra plačiausiai naudojamas, nes nuo seno visiems žinomas, pritaikytas dirbti įprastai.

Nagrinėjant „NginX“, man pirmiausia užkliuvo ribotas SSI veikimas, neištraukiant nė aplinkos duomenų paprasta <!--# printenv --> užklausa. CGI ten visai neveikia (tiesa, veiktų riboti SCGI arba WSGI). Patyrinėjęs rinką, nustebau, kad „NginX“ ir galingumas yra luošas — štai kaip Krisiaus Vadžio (Chris Wadge) išbandymo „Slowloris“ antpuoliu metu šlubavo „NginX“, o „Apache“ užduso visai:

Uždusęs Apache 2.4.7 Šlubuojantis NginX 1.4.5 Patvari ir pajėgi Hiawatha 9.3.1

Apache, Cherokee, OLS, G-Wan, Hiawatha, Lighttpd, NginX patvarumo palyginimas.

Krisiaus liudijimu, šimtą tūkstančių HTTP užklausų vienu metu (daugiau jam nepavyko pasiekti) „Hiawatha“ aptarnauja nesunkiai, dar nejausdama serveriams būdingo C10K nuovargio.

Rimo Kudelio dėka „NginX“ įdiegiau ir išsibandžiau sėkmingai, tačiau slėgė nepasitikėjimas tiek programa, tiek ir savo supratimu — nors programos kodas atviras, bet naudojimosi aprašymai pakriki, neišsamūs. Ir derinimo įrašai nežmoniški — ne visiems suprantamais kalbos žodžiais, o programišių burtažodžiais. Palyginkite tapačios užduoties įrašus „Apačiui“ ir „Hiawathai“ (NginX, OpenLiteSpeed sintaksė maždaug tarpinė, tad jas praleidau):

„Apache“ „Hiawatha“
Perjungti ryšį šifruotu (http → https)
RewriteEngine On RequireTLS
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Sutrumpinti URL, nerodant www.
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] EnforceFirstHostname
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Programinės sintaksės painiava nėra opi įmonėms, samdančioms etatinį serverių tvarkybos specialistą, bet aš noriu susigaudyti ir pats — būti tikras tuo, ką darau. Nemėgstu, kai kas nors daroma sudėtingai ten, kur galima paprastai. Juolab, kad pernelyg protingais įrašais pirmiausia pergudrausi save — sunku bus iškart pastebėti ir paties netyčia įveltą klaidą.

„Hiawatha“ kūrėjas Ugas Leisinkis (Hugo Leisink) gal kuklinasi, sakydamas „pirmiausia — saugumas“ (security first). Nes toks atidumas rodo skaidrų jo samprotavimą, lemia ir kitus, serveriui ne mažiau svarbius dalykus: 2) švarą, 3) patvarumą, 4) pajėgumą, 5) spartą, 6) lengvumą, 7) aiškumą žmoniškai serverio priežiūrai.

Modernumas man čia kažkaip liko tik aštuntoje vietoje, bet ne dėl „Hiawathos“ atsilikimo — serveris veikia pažangiomis HTTPS technologijomis atvirais standartais:

  • HTTP digest authentication, ChallengeClient, FileHashes, Keep-alive, Pipelining, MultiThreading, ThreadPool, TrafficShaping, WebFirewall;
  • XSLTXML medžiagai doroti;
  • IPv6 — išplėstai interneto adresų aibei;
  • SNI — keliems serveriams su TLS savais vardais vienu IP adresu;
  • mbedTLS ryšiui šifruoti paskirai, su HSTS nukreipimu ir su ISRG CA tapatumo liudijimais — automatiškai ir nemokamai;
  • WebDAV su CalDAV, CardDAV, ownCloud, Nextcloud palaikymu;
  • CGI su CGI-wrapper, SSI su SSI-CGI, FastCGI su PHP-FPM — programinės sąsajos;
  • folder alias ir script alias su chroot, enforce, require;
  • URL Toolkit — regex taisyklėms su call, deny, expire, goto, header, match, method, return, redirect, request, rewrite, skip, use;
  • jungimosi taisyklės (count, size, time, regex) su savais šaukiniais ir draudimais (custom variables, banning settings);
  • antpuolių atpažinimas ir sutramdymas: DDoS, CSRF/XSRF, XSS attacks, RFI, SQLI injections, exploit attempts, control of external image linking, throttle some file upload speed;
  • laipsniškumas (scalability) — paskirai suderinamos nuostatos 1) default website, 2) binding interfaces for LAN, IP, port, 3) virtual hosts, 4) directory settings, 5) .hiawatha files aprašais;
  • kitos pajėgumo ir HA patvarumo priemonės: GZip HTTP compression, internal cache, reverse proxy, load balancing;
  • kiti, nebūtini priedai: Tomahawk, Wigwam, Hiawatha Monitor (atskiras stebėjimo serveris, gali būti nuotolinis), Banshee (WWW leidybos staklės);
  • 6 paskiri serverio darbo žurnalai: access.log, errors.log, garbage.log, exploit.log, pass.log, system.log savu, bendru arba išplėstiniu formatais.

Nemažai „Hiawatha“ savybių unikalios, kurių neturi jokie kiti HTTP serveriai. Daugiausia tokių gabumų skirta apsisaugoti nuo nenaudėlių, tačiau netrukdant kitiems lankytojams. Autorius jas sumanęs ir sukūręs pats, iš pradžių išsibandyti, o įdiegęs tik po metų kitų, veiksmingumui pasitvirtinus gyvenime. Susirašiau tokią savą galinčių praversti nustatymų ir jų pradinių reikšmių atmintinę.

Ribojimai ( = default)
#AccessList = allow all allow 192.168.0.1, deny all
#BindingId = kai sąsajų ne viena
#Interface = 127.0.0.1 sąsajai (binding section)
#RequireTLS = no yes, 2678400 (HSTS virtualiam serveriui)
#RequiredBinding = virtualiam serveriui
ConnectionsTotal = 1000
ConnectionsPerIP = 15
MaxRequestSize = 2048 KB sąsajai (in binding section)
MaxKeepAlive = 50 sąsajai (in binding section)
#MaxServerLoad = 1 pvz. 0.7 — iki 70%
MaxUploadSize = 1 MB, iki 2047 (binding)
MaxUrlLength = 1000 0 neribotų, o viršijus — 414 HTTP error code
#MinTLSversion = 1.2 global configuration
ReconnectDelay = 0
SocketSendTimeout = 3 3 s pradinis sulaikymas (0 jį išjungtų)
TimeForRequest = 5, 30 pirmajam, sekantiems kreipiniams (binding)
ThreadPoolSize = 25 128, gijų skaičius jų pluošte
ThreadKillRate = 1 8
TimeForCGI = 5 iki penkių sekundžių
Draudimai
ExecuteCGI = no virtualiam serveriui arba aplankui
#BanOnDeniedBody = 0 tik kai nustatytas DenyBody = ‘regex’
BanOnFlooding = -/-:0 10/1:15 (15 s bauda už 10/s)
BanOnGarbage = 0 300
BanOnInvalidURL = 0 2
BanOnMaxPerIP = 2 60
BanOnMaxReqSize = 0 300
BanOnSQLi = 0
BanOnTimeout = 0
BanOnWrongPassword = -:0 6:120 (dvi minuti už 6 klaidas)
KickOnBan = no
RebanDuringBan = no yes
PreventCSRF = no no, detect, prevent, block
PreventSQLi = no block tik laikinai, kol susitaisysi savo luošą SQL
PreventXSS = yes
KillTimedoutCGI = yes viršijus TimeForCGI = 5
#DenyBody = (regex)
#BanlistMask = allow 192.168.1.2, deny 192.168.0.0/16
Taupymas
CacheSize = 10 MB, iki 1024
CacheMaxFilesize = 256 KB
CacheRProxyExtensions = css, eot, gif, html, htm, ico, jpg, js, otf, png, svg, swf, txt, woff
ExpirePeriod = private 2 weeks, public (aplankui)
Slėpimas (arba apgaulė)
AnonymizeIP = no yes — neįrašytų lankytojų adresų į access.log
EnablePathInfo = no nerodo tako iki failo vietos
ShowIndex = no nerodo aplanko turinio
ServerString = Hiawatha pavyzdžiui: Apache
#RandomHeader = nuo 10 iki 1000
#RequestLimitMask = all deny SavasIP_1, deny PatikimasIP_2
#LogfileMask = deny 10.0.0.0/24, deny ManoIPv4
Savų šaukinių pavyzdžiai (own variables)
set Vietiniai = 127.0.0.0/8
set ManoIPv4 = 95.173.32.149
set PatikimasIP_1 =
set SavasIP_2 =
CustomHeaderClient = Vary: accept-encoding
CustomHeaderClient = Content-Security-Policy: base-uri ‘self’
CustomHeaderBackend = X-Custom-Header: nuostata
ReverseProxy .* http://10.20.20.18:80 30 keep-alive
ReverseProxy .* https://10.20.20.18:443 30 keep-alive
#LoginMessage = scanner.robotas.tld
#PasswordFile = digest:/srv/www/digest/scanner.digest

Atleiskite, rašydamas praleidau svarbią Ugo nuostatą, jo požiūriu pačią pradinę sąlygą — serveris neturi užsiiminėti nesavais darbais! Nes dabartiniai WWW serveriai rungtyniauja rinkoje atliekamų taikomųjų programų skaičiumi (ir atitinkamu savo viršsvoriu), užuot pasirūpinę visapusišku, tiksliu ir švariu HTTP užklausų aptarnavimu.

Rimas sukūrė ir įdiegė patogų ir vaizdų serverio valdymo Webmin skydelį, jo atvirą kodą paskelbė Git registre ir pranešė serverio autoriui — Ugas įvertino, padėkojo Rimui, išplatino gerą naujieną savo sekėjams.

Webmin-Hiawatha Hiawatha-Webmin

Rimo Kudelio sukurtas „Webmin“ skydelis „Hiawatha“ serveriui

Juokingai dabar atrodo serverių tvarkytojų atsikalbinėjimai, neva „Apačius“ labiausiai ištobulintas ir patikimiausias, o „Hiawatha“ mat nepatikima, nes… sukurta vieno žmogaus. Tarsi pasitikėti būtų galima bendra atsakomybe, kai kompetentingų pareigūnų daugybė, bet prireikus nėra su kuo šnekėti — neseka rasti, kas išmanytų atsakyti tau kilusio klausimo.

Priešingai, svarbiausi išradimai būna sumanyti pavienių asmenų, daugumai jais netikint tol, kol įgyvendinus netampa įprasti ir pripažinti daugumos. Kaip gali pradingti ar tapti bevertis tvarinys net autoriui pasimirus, jei jo programinis kodas atviras? Juolab, kai tas kodas nesveria nė pusės megabaito. Tęstinumą ir perimamumą lemia šios svarbios sąlygos:

  1. pasiekiamas, suprantamas ir atviras kodas (GPL licencija);
  2. kruopštus dokumentavimas: išsamus savybių aprašas (specification), vadovėlis (manual), pamokos (how to), dažnų klausimų išaiškinimai (FAQ);
  3. pristatymas enciklopedijoje, palyginimas, pokyčių tikslinimas laiku;
  4. dalijimasis patyrimu ir naujovėmis, jų aptarinėjimas: Weblog, Twitter, Forum, Email;
  5. pagalba tiesiogiai, asmeniniu autoriaus pašto adresu vardas@pavardė.net.

Ugo patikimumu jau esu įsitikinęs: kiek kartų besikreipiau iškilusiu klausimu, autorius atsakė visada, visada netrukus, visada atidžiai ir dalykiškai, dažniausiai asmeniniu paštu.

Nematau pagrindo nepasikliauti ir kūrinio bei jo autoriaus gerbėjų, serverių meistrų bendruomene, atsiliepiančia apie „Hiawathą“ pačiais aukščiausiais įvertinimais: www.hiawatha-webserver.org/about.

Vladas Palubinskas

Hiawatha logo
Santrauka:

2016 m. rudenį patyrinėjau HTTP serverių rinką ir „Apačių“ pakeičiau „NginX“, bet išsibandęs netrukus ir jį pakeičiau niekam negirdėta, nė specialistams nežinoma, tikriausiai pirmąja Lietuvoje „Hiawatha“. Todėl čia išguldžiau palyginimo duomenis, paaiškinimą, kuo ydingi kiti serveriai ir kuo išsiskiria „Hiawatha“ — švara, patvarumu, pajėgumu, pažangiomis technologijomis, o ypač aiškumu ir žmoniškumu.

Teiginys:
Hiawatha išsiskiria švara, patvarumu ir žmoniškumu.
Sritis:
: .
Raktažodžiai:
, , .
Asmenvardžiai:
Rimas Kudelis, Hugo Leisink, Chris Wadge.
Kiti tikriniai daiktavardžiai:
Apache, Cherokee, G-wan, Hiawatha, Lighttpd, NginX, OLS.
Pirminis šaltinis:
http://on.lt/hiawatha
Nuosavybė:
leidžiama neatsiklausus nusirašyti ištrauką su nuoroda į pirminį šaltinį ir autorių.
Autorius:
, 2016-12-09.