SQUID - proxy cache szolgáltatás felsőfokon



Kolics Bertold - MTA-SzTAKI/ASZI


A World Wide Web sikerének köszönhetően a gerinchálózatok sávszélességének legnagyobb fogyasztójává lépett elő a web átviteli protokollja: a HTTP.
A megnövekedett igények ésszerűbb sávszélesség-gazdálkodásra ösztönözték a hálózat gazdáit: a népszerű, gyakran látogatott oldalakat ideiglenes tárolókban, un. cache-ekben kezdték el tárolni. Az előadás a UNIX világban leginkább elterjedt, nyílt forráskódú proxy cache implementáció, a Squid bemutatását célozza meg. A szoftver alapvető konfigurálásán túl sor kerül a cache szolgáltatás bevezetésével kapcsolatos problémakörök ismertetésére, ötleteket ismerhet meg a hallgatóság az ideális hardware/szoftver beállításról, illetve a szoftver Linux környezetben való használatáról.

Tartalomjegyzék


1. Bevezetés

A Squid az 1996-ban lezáródott Harvest projekt keretében elkészült szoftver proxy cache részén alapul. A kód az elmúlt időszakban sokat változott, a kérések feldolgozásának alapja azonban ugyanaz maradt: egyetlen, blokkolásmentes, I/O alapon vezérelt processz végzi el a feladatok nagy részét.
A szoftver fejlesztését Duane Wessels (NLANR [2] munkatársa) fogja össze, és -mivel nyílt forráskódú szoftverről van szó- a kód javításában, fejlesztésében sok önkéntes is részt vesz. Külön megemlítendő, hogy a kód több olyan kísérleti részt is tartalmaz, amely a jelenleg még kiforratlan technológiáknak próbál táptalajt biztosítani. A Squid az egyedüli a nyílt forráskódú proxy cache termékek között, amely gazdag funkcionalitása révén- rendkívül sokrétűen használható, konfigurálható, legtöbb operációs rendszeren futtatható, legjobb teljesítményt nyújtja. Nem elhanyagolható szempont, hogy a felhasználók részére létrehozott levelezési listán [3] rövid időn belül hathatós választ kapunk jól megfogalmazott kérdéseinkre.

2. A web gyorsítókról általában

A motiváció

A web gyorsítók szükségességét a HTTP protokoll [4] egyik alapvető problémája indokolja, mégpedig a skálázhatóság hiánya. A HTTP is az egyszerű kliens-szerver architektúrára épít, a skálázhatóságra a protokoll első verziói nem is helyeztek megfelelően nagy hangsúlyt. A web népszerűségével, használatának terjedésével a gerinchálózatok terhelése rohamosan megnőtt: a web megjelenése előtt nem volt olyan információs rendszer, amely a szövegestől eltérő adattípusokra ilyen jelentős mértékben épített volna. A HTML nyelv fejlesztésének, kifinomultabbá válásának köszönhetően az egy-egy oldalon található információk byte-ban mért mennyisége is folyamatosan nő. Alapelvek

A web gyorsító a HTTP kommunikációs láncban a kliens -pl. web böngésző- illetve a web szerver között helyezkedik el. Amennyiben a böngésző által kért objektum (értsd: URL-lel [5,6] egyedileg azonosítható entitás, pl. egy web lapon az adott cég logo-ja) megtalálható a gyorsító helyi tárolójában, és az megfelel a frissességi kritériumoknak, akkor a kliens az objektumot a gyorsítótárból (cache-ből) fogja megkapni. Ellenkező esetben a gyorsító az adott objektumot közvetlenül letölti a forrás szervertől, vagy érvényesíti a nála lévő objektumot a forrás szervernél, ill. hierarchiába szervezett gyorsító esetén a hierarchia tagjaitól is kezdeményezheti az objektum letöltését.

Web kiszolgáló

Gyorsító típusok

A HTTP kommunikációs láncban betöltött helyének megfelelően többfajta gyorsítótárat különböztetünk meg:

böngésző oldali gyorsítótár (browser cache): csak az adott felhasználó által látogatott, cacheelhető objektumokat tartalmazza.
proxy cache (ezt fordítottam web gyorsítónak): több felhasználó/kliens által használt közös gyorsítótár.
Találati arány

Egy web gyorsító jellemzésekor az egyik legfontosabb paraméter a találati arány, amelyből két típust különböztetünk meg:

dokumentum találati arány (document hit rate): a gyorsítótárból kiszolgált és az összes lekérdezett objektum aránya.

byte találati arány (byte hit rate): a gyorsítótárból kiszolgált objektumok mérete az összes lekérdezett objektum méretéhez képest.

Dokumentum találati arány esetén a 40-50% közötti érték, byte találati arány esetén pedig a 30-40% közötti érték kifejezetten jónak mondható.

Transzparens cache-elés

Transzparens módban működik a web gyorsítótár, ha (a proxy autentikáció kivételével) meghatározott web forgalmat automatikusan a gyorsítótár fogja kiszolgálni függetlenül attól, hogy ezt a kliens kérte vagy sem. Transzparens cache-elés esetén tehát a cache (vagy az azt futtató rendszer, vagy akár egy másik eszköz) a web-es kéréseket a gyorsítótár felé írányítják, és azok automatikusan a cache által kerülnek kiszolgálásra. Ez esetben tehát a böngészőn semmit sem kell beállítani a cache használatához.

Gyorsítótár implementációk

Web gyorsítótárként meghatározott operációs rendszereken futó szoftvert (pl. Squid, NetCache, Netscape Proxy Server, Inktomi Traffic Server), vagy akár célhardware-t is használhatunk (pl. NetApp, Novell ICS, Cisco Cache Engine, DynaCache).

3. Linux és a Squid

A Squid egyszerűen és könnyen lefordítható a legtöbb UNIX-os operációs rendszeren, így Linux-on is. Linux-on még az az előnye is megvan az átlagos felhasználónak, hogy a fordítással nem kell bajlódnia, kivéve ha speciális igényei vannak a szoftverrel szemben.

Az előre csomagolt Squid

A szoftvert nem túl egyszerű csomagolni bármely Linux disztribúcióról is legyen szó, mivel a csomag készítésekor csak az általában használt lehetőségeket fordítják bele a bináris változatba és a Squid-nek több olyan fordítási opciója van, amelyre adott esetben szükségünk lehet. Így ha valamilyen kétségünk van, legegyszerűbb a szoftver forrását letölteni egy közeli tükörszerverről [7] és igényeinknek megfelelően lefordítani, majd pedig telepíteni.

Linux specifikus jótanácsok

'noatime' mount opció

A Squid által tárolt objektumokat érdemes külön partíció(k)ra tenni. Így lehetőség nyílik arra, hogy az adott partícióra beállítsuk a 'noatime' mount opciót, amelynek révén a Squid által generált rengeteg írási műveletet csökkenthetjük le: az opció beállításakor ugyanis az adott partíción olvasott file-ok access time értékét nem frissíti az operációs rendszer.

Állományleírók processzenkénti maximális száma

A szoftver a kliens- és a szerveroldali kommunikációt, ill. a file-rendszeren történő műveleteket állományleírók (file descriptor) segítségével végzi. Forgalmas cache szerver esetén a Linux által alapértelmezésben felkínált 256 állományleíró kevés lehet. Ennek növelését 2.2.x-es kernel esetén a '/proc/sys/fs/file-max'-ba írt 256-nál nagyobb értékkel érhetjük el. Ahhoz, hogy a változást az auto-konfiguráló is érzékelje, szükséges még a '/usr/include/linux/limits.h'-ban az OPEN_MAX értékét is ugyanerre beállítani. Átirányítás 'ipchains' segítségével

Forgalomátirányításra transzparens mód használata esetén van szükségünk. Ha a szerver router funkciókat is ellát, akkor a legegyszerűbb a standard HTTP portra (80-as TCP port) irányuló forgalmat a Squid-hez átirányítani, például:
# a loopback interfészen mindent elfogadunk
/sbin/ipchains -A input -j ACCEPT -i lo
# a saját IP címre irányuló web-es forgalmat elfogadjuk
# a hurkok elkerülése végett
/sbin/ipchains -A input -j ACCEPT -p tcp -d  80
# az összes egyéb 80-as portra irányuló forgalmat átirányítjuk a Squid-hez
/sbin/ipchains -A input -j REDIRECT 80 -p tcp -s 0/0 -d 0/0 80
A forgalomátirányítás tökéletes működéséhez természetesen a megfelelően konfigurált kernelt kell futtatnunk ('IP: firewalling', 'IP: always defragment', 'IP: transparent proxy support' kernel konfigurálási opciók).

Forgalom blokkolás 'ipchains'-szel

A cache használatának kikényszerítését a web-es forgalom blokkolásával is elérhetjük. A külső web kiszolgálókat csak a cache szerverünk láthatja. Például:
# a cache-től származó forgalmat minden további nélkül átengedjük
/sbin/ipchains -A input -j ACCEPT -p tcp -s 
# az összes egyéb 80-as TCP portra irányuló forgalmat gátoljuk
/sbin/ipchains -A input -j REJECT -p tcp -d 0/0 80

4. Konfigurálási példák

A konfigurálási problémákat három különböző példán keresztül szeretném megvilágítani. A konfiguráláshoz a szoftver 2.2STABLE4-es változatát vettem alapul. Ha elkészítettük a végleges konfigurációs file-t, akkor érdemes a magyarázószövegeket kivágni az egyébként is terjedelmes állományból, hiszen az eredeti 'squid.conf.default' tartalmazni fogja mindig az aktuális, magyarázó szövegekkel ellátott konfigurációt.

Alapkonfiguráció

Alapkonfigurációként vegyünk egy önálló (nem hierarchiába kapcsolt) Squid szervert, amely egy hálózati interfésszel (és egy IP címmel) rendelkezik. A gép fizikai memóriája 64 MB RAM, cache-elésre 30 MB RAM-ot, ill. az objektumok tárolására 1 GB diszkterületet lehet használni. A cache-hez való hozzáférés jogosultságának ellen orzését a kliens IP címe alapján végezzük. A gépen futó Squid monitorozását SNMPv1 segítségével a lokális gépen végezzük. Továbbá a Squid által generált hibaüzeneteket szeretnénk magyar nyelven látni. Ha saját magunk készítjük el a bináris kódot, akkor az auto-konfiguráló szkriptet a következő paraméterekkel hívjuk meg: '­enable-snmp ­enable-err-language-Hungarian'. A következő paramétereket érdemes beállítani (ami alapértelmezésben adott, azt nem érdemes módosítani, ill. nem is szükséges a konfigurációs file-ba belefoglalni):
# A 'cgi-bin', ill. '?' karaktereket tartalmazó URL-eken található
# objektumokat nem cache-eljük
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
# a kiszolgálás alatt lévő kérések, a 'negatívan' cache-elt kérések (hibás
# kérések), ill. a leggyakrabban lekérdezett objektumok számára
# fenntartott hely. Ökölszabály: osszd el a Squid számára fenntartott
# memóriarészt 3-mal. Ld. még 5.2.
cache_mem 10 MB
# lehetőleg a Squid objektumait külön partícióra tegyük (pl. /var/cache)
cache_dir /var/cache 1024 16 256
# hozzáférés konfiguráció
acl mycustomer src 192.168.0.0/255.255.0.0
http_access allow mycustomer
http_access deny all
icp_access allow mycustomer
icp_access deny all
# Squid-et futtató felhasználó (könyvtár jogosultságokra figyelni!)
cache_effective_user nobody
cache_effective_group nobody
# SNMP hozzáférés beállítása
snmp_access allow public localhost
snmp_access deny all
A többi beállítás változtatása az első nekifutásra teljesen felesleges. Ha már otthonosan érezzük magunkat a szoftver konfigurálásában, csak akkor veselkedjünk neki a többi opciónak is.

Alapkonfiguráció és böngészők automatikuskonfigurálása

Ebben az esetben valójában nem a Squid-et, hanem a böngészők konfigurálását elvégző PAC szkriptet (Proxy Automatic Configuration [9]) kell elkészíteni, majd a szkriptet egy megfelelő web kiszolgálóra kell telepíteni, amely ezt az állományt 'application/xns-proxy-autoconfig' típusként jelöli meg az állomány letöltésekor. Az automatikus konfigurációnak két lényeges előnye van a böngészők manuális konfigurálásával szemben:

Továbbá egy jól megírt PAC szkripttel a cache-ünket is tehermentesíthetjük a felesleges forgalomtól. Egy egyszerű PAC szkript a következőképpen néz ki:

function FindProxyForURL(url, host)
{// ha nincs teljes szervernév megadva, vagy pedig a saját
// régiónkban (mydomain.hu) lévő szervert kérdezünk le,
// akkor közvetlen a hozzáférés if (isPlainHostName(host)
	 || dnsDomainIs(host, "mydomain.hu") || return "DIRECT";
// ha a kiszolgálónév nem feloldható DNS oldalról,
// akkor is közvetlenül próbálkozunk. Ennek két oka van:
// - egyrészt a cache-t nem terheljük egyébként sem feloldható nevekkel
// - másrészt a felhasználó a saját böngészője hibaüzenetét látja,
// így még csak véletlenül sem hibáztatják a cache üzemeltetőjét
// Optimális működés esetén persze a böngészők is ugyanazt a DNS
// szervert használják, mint a cache (így a cache munkáját is
// megkönnyítik, hiszen mire a kérés oda eljut, a helyi DNS
// szerver már tartalmazza a kívánt információkat).

		if (!isResolvable(host))
            return "DIRECT";

// ha az URL tartalmaz kerdőjelet, akkor is közvetlenül
// próbálkozunk, hiszen az ilyen típusú kérések általában nem
// is cache-elhetők

            if (url.indexOf("?") != -1)
            return "DIRECT";

// csak akkor használunk cache-t, ha HTTP, FTP vagy Gopher
// protokollokról van szó, hiszen csak ezeket képes cache-elni
// a Squid (a cache.mydomain.hu helyére természetesen a saját
// cache-ünk nevét kell beírni)

             if (url.substring(0, 5) == "http:" ||
             url.substring(0, 4) == "ftp:"||
             url.substring(0, 7) == "gopher:")
             return "PROXY cache.mydomain.hu:3128; DIRECT";
}


Apache web szerver esetén a típus beállítást a következőképpen tehetjük meg, feltéve, hogy a PAC szkriptet ".pac" kiterjesztéssel helyezzük el a Web szerver könyvtárstruktúrájában:

    AddType application/x-ns-proxy-autoconfig .pac
Alapkonfiguráció + Transzparens konfigurálás

Amennyiben cache-ünket transzparens módban szeretnénk futtatni, akkor az alapkonfigurációhoz a következő beállításokat érdemes hozzátenni:

      httpd_accel_host virtual
      httpd_accel_port 80
      httpd_accel_with_proxy on
      httpd_accel_uses_host_header on
Természetesen előzőleg a kernelt megfelelően kell konfigurálni, és a Squid-hez való átirányítást végző ipchains szabályokat is érvényre kell juttatni (ld. 3.2).

5. Squid tuningolás

Általában a Squid működéséről annyit kell tudni, hogy alapvetően egy processzor hajtja végre a feladatok nagy részét (így nagy előny nem származik a több processzor használatából, inkább a gyorsabb processzorból), másrészt rendkívül sok diszk I/O-t végrehajtó applikációról van szó. Ha a Squid konfigurációjához hozzá kell nyúlni teljesítménybeli problémák miatt, akkor az esetek túlnyomó többségében diszkproblémákról van szó.

A diszk alrendszer

A cache-ben tárolt objektumok helyét gondosan meg kell választani, mivel nagy terhelés esetén a diszk alrendszer lassúsága jelentősen tudja befolyásolni a válaszidőt. Továbbá tudnunk kell, hogy általában a Unix-os filerendszerek nem a leg alkalmasabbak cache tárolóhelynek.

Alapvetően a következőket érdemes megfontolni: