Apache 1
Ez a tartalom a sorozat része:
Vigyázz az új cikkekre ebben a sorozatban.
Gyakran előfordul, amely magában foglalja, egyrészt - a felhasználó a böngésző, a másik - egy távoli webszerver, az alábbi események: a felhasználó rákattint a böngésző a link egy kérést küld egy web szerver, ami azt kivonja az adott dokumentumot, és a dokumentum tartalmát visszaadja a távoli ügyfélnek.
1. Apache 1.x felépítése
Az ügyfélkérés több lépést tesz az Apache-ban:
Minden fázist saját Apache modul vezérel.


Minden egyes kérés esetén az Apache kernel létrehoz egy request_rec struktúraobjektumot, amelyet ezután átmegy a megfelelő modulra, és egy módosított verzióban fogadja.
Az alábbi ábrán részletesebben bemutatjuk az Apache architektúrát. Kis funkcionális modulok - ap, regex, amelyeket mind a kernel, mind az alapmodulok használnak. Egy különálló operációs modul hajtja végre az Apache több platformot.


A forrásfa közelebbi vizsgálatakor világossá válik:
- Az összes fejléc a beillesztési könyvtárba van csoportosítva.
- A rendszermag a fő könyvtárban van (libmain.a).
- Az alapmodulok a modulkönyvtárban találhatók (libstandard.a).
- A cross-platform megvalósítása az os könyvtárban található, amely magában foglalja a megfelelő alkönyvtárakat, mindegyiknek saját os.h. (Libos.a).
- A szabályos kifejezésekkel való munkához egy külön könyvtárkomponens van a regex könyvtárban (libregex.a).
- Egy különálló komponens az ap könyvtárban található, és számos funkciót (libap.a) tartalmaz.
- Külön alkatrész fekszik a support könyvtárat és parancsfájlokat és kódot Apache támogatási programok, mint a forgása naplófájlok, a manipuláció a jelszó fájlok, stb
- A segédkönyvtár tartalmazza az Apache fordításakor használt szkripteket.
Szinte az összes funkciónak van ap_ előtagja, ezt az 1.3 verzióban vezették be, hogy elkerüljék a névkonfliktust az 1.2-es verzióról való váltáskor.
2. Apache fő architektúra 1
A rendszermag kód a főkönyvtárban található. A rendszermagot úgy fejlesztették ki, hogy figyelembe véve, hogy bárki, aki az Apache funkcionalitását kívánja kiterjeszteni, ha lehetséges, nem érintette meg a rendszermag kódját, amely már tartalmaz minden ilyen kiterjesztési lehetőséget. A módosítható kernel egyetlen belső összetevője a HTTP protokoll végrehajtása.


3. Apache modulok
A modulok végrehajtják az Apache funkcionalitását. A modulok közvetlenül kommunikálhatnak a rendszermaggal, de nem tudnak közvetlenül kommunikálni egymással. Minden modul valójában egy HTTP-kérelem különböző fázisainak kezelője. Az alábbi ábra részletes áttekintést ad a modul felépítéséről. Egy modul a rendszermag által hívott kezelői függvények gyűjteménye. Mindegyik modulnak saját szerkezete van, amelyet modulnak neveznek, és amely a mutatókat a kezelők számára tárolja, és minden modul átmásolja a struktúra objektumát a rendszermagba.


Minden egyes modult a kernelnek inicializálnia kell. Elméletileg bármely modul használhatja a felhasználó által a konfigurációs fájlban előírt parancsokat. A rendszermag elolvassa a fájlt, majd a modulstruktúrában kapott modul parancssorából leképezi őket. A táblázat minden sorából egy pár áll: a tartalom típusa egy mutató a kezelőhöz, ahol a tartalom típusa a MIME típus.
Az ügyfelek közvetlen adatküldéssel foglalkozó kezelőit tartalomkezelőnek vagy válaszkezelőnek nevezik. Minden objektumnak van saját kezelője.
Az Apache-ban az összes modul a modulok könyvtárába van csoportosítva. A szabványos modulok a szabványos alkönyvtárba vannak csoportosítva. a proxy végrehajtása a proxy könyvtárban található. A példák könyvtárában csak egy kezelővel rendelkező demómodul található.
Minden szabványos modul statikusan van betöltve, bár dinamikus betöltés lehetséges: ezek a rendszermaghoz kapcsolódnak, és így tovább. Amikor Apache telepítve van, a konfiguráció elindításakor létrejön egy olyan modul, ami a modules.c nevű fájlból áll, amely 2 mutatócsoportot definiál moduláris struktúrákhoz:
Ebben az esetben az összes felsorolt modul a következő csoportokra osztható:
4. Párhuzamosság
Az indításkor az Apache létrehozza (villa) az öt fő folyamat alapértelmezését, ez a minimális számú folyamat. Mindegyik folyamat támogathatja legalább 50 szálat (szál - ha az operációs rendszer támogatja a multithreadelést). Minden ügyfelkéréshez egy folyamatot osztunk meg. Van egy speciális struktúra - eredménytábla - amely minden folyamat állapotát tárolja. A több egyidejű lehetséges alapértelmezett folyamatok - 5 és 10 maximális számát az ilyen eljárások - 256. Van is egy különleges hely várja kéréseket, ami nincs helye a eredményjelző. Az ilyen sorok maximális hossza 511.
A párhuzamos ügyfélkapcsolatok maximális száma 100.
5. Adatszerkezetek
Az alábbi ábra a kliens kérés különböző fázisainak időzítési diagramját mutatja, míg a fő munkát a kernelben, a http_request.c fájlban végezzük.


Amikor egy kezelőt hívunk meg, minden modul ugyanazt a nyilvános struktúrát, request_rec paramétert kapja paraméterként. Ebben az esetben a struktúra különböző területeinek állapota megváltozhat. A válaszkezelők visszaadják a tartalmat az ügyfélnek. A kezelő egy másik al-lekérdezést is végrehajthat. A request_rec struktúra tartalmazhat egy mutatót egy másik request_rec struktúrára abban az esetben, ha egy átirányítás történik, és egy al-lekérdezés esetén a mutató önmagára mutathat. Az átirányítás azt jelenti, hogy egy képkezelőt hív fel egy dokumentumban vagy egy CGI-parancsfájlt hív. Ez felhívja az ap_internal_redirect kezelőt, amely egy új request_rec objektumot hoz létre. Egy ilyen objektum elhelyezhető a lekérdezett listában request_recs.
A request_rec struktúra a következő mezőket tartalmazza:
- mutatók más request_rec;
- mutató az erőforrás-poolhoz;
- objektumok kérése:
- URI
- fájlnév
- útvonal
- információk a tartalomról:
- tartalomtípus
- kódolás
- MIME fejlécek;
- kérjen információkat:
- protokoll
- módszer
A következő a minta reprezentációja a request_rec struktúrában a leggyakrabban használt mezőkkel:
Az Apache erőforráscsoportot használ - pool - olyan adatszerkezet, amely tárolja a lekérdezés összes hozzárendelt forrásának listáját. Amikor a kérés feldolgozása befejeződik, a kérelemre felhasznált valamennyi erőforrás felszabadul. A modulok a saját igényeiknek megfelelő saját medencékkel rendelkezhetnek.
Amint már említettük, a kernel tárolja a konfigurációs parancsok tábláját. Minden modulnak is lehet saját parancssora. Minden parancs a command_struct struktúra objektumát tartalmazza, és a következőket tartalmazza:
- a csapat neve;
- mutató a kezelő funkcióhoz;
- az érv elhaladt;
- inicializálási feltételek;
- típusa és száma;
- az érvek leírása;
Az eredménytábla szerkezete megőrzi a feldolgozott kérelmek listáját. A kérés állapotát és idét tárolja. Minden egyes új folyamat esetében egy rekord kerül hozzáadásra az eredménytáblához, amelyet a kérelem feldolgozása után töröltek. A folyamat státusát ebben a struktúrában a folyamat maga módosítja. A kérés állapota a következő értékeket érheti el:
6. A válaszkezelő
A legtöbb kezelő eredménye a kérés_rec struktúra mezők értékének banális változására vagy a speciális kódok visszaadására korlátozódik. Ugyanaz a kezelő valós adatokat küld az ügyfélnek. Kezdetben az ügyfél HTTP fejlécet küld a send_http_header függvény használatával. Ha a kérelemnek címke van header_only, akkor az ügyfél nem küld többet. Ellenkező esetben az ügyfél elküldi az üzenetet, erre a célra speciális primitíveket használnak rputc, rprintf, send_fd. A következő kód a GET kérelem feldolgozását és az adatoknak az ügyfél részére történő elküldését mutatja:
Ez a függvény egy hibakódot vagy egy OK-t ad vissza, a második esetben az átirányítást egy másik kezelőnek nevezik a belső_redirect használatával.
A medence segítségével megoldott fő probléma a memória szivárgás megelőzése.
Az Apache medencét úgy tervezték meg, hogy minden erőforrás - memória, leírók stb. - automatikusan megtörténik az ügyfél kérésének feldolgozása után. Mindegyik ilyen kérést a pool-struktúra által képviselt saját medencét osztják el. A feldolgozás után ez a pool törlődik.
Az Apache indításakor egy speciális készlet van kiválasztva - a konfigurációs pool. A kiszolgáló újraindításakor ez a pool is törlődik.
A memóriát a palloc segítségével osztjuk meg, amely gyorsabb, mint a malloc. Ez a funkció 2 argumentummal rendelkezik - mutató a medencéhez és az elosztott memória összege:
A pfree funkció nincs jelen, mivel a memória automatikusan felszabadul, amikor a medence felszabadul. Vannak speciális alkalmazásfunkciók, amelyek felosztják a memóriát. Például a következő példában a pstrcat függvény 8 bájtos karakterlánc modulra osztja a memóriát:
Hasonlóképpen megnyitják a fájlokat is:
A memóriával való munkától eltérően a megfelelő záró funkció a pfclose.
A memóriaelosztási modell közös hátránya a beágyazott medencék. Olyan helyzetet szimulálhat, amelyben a szülői medence a gyermekmedence előtt felszabadul, és ez utóbbi esetben memóriazavar keletkezhet. Például egy magasan fészkelő szerverkatalógus-listát említhet. Ebben az esetben a make_sub_pool használatához almintákat kell létrehoznia.
A medence bármikor szabadítható fel clear_pool vagy destroy_pool segítségével.
Subqueries esetén a destroy_sub_request a memória biztonságos leállítására szolgál.
8. Konfiguráció
Az első Apache-ot azzal a céllal fejlesztették ki, hogy maximális kompatibilitást biztosítson az elődjével - az NCSA 1.3 webszerverrel - a konfigurációs fájlok olvasása szempontjából. A feladat az volt, hogy a funkcionalitást a kerneltől a modulokig kihasználja. Ehhez egy speciális parancssort hoztak létre a rendszermagban. A fájl típusának definíciói az utótagdal az AddType és az DefaultType konfigurációs irányelvek alapján készülnek.
A fájlrendszerrel való együttműködés az Aliases and Redirect direktívákkal történik.
A beágyazott konfigurációs fájlokkal végzett munka a .htaccess fájlok alapján történik.
Amikor a szerver egy direktívet olvas a fájlban
Az AddType és AddEncoding parancsok általában a .htaccess fájlban vannak jelen.
Egy ilyen struktúra létrehozásához két paraméterre van szükség: a pool és a könyvtár neve:
Ha az általunk olvasott kiszolgálói könyvtárban van egy alkönyvtár, és létezik saját .htaccess, akkor két struktúrát kell összeállítanunk:
következtetés
Építészet első Apache a funkciók - minden funkció ap_ prefix végrehajtása cross-platform alapján készült az egyes modulok, a modulok nem tudnak kommunikálni egymással, de csak a mag, az összes modul lehet osztani a hét fő csoport: Broadcast, hitelesítés, MIME, fix -ups, tartalom generátorok, naplózás, proxy. A memóriakezelést poolok alapján hajtják végre. A rendszerkonfigurációnak számos lehetősége van a kiszolgáló elő konfigurálására.