VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ ÚSTAV TELEKOMUNIKACÍ FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION DEPARTMENT OF TELECOMMUNICATIONS
MONITOROVACÍ SYSTÉM APLIKACÍ A SYSTÉMU LINUXOVÝCH SERVERŮ
BAKALÁŘSKÁ PRÁCE BACHELOR’S THESIS
AUTOR PRÁCE AUTHOR
BRNO 2008
MARTIN JANOVSKÝ
VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ ÚSTAV TELEKOMUNIKACÍ FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION DEPARTMENT OF TELECOMMUNICATIONS
MONITOROVACÍ SYSTÉM APLIKACÍ A SYSTÉMU LINUXOVÝCH SERVERŮ MONITORING FOR APPLICATIONS AND SYSTEM OF LINUX SERVERS
BAKALÁŘSKÁ PRÁCE BACHELOR’S THESIS
AUTOR PRÁCE
MARTIN JANOVSKÝ
AUTHOR
VEDOUCÍ PRÁCE SUPERVISOR
BRNO 2008
ING. FILIP JANOVIČ
ZDE VLOŽIT LIST ZADÁNÍ
Z důvodu správného číslování stránek
ZDE VLOŽIT PRVNÍ LIST LICENČNÍ SMOUVY
Z důvodu správného číslování stránek
ZDE VLOŽIT DRUHÝ LIST LICENČNÍ SMOUVY
Z důvodu správného číslování stránek
ABSTRAKT Bakalářská práce řeší problém dohledu nad vzdálenými linuxovými servery. Vysvětluje technologie, které jsou pro sledování serverů použity a dále popisuje aplikaci samotnou. Hlavním problémem při vzdáleném monitoringu je skutečnost, že každý server musí být kontrolován zvlášť. Toto vykonává centrální server vybavený webovým serverem s podporou jazyka PHP a databází MySQL. Vytváří tedy rozhraní mezi uživatelem a servery. Na PHP, MySQL a SOAP zprávách je celá aplikace postavena. Server, který je sledován, je vybaven webovým serverem a aplikací pro automatické vykonávání úloh. Celá aplikace je pak postavena na výměně SOAP zpráv, které obsahují monitorovací informace. Tyto data jsou uchována v databázi a dále používána pro různé statistiky a grafy. Pomocí webového rozhraní na centrálním serveru se mohou jednotlivé informace vhodně zobrazovat. Toto rozhraní dále umožňuje provádět akce nad jednotlivými úlohami. Restartování či zastavení úlohy je při vzdálené správě často používáno. Přitom je samozřejmě kladen důraz na bezpečnost. Nejvhodnějším místem pro nasazení této aplikace je operátorské středisko nebo počítač administrátora. Určený uživatel má pak na monitoru zobrazeny všechny sledované servery. V případě nestandardního stavu úloh je okamžitě na tento stav upozorněn. Tuto situaci pak může okamžitě řešit.
KLÍČOVÁ SLOVA Linux, server, dohled, PHP, MySQL, SOAP
ABSTRACT Bachelor’s thesis solve the problem sight above distant Linux’s servers. She describes technology, that are used for following servers. Further is described application by herself. Main problem at distant sight is, that the oneself have to check every one server separately. This performs central server provided by web server with the support language PHP and database MySQL. Central server creates interface between user and servers. All application is built on PHP, MySQL and SOAP messages. Server, which is monitored, is equipped web server and application for automatic execute process. All application is then built on exchange SOAP messages, which contain monitoring information. These data are preserved in database and further used for various statistics and graphs. By the help of web interface on central server can be information suitable displayed. This interface makes it possible to do action above single processes. Restarted or stopping process is at distant management used frequently. Naturally is respect emphasis on safeness. Optimal place for placement these application is operator centre or administrator’s computer. Demand user has then displayed all monitored servers on monitor. On nonstandard state of process user is promptly alert. This situation he can promptly solve.
KEYWORDS Linux, server, monitoring, PHP, MySQL, SOAP
JANOVSKÝ M. Monitorovací systém aplikací a systému linuxových serverů. Brno: Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií. Ústav telekomunikací, 2008. 44 s., 2 s. příloh. Bakalářská práce. Vedoucí práce byl Ing. Filip Janovič.
PROHLÁŠENÍ Prohlašuji, že svou bakalářskou práci na téma „Monitorovací systém aplikací a systému linuxových serverůÿ jsem vypracoval samostatně pod vedením vedoucího bakalářské práce a s použitím odborné literatury a dalších informačních zdrojů, které jsou všechny citovány v práci a uvedeny v seznamu literatury na konci práce. Jako autor uvedené bakalářské práce dále prohlašuji, že v souvislosti s vytvořením této bakalářské práce jsem neporušil autorská práva třetích osob, zejména jsem nezasáhl nedovoleným způsobem do cizích autorských práv osobnostních a jsem si plně vědom následků porušení ustanovení § 11 a následujících autorského zákona č. 121/2000 Sb., včetně možných trestněprávních důsledků vyplývajících z ustanovení § 152 trestního zákona č. 140/1961 Sb.
V Brně dne
...............
.................................. (podpis autora)
PODĚKOVÁNÍ Děkuji vedoucímu bakalářské práce Ing. Filipu Janovičovi za velmi užitečnou metodickou pomoc a cenné rady při zpracování bakalářské práce.
V Brně dne
...............
.................................. (podpis autora)
OBSAH Úvod
11
1 Použité technologie 1.1 UNIX . . . . . . . . . 1.2 Linux . . . . . . . . . 1.3 Debian GNU/Linux . . 1.4 Bash . . . . . . . . . . 1.5 Sudo . . . . . . . . . . 1.6 Webový server . . . . . 1.7 PHP . . . . . . . . . . 1.7.1 Nastavení PHP 1.8 JpGraph . . . . . . . . 1.9 SOAP . . . . . . . . . 1.10 SQL . . . . . . . . . . 1.11 MySQL . . . . . . . . 1.12 Cron . . . . . . . . . .
. . . . . . . . . . . . .
12 12 13 14 14 15 15 17 17 19 19 21 21 22
. . . . . . . .
23 24 24 26 27 29 32 33 36
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
2 Výsledky studentské práce 2.1 Databáze . . . . . . . . . . . . . . . . 2.1.1 Struktura databáze . . . . . . . 2.1.2 Připojení k databázi . . . . . . 2.2 Skripty na straně admin serveru . . . . 2.2.1 Grafické rozhraní admin serveru 2.2.2 Grafy . . . . . . . . . . . . . . 2.3 Skripty sledovaného serveru . . . . . . 2.4 Nastavení a instalace . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . .
. . . . . . . .
3 Závěr
38
Literatura
39
Seznam symbolů, veličin a zkratek
41
Seznam příloh
44
A CD s SCadmin 1.1
45
SEZNAM OBRÁZKŮ 1.1 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10
Přístup k statickému a dynamickému obsahu webu. . . . . . Struktura tabulky users (uživatelé). . . . . . . . . . . . . . . Struktura tabulky servers (servery). . . . . . . . . . . . . . . Struktura tabulky services (úlohy). . . . . . . . . . . . . . . Struktura tabulky zatez (zátěž serverů). . . . . . . . . . . . Struktura tabulky dostupnost. . . . . . . . . . . . . . . . . . Přihlášení do webového rozhraní. . . . . . . . . . . . . . . . Náhled základní stránky systému. . . . . . . . . . . . . . . . Formát zobrazení procesů daného serveru. . . . . . . . . . . Příklad grafického zobrazení zátěže serveru. . . . . . . . . . Příklad grafického zobrazení zátěže serveru (nedostatek dat).
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
16 25 25 25 26 26 29 30 31 32 33
ÚVOD Cílem práce bylo vytvoření webového rozhraní, přes které bude uživatel moci jednoduše monitorovat jiné servery. Požadováno přitom bylo použití jazyku PHP a databáze MySQL. Toto sledování se sestává z monitorování procesů na serveru a monitorování systému samotného. Na serveru běžící proces či program bude dále popisován také jako úloha. Vychází se přitom z toho, že program je aplikace uložená na disku a proces či úloha je jeho spuštěná instance. Celá aplikace dostala název SCadmin1 jako zkratka označení Server Control Admin. Její grafická podoba je dána šablonou kaskádových stylů a je popsána dále. Její hlavní část uchovávající data běží na centrálním serveru (dále jen admin serveru2 ). Je tedy potřeba, aby na tomto admin serveru běžel webový server s podporou PHP a MySQL databází. Na monitorovaném serveru (dále jen sledovaný server3 ) musí běžet webový server s podporou PHP a démon Cron pro pravidelné spouštění úloh. Webový server je zde nutný, protože je využíván k samotné výměně dat mezi servery. V textu je řešen problém výhradně pro linuxovou distribuci Debian. Jednotlivé příkazy, umístění souborů či nastavení se mohou v jiných distribucích lišit. Označení stroj bude v textu užíváno pro server. Dostupnost serveru4 je dále popisována jako poměr vyřízených požadavků a všech požadavků směřujících na server. Celá aplikace byla testována na těchto verzích softwaru: • admin server – Ubuntu GNU/Linux 2.6.22 – Apache 2.2.4 – PHP 5.2.3 – PHP MySQL 5.0.45 • sledovaný server – Debian GNU/Linux 2.6.18 – Apache 2.0 – PHP 5.2.0 – Sudo 1.6.8p12
1
SCadmin 1.1 - Server Control admin 1.1 - název vytvořené aplikace admin server 3 sledovaný server 4 dostupnost serveru - jedno z vyjádření kvalit serveru 2
11
1
POUŽITÉ TECHNOLOGIE
V první kapitole jsou probrány technologie a aplikace, které byly použity pro tvorbu této práce. Jsou popisovány pouze s ohledem na jejich zapojení do celkové koncepce projektu. Je tedy popsána pouze problematika, která byla použita v řešení. Text vychází z mnoha informačních zdrojů zmíněných v části Literatura. Citace konkrétního pramene je vyznačena přímo v daném textu.
1.1
UNIX
Kořeny tohoto operačního systému sahají až do roku 1965, kdy společnosti Bell Telephone Laboratories(divize AT&T) a General Electric pracovaly na projektu s názvem Multics. Po rozdělení tohoto seskupení začala Bell Telephone Laboratories vyvíjet z OS Multics operační systém vlastní a dala tak vzniknout OS Unics. Ten později Brain Kernighan přejmenoval na dnešní Unix. V roce 1969 se jeho vývoj dělí do dvou větví. První vedena Kalifornskou universitou v Berkeley pod názvem BSD Unix a druhá pod vedením AT&T jako SYSTEM III, SYSTEM V. Během dalších let se množí jeho různé klony vyvíjené mnoha firmami pro jimi vyvíjený hardware. Z důvodu zachování vzájemné kompatibility musely vzniknout některé standardy jako třeba POSIX. Unixový OS se vyznačuje převážně těmito základními vlastnostmi: • víceúlohový a víceuživatelský • jednoduchost a přenositelnost • dynamické vytváření procesů • volba interpretu příkazů • sjednocené ovládání periferií, práce se soubory a toky dat mezi procesy • hierarchický systém souborů s připojitelnými svazky S příchodem programovacího jazyka C je od roku 1973 Unix kompletně psán v tomto jazyce. To má za následek jeho přenositelnější (portable) podobu. Cílem Unixu je rozložit úlohy na podprogramy, které budou výborně zvládnuté a pak tyto úlohy společně slučovat pro řešení komplexních problémů. Předpřipravené úlohy jsou tak používány i v dalších úlohách což značně zrychluje vývoj aplikací.
12
1.2
Linux
Výrazem Linux bývá neprávem často označován operační systém. Jedná se však pouze o jádro tedy tzv. kernel. Jeho vznik se datuje rokem 1991, kdy první verzi 0.01 uvedl finský student Linus Torvalds. Původní požadavky na open source software1 však padly daleko dříve. Torvalds vyšel při tvorbě Linuxu z Minixu,což byl zjednodušený klon Unixu. Díky vizi svobodného operačního systému se na vývoji jádra podílely tisíce programátorů z celého světa. Linux tak mohl růst daleko rychleji směrem k silnému a stabilnímu jádru. Proto, aby vznikl skutečný operační systém, se muselo linuxové jádro přizpůsobit projektu GNU2 . Ten v roce 1983 založil Richard Stallman jako projekt svobodného operačního systému. Díky tomu dnes můžeme používat OS GNU/Linux. Tento systém je však pouze jediným z řady linuxových OS. Pojem linuxový operační systém tedy značí systém pracující na jádře Linuxu s doplněním knihoven, funkcí, aplikací a případným grafickým prostředím. GNU/Linux se pak dále začal větvit na tzv. distribuce, které se v dnešní době počítají na stovky. Jádro Linux a mnoho dalších komponent GNU spadá pod licenci GPL3 . To znamená, že zdrojové kódy softwaru mohou být volně měněny, ale dále šířeny jen pod touto licencí. Binární4 formy software však mohou být poskytnuty za libovolnou cenu. Jinou úroveň licence mají třeba některé knihovny nebo X Windows System, jehož služeb využívají například grafická prostředí KDE a GNOME. Dnes se různé verze Linuxu používají od mobilních telefonů přes výkonné servery a roboty až po osobní počítače. Za vše mluví fakt, že ho používá více než polovina tzv. superpočítačů uvedených v žebříčku TOP5005 . Na osobních počítačích jej dříve používali jen nadšenci, ale to se dnes mění a komunita lidí používajících linuxový operační systém se zvláště v posledních pěti letech rychle rozšiřuje. Mezi jeho hlavní přednosti patří bezpečnost, nízká cena a flexibilita. Většímu rozšíření osobního užití těchto systémů brání fakt, že množství aplikací je vyvíjeno pouze pod Windows a jejich spuštění pod Linuxem je tedy nejisté. Pro odstranění tohoto problému je dnes dostupná řada emulátorů, které buď vytváří plnohodnotný virtuální stroj nebo pouze překládají systémová volání. Základem programování pod GNU/Linux je jazyk C a sada GCC obsahující překladače několika jazyků. Nelze také pominout GNU binutils pro překlad asembleru a linkování binárních souborů do spustitelné podoby nebo jazyky Perl a Python. 1
software s veřejnými zdrojovými kódy, které uživatel může měnit a využívat, někdy je tento výraz používán pro free(zadarmo) software 2 GNU - Gnu´s Not Unix 3 GPL - General Public License 4 předkompilovaný software 5 žebříček 500 nejvýkonnějších počítačů světa http://www.top500.org
13
O podporu GNU/Linux se často starají komerční společnosti. Model podpory pak většinou vypadá tak, že při koupi distribuce obdržíte právo využít omezenou podporu na omezený čas a v případě potřeby si další služby dokupujete. Tento model nejčastěji využívá komerční sektor. Běžní uživatelé hledají podporou na internetu, kde je celá řada specializovaných webů a diskusních fór.
1.3
Debian GNU/Linux
Celým názvem Debian GNU/Linux je OS vytvořený jako svobodný operační systém projektu Debian. Tento projekt je řízen spolkem dobrovolníků, kteří věnují jeho záměrům vlastní volný čas a znalosti. Linux jako použité jádro však není jediným, se kterým Debian spolupracuje. Debian GNU/Linux je tak soubor jádra Linux a projektu GNU s projektem Debian. V současnosti je v nejvyšší verzi 4.0 a obsahuje přes 18 000 balíčků připravených k instalaci. Díky tomu, že se jedná o svobodný software, není při vydávání nové verze na nic spěcháno a proto je zaručena velká bezpečnost. K volnému stažení jsou verze stable, testing a unstable. Pro verzi unstable platí, že by ji neměli využívat produkční stroje, protože celý tento systém je právě vyvíjen a může obsahovat chyby, které by mohly i poškodit systém. Už podstatně stabilnější verze testing vzniká automaticky z balíku unstable. Vznik probíhá tak, že obvykle po deseti dnech a po opravení závažných chyb je unstable vydáno jako testing. Testing tedy obsahuje o něco starší balíčky, které však mají o poznání méně chyb. Je patrné, že uvedené verze se používají například v případě, kdy máme nový hardware, na který ve verzi stable ještě nejsou ovladače. Stable naproti těmto verzím vychází jednou za čas jako výsledek opraveného a otestovaného testingu. Je podporována bezpečnostními aktualizacemi až rok po vydání další verze stable.
1.4
Bash
Bash6 je standardní interpret linuxových příkazů založených právě na Bourne Shell (nejpoužívanější unixový interpret). Je součástí projektu GNU, takže se jeho znalost uplatní i v Unixu. Pracuje jako textové rozhraní mezi uživatelem a systémem. Nejde však jen o interpret. Bash podporuje práci s proměnnými, funkcemi, poli, cykly a mnoho dalšího. Navíc na stejném stroji může běžet více shellů. Každý uživatel si tak zvolí a nastaví vše podle svých potřeb. Často využívané jsou skripty psané v shellu v kombinaci s jejich pravidelným spouštěním jako vhodný nástroj pro automatické aktualizace či zálohy systému. Jeho nevýhodou je fakt, že uvedený kód není kompilován ale interpretován, tedy že jsou volány funkce, které se načítají z disku, 6
Bash - Bourne Again Shell
14
což prodlužuje dobu vykonání příkazů. Tento problém shell částečně odstraňuje tím, že některé funkce má načtené v paměti. Tato nevýhoda je však i výhodou díky tomu, že daný skript je přenositelnějším.
1.5
Sudo
Otázka práv jednotlivých uživatelů je v linuxových systémech velmi důležitým tématem. Sudo7 je velice mocný program pro jejich úpravu. S tímto nástrojem jde velice snadno poskytnout jakákoli práva jakémukoli uživateli. S instalací většinou není problém, protože je zahrnut téměř ve všech distribucích. Celá aplikace běží s suid8 a právy superuživatele root. Nastavení se provádí v adresáři /usr/sudoers. Tento adresář se opět může s jednotlivými distribucemi lišit. Pro jeho editaci je doporučen nástroj visudo. Ten vedle samotné editace souboru také kontroluje samotnou syntaxi nastavení nebo třeba hlídá, aby s ním nepracovalo více uživatelů najednou. Default: spravce
timestamp\_timeout=2, passwd\_tries=1
Tímto řádkem jsme například nastavili, že uživatel správce bude muset při spuštění nástroje sudo zadávat každé dvě minuty heslo. Druhý parametr udává na kolikátý pokus musí uživatel zadat dobré heslo. Tedy kolikrát mu systém dovolí zadat špatné heslo. admin ALL=(ALL) NOPASSWD: ALL Tento řádek zase nastaví, že uživatel admin může spustit cokoli s právy superuživatele root a nemusí přitom zadávat heslo. Uživatel admin by pak spustil požadovaný příkaz takto. sudo pozadovany_prikaz Nástroj Sudo vedle těchto možností umožňuje ještě celou řadu dalších funkcí. Vedle práce s aliasy třeba logy a mnoho dalších. Ty jsou však nad rámec této práce.
1.6
Webový server
Webový server je vlastně aplikace, běžící na operačním systému, dostupná na určité IP adrese a portu z vnější sítě. Touto sítí je nejčastěji internet a webový server pak nejčastěji běží na serveru, který je připojen na páteřní síť. Tento sever by měl být 7 8
Sudo - Superuser do SUID - super user id
15
Obr. 1.1: Přístup k statickému a dynamickému obsahu webu. výkonný stroj s rychlým přístupem k datům. Většina serverů dnes naslouchá požadavkům koncových uživatelů na portu 80 nebo 8080 pro šifrovaný přenos. Přenos a tvar požadavků definuje HTTP9 . Komunikace klient-server pak probíhá tak, že klient(webový prohlížeč) vyšle požadavek například na stažení stránky index.html. Webový server po jeho přijetí tento požadavek vyhodnotí a pokud má danou stránku k dispozici, tak ji klientovi odešle. Tato situace však nastává jen tehdy, pokud jsou požadovaná data tzv. statická, tzn. jejich obsah zobrazený uživateli se mění pouze tehdy, jestliže někdo mění data na serveru. O něco složitější je situace v případě dynamicky generovaných stránek. Po přijetí požadavku od klienta server kontaktuje aplikace, které daný skript obsluhují. Tato aplikace skript provede, vygeneruje výsledek a ten předá nazpět webovému serveru. Ten následně odešle výsledek klientovi. K tvorbě dynamického obsahu se používá řada různých technologií jako PHP, PERL, ASP a jiné. Odpověď od serveru obsahuje tzv. stavový kód odpovědi. Z něho se uživatel (webový prohlížeč) dozví, jestli byl jeho požadavek vyřízen v pořádku nebo jestli nastal jiný nestandardní stav. Podle kódu a obsahu odpovědi pak prohlížeč zobrazí požadovanou stránku nebo chybový výpis. Stavové kódy mohou být: • Informační 100-199 • Úspěch 200-299 • Přesměrování 300-399 • Chyba klienta 400-499 • Chyba serveru 500-599 Mezi nejznámější chybové kódy patří bezpochyby 404 - soubor nenalezen. Je tedy vidět, že se logicky jedná o chybu klienta, který zadal špatnou adresu. Jako nejznámějšího zástupce webových serverů lze jmenovat Apache HTTP Server. 9
HTTP - Hyper Text Transfer Protocol
16
1.7
PHP
PHP10 je velmi rozšířený open source skriptovací jazyk s velkým využitím. Jeho vznik se datuje do roku 1995, kdy vznikl ve verzi PHP2 jako spojení skriptovacího jádra od Rasmuse Lerdorfa vycházejícího z Perlu a nástroje pro analýzu formulářů Form Interpret. Poté díky požadavkům a náročnosti aplikací přechází celý projekt na skupinu programátorů pod níž vzniká PHP3. V nejnovější verzi PHP5 se také výrazně zlepšil přístup k objektově orientovanému programování. PHP skript je proveden na straně serveru a k uživateli jde pouze výstup skriptu. Nejčastěji je začleněn ve struktuře HTML, XHTML nebo WML. Jeho syntaxe vychází převážně z jazyků C, Perl a Java. Má celou řadu funkcí pro práci s obrázky, textem, databázemi a podporuje celou řadu internetových protokolů. PHP může na serveru běžet ve dvou formách. Jako modul nebo ve formě CGI interpretu. Jejich hlavní rozdíl je v tom, že PHP jako modul běží v paměťovém prostoru webového serveru. Naproti tomu u CGI interpretu je s každým požadavkem od uživatelů spuštěna nová instance interpretu, což má za následek snížení výkonu. Jeho velkou výhodou je však možnost spuštění skriptu přímo na serveru bez pomoci jiné aplikace. Pro tradiční vypis je to tento kód. Jde o dynamicky typový jazyk. To znamená, že datový typ proměnné je určen automaticky, až v okamžiku přiřazení hodnoty. Velice snadné je tedy i přetypování proměnných. Řetězce lze uzavírat buď do uvozovek(jeho obsah je parsován) nebo do apostrofů (obsah není parsován). Proces parsování je vlastně rozebírání řetězce a jeho analýza. Ve spojení s řetězci v PHP to znamená, že v uvedeném řetězci se hledají výrazy jako proměnné a funkce a s nimi se dále dle syntaxe pracuje. Vedle celé řady funkcí existuje do PHP mnoho rozšiřujících modulů, s kterými se stává PHP velice mocným nástrojem.
1.7.1
Nastavení PHP
Veškerá nastavení v PHP lze provádět mnoha způsoby. Za změnu vlastností se nechá považovat i přidání či odebrání různých modulů PHP. To je totiž sestaveno vedle jeho základních funkcí z modulů (extension), jejichž kombinace se mohou různě měnit. Mnoho skriptů napsaných v PHP začínajícími programátory při přechodu z jedné platformy na druhou přestává fungovat právě kvůli různému nastavení PHP. 10
PHP - PHP: Hypertext Preprocessor
17
Programátor by se tedy měl snažit psát své skripty tak, aby fungovaly v co nejširším rozmezí nastavení. K zobrazení aktuálního nastavení na výstup skriptu jsou dvě možnosti. Buď pomocí funkce phpinfo(); zobrazíme hlavní výpis nastavení nebo pomocí funkce ini_get(parametr); obdržíme hodnotu jednoho konkrétního parametru. Pomocí opačné funkce ini_set(parametr,hodnota); lze jednotlivým parametrům nastavovat hodnoty přímo ve skriptu. To se však používá jen pro mírné doladění nastavení. Hlavní nastavení se provádí prostřednictvím konfiguračního souboru php.ini. Samotné nastavování parametrů v konfiguračním souboru je velice jednoduché. Stačí zapsat parametr a přiřadit mu hodnotu. max_execution_time = 45 Komentáře se zde oddělují středníkem. parametr = Yes ; toto je komentar Vedle nastavení maximální doby provádění je zde mnoho dalších parametrů jako paměťový limit, nastavení do jakých tagů má být uzavřen kód nebo tzv. safe mód pro zakázání některých potenciálně nebezpečných funkcí. Snad nejznámější a dříve hodně diskutovaný parametr je register_globals, který povolí nebo zakáže použití globálních, někdy také nazývaných superglobálních proměnných. Ty jsou od PHP 4.2.0 označovány za bezpečnostní riziko a většina poskytovatelů webhostingu11 je má dnes zakázány. Problém je v tom, že metody jako například get odešlou proměnnou v poli $_GET[$promenna]. Při použití globálních proměnných však lze tuto hodnotu získat už použitím zápisu $promenna. Změnou hodnoty proměnné v url adrese, která se ve skriptu neinicializuje, mohu snadno podstrčit skriptu neplatná data. Z tohoto a výkonnostního důvodu se nedoporučuje globální proměnné používat. Jako další lze nastavovat sessions, úrovně chybových zpráv, které se mají zobrazovat, nebo třeba maximální velikost odeslaného souboru pomocí formuláře.Další metodou pro nastavení PHP je soubor .htaccess. Využívá se opět spíše k doladění. Jeho nastavení platí pro adresář, v němž tento soubor je. 11
Webhosting - poskytování prostoru pro webový obsah a jeho zveřejňování
18
1.8
JpGraph
JpGraph12 je knihovna pro generování grafů a obrázků. Je kompletně napsaná v PHP a je založena na OOP13 . Oproti běžné knihovně GD214 není automaticky součástí PHP a musí být nahrána ke zdrojovým skriptům. Zdánlivě vytváří přívětivé rozhraní právě mezi knihovnou GD2 a skripty. Má předpracováno mnoho funkcí, které značně zjednodušují a urychlují práci. Dokáže generovat obrázky v JPG, PNG a GIF. Obsahuje funkce pro kreslení asi dvanácti různých druhů grafů od spojnicového, koláčového až třeba po sloupcový. Jedná se o produkt švédské firmy Aditus a je volně dostupná pod licencí QPL15 nebo v profesionálním zpracování jako zpoplatněná verze na stránkách http://www.aditus.nu/jpgraph/. U QPL licence je problém s šířením modifikovaného kódu. Tento kód se totiž musí vydávat za patch (rozšíření) a nikoli za původní aplikaci. Při běžném využití této knihovny při psaní skriptů však tento problém nenastává. Jediným problémem je snad její počáteční nastavení v souboru jpgraph.php. Ten se po rozbalení knihovny nachází v adresáři /jpg/src/. Zde je potřeba nastavit vedle odkládacího prostoru adresáře DEFINE("CACHE_DIR","/tmp/");, odkládací soubor webového serveru DEFINE("APACHE_CACHE_DIR","/tmp/");, cestu k adresáři s fonty DEFINE("TTF_DIR","/ttf/"); a nastavení GD2 knihovny DEFINE("USE_LIBRARY_GD2",false);, Celý konfigurační soubor je dobře komentován, takže by jeho nastavení nemělo tvořit větší problémy. Je zároveň doporučeno si celý tento soubor projít, protože uvedené verze knihovny se mohou lišit.
1.9
SOAP
SOAP16 je protokol zpráv založený na odpovědích serverů na požadavky klientů. Zjednodušeně lze říci, že klient zažádá server SOAP zprávou o nějaké informace. Ten 12
JpGraph - knihovna pro generování grafů a obrázků napsaná v PHP OOP - objektově orientované programování 14 GD2 - základní knihovna v PHP pro práci s obrázky 15 QPL - Qt Public License 16 SOAP - Simple Object Access Protocol 13
19
mu následně jinou zprávou odpoví. Zprávy jsou ve formátu XML17 . Jeho zkratka SOAP původního Simple Object Access Protocol ztratila s jeho rozvojem na významu. Dnes se již jeho označení jako Simple příliš nehodí. Často je používán ve vyhledávačích. Například Live Search18 od firmy Microsoft umožňuje předat svému serveru požadavek na vyhledání. Ten onen požadavek provede a vrátí data v požadovaném formátu. Jak s nimi uživatel dále pracuje je už na něm. V úvahu připadá vyhledávání na vlastních stránkách nebo třeba sledování pozice našich stránek ve výsledném výpisu. SOAP je tedy velice všestranný nástroj pro výměnu dat typu požadavek - odpověď. Jeho nevýhodou je hlavně velká složitost. Naproti tomu je výhodou implementace jeho obsluhy v základních modulech PHP. Jeho jednoduchou funkci si vysvětlíme na následujícím příkladu. Na příjímací straně je pouze potřeba vytvořit instanci klienta daného serveru $client = new SoapClient(null, array(’location’ => "http:// mujserver.com/my_data.php", ’uri’ => "http://test-uri/")); a zavolání funkce $cpu = $client->prtcpu(); vracející požadovaná data. Na straně serveru je zapotřebí vytvořit taktéž novou instanci, ale tentokrát instanci serveru. $server = new SoapServer(null, array(’uri’ => "http://test-uri/")); Po připojení funkce k SOAP serveru $server->addFunction(’prtcpu’); se požadavek pouze odešle zpět. $server->handle(); Jak je vidět, jedná se o velice výkonný nástroj vhodný k velkému množství aplikací. V počátečních fázích vývoje aplikace se však může jevit jako značně složitý a špatně laditelný. 17 18
XML - eXtensible Markup Language Live Search - vyhledávač od firmy Microsoft
20
1.10
SQL
SQL19 je standardizovaný dotazovací jazyk pro práci s daty v různých relačních databázích. Vznikl díky americkému institutu ANSI20 , který upravil původní jazyk SEQUEL od IBM. Nyní je aktuální již třetí verze SQL3 (SQL-99). Příkazy jazyka SQL se dělí do čtyř základních skupin. • Příkazy pro operace s daty (SELECT, INSERT, UPDATE, . . . ) • Příkazy pro definování dat (CREATE, AFTER, . . . ) • Příkazy pro řízení pohybu dat (REVOKE, GRANT, BEGIN, . . . ) • Další příkazy, jako změna kódování, přidávání uživatelů Základním stavebním prvkem databáze je tabulka. Vychází přitom z klasické tabulky. Skládá se ze sloupců a řádků. V jednom konkrétním řádku a sloupci je určitá hodnota. Sloupce jsou různě pojmenovány a každý řádek se bere jako jeden záznam. S tabulkou se pracuje pomocí dotazů. Jednotlivé tabulky se mohou propojovat pomocí relací. To je vlastně jakési spojení záznamů v tabulkách pomocí společné entity.
1.11
MySQL
MySQL21 je multiplatformní databázový systém, který vytvořila firma MySQL AB. Je ve verzích jak pod GPL licencí tak také pod komerční placenou licencí. S okolím komunikuje tato databáze přes jazyk SQL. Její prioritou byla od počátku především rychlost. Její výkon a skutečnost, že se jedná o volně šiřitelný software, jen potvrzuje fakt, že má velký podíl ve skupině dnes používaných databází. Dnes jedna z nejpoužívanějších kombinací pro základní aplikace webového serveru je právě MySQL s Apache a PHP. Je uzpůsobena k použití různých druhů tabulek, které se liší hlavně možnostmi a způsobem ukládání dat do souborů. Je však vhodná jen pro menší projekty a pro obrovské databáze doporučována není. Práce s databází pomocí příkazového řádku je velice nepohodlná. Daleko lepší je využít nástroj PHPMyAdmin, který umožňuje snadné nastavení, vkládání a editaci databází a tabulek přes webové rozhraní. Je to ucelená soustava skriptů, která uživateli výrazně ulehčuje a zrychluje správu databáze. 19
SQL - Structured Query Language ANSI - American National Standards Institute 21 MySQL - My Structured Query Language 20
21
1.12
Cron
Je aplikace, která umožňuje spouštět skripty či programy v pravidelných intervalech. Je dosažitelný téměř ve všech linuxových distribucích. Běžně je používán například pro zálohování serverů. Tento démon umožňuje spouštět úlohy v intervalu jednou za minutu až jednou za rok. Existují dvě možnosti jak úlohu spustit přičemž záleží na intervalu spouštění. Pro intervaly hodina, den, týden a měsíc jsou v adresáři etc/ připraveny čtyři adresáře s intuitivními názvy cron.hourly,cron.daily, atd. V druhém případě musíme editovat soubor etc/crontab. To lze provést příkazem crontab -e. Zde pomocí masky nastavíme potřebné parametry. * * * * * /home/skript.sh minuta, hodina, den v měsíci, měsíc, den v týdnu, program Hvězdička pak označuje nezadaný údaj. Tento skript se tedy spustí každou minutu.
22
2
VÝSLEDKY STUDENTSKÉ PRÁCE
Celá aplikace měla být navržena tak, aby nabízela uživatelsky jednoduché a efektivní webové rozhraní pro monitorování úloh běžících na linuxových serverech a také zobrazovala využití výpočetních kapacit sledovaných strojů. Šlo též o to najít vhodnou metodu pro získávání požadovaných dat, která nebude mít za následek nárůst zatížení stroje. To by způsobilo velké chyby v datech, které by nebylo možné nějakou jednoduchou metodou opravit. Jako nejvhodnější pro získávání dat o úlohách se nakonec ukázala metoda závislá na výstupu programu ps. Ve spojení se získáváním dat o využití procesoru a paměti z vhodných souborů tak získáme všechna data potřebná k monitoringu. Dále bylo třeba zvolit vhodné rozdělení operací, které se budou provádět na admin serveru a které vykoná sledovaný server. Výsledkem celé práce je aplikace, která pomocí admin serveru provádí sběr a uchování potřebných dat. Stará se o jejich vhodné a přehledné zobrazení a udržuje tyto data aktuální. Uchování dat má na starosti MySQL databáze umístěná na admin serveru. Je však možné její přemístění na libovolný server. Uvedenou změnu je pouze potřeba vykonat se současnou úpravou konfiguračního souboru na admin serveru. Na admin serveru dále běží webový server s podporou PHP. Z výše uvedeného vyplývá, že pro admin server lze použít i některý free-webhosting1 . V tomto případě se ovšem musí brát ohled na to, že dostupnost některých free-webhostingů se pohybuje i pod 95 %. Jedním z kriterií výběru stroje pro admin server je i diskový prostor a prostor pro databázi. Nároky na disk by vzhledem k potřebě aplikace cca 5 MB neměly činit problémy. S prostorem pro databázi je to o něco horší. Její objem se zvětšuje úměrně s počtem sledovaných serverů, přičemž nároky na jeden sledovaný server činí asi 600 kB. Uvedené nároky jsou tedy s přihlédnutím k množství ukládaných dat, které činí skoro 30 000 záznamů pro jeden server, malé. S požadavkem malých nároků, přehlednosti a efektivity byla celá aplikace navrhována. Velký důraz byl také kladen na možnost jejího použití v co nejširším poli platforem. Neměla by být závislá na některé přídavné funkci či programu. Měla by být funkční pod základní instalací jakékoli linuxové distribuce s ohledem na jejich odlišnosti. Pozornost byla také věnována maximálnímu urychlení a zjednodušení instalace. Úvodní stránka aplikace na straně admin severu umožní uživateli bezpečné přihlášení do systému. Po ověření jména a hesla je uživatel nasměrován do přehledného prostředí navrženého s ohledem na rychlou a intuitivní orientaci. Zde uživatel může prohlížet statistiky vytížení jednotlivých serverů za poslední den, týden, měsíc a také statistiku dostupnosti serverů. Dále má možnost zobrazení výpisu úloh a provádění operací s nimi jako je start, restart či zastavení. V tomto prostředí dále uživatel může 1
free-webhosting - nezpoplatněné poskytování webového prostoru pro prezentaci
23
přidávat a mazat servery, měnit své heslo a e-mail, na který budou zasílány zprávy s restartováním, stopnutím či startem konkrétní úlohy. Jedním z dalších nastavení serveru je pak aktivace respektive deaktivace přijímání dat od daného sledovaného stroje a nastavení doby, po kterou mají být požadovaná data uchovávána.
2.1
Databáze
Na admin serveru je vytvořena databáze MySQL s pěti tabulkami (users, servers, services, zatez a dostupnost). Při vývoji této aplikace bylo použito webové rozhraní PHPMyAdmin2 , které operace nad databází velice usnadňuje. V následujícím textu jsou popisovány jednotlivé sloupce tabulek různě. Například buňka, pole nebo políčko jsou zde totožné s definicí sloupce.
2.1.1
Struktura databáze
První z tabulek users, uchovává informace o uživateli dohlížejícím na admin serveru. Je složena z polí userid, nick, PASSWORD, pravo, last_akce, activated, online a email. Její struktura je lépe patrná z obrázku 2.1. Některá políčka se mohou zdát nadbytečná. V tomto ohledu je počítáno s případným rozšířením aplikace. Userid udává identifikační číslo uživatele, nick jeho přihlašovací jméno, PASSWORD skrývá heslo, zahashované3 funkcí md5, pro vstup do aplikace. To znamená, že v databázi není uloženo heslo, nýbrž jeho zakódovaný tvar. Tudíž se heslo nedá zjistit pouhým náhledem do tabulky. Pole pravo, online a activated jsou v této verzi nadbytečná, je s nimi počítáno pro správu účtů a pro statistiky přístupu jednotlivých uživatelů. Pole last_akce je zde pro uchování času posledního kontaktu uživatele s aplikací. To je zapotřebí pro automatické odhlášení. Sloupec email uchovává e-mail uživatele pro odesílání informačních zpráv. Identifikační číslo uživatele je zde zároveň použito jako primární klíč tabulky. Jednotlivé servery jsou uloženy v tabulce servers, jejíž struktura je zobrazena na obrázku 2.2. Je složena z polí idserver, ip, nazev, time, activ, dostupnost, naposled, pocethitu, memdnu a uptime. Identifikátor serveru je v poli idserver a je zároveň primárním klíčem celé tabulky. Pod poli ip a nazev se skrývá název a IP adresa serveru. Pole time slouží pro uložení času poslední komunikace se serverem a pole dostupnost, naposled a pocethitu jsou použita pro sledování dostupnosti serveru. V poli dostupnost je poslední spočítaná dostupnost, naposled skrývá čas posledního výpočtu dostupnosti a pocethitu počítá kolikrát s admin serverem sledovaný stroj komunikoval. Sloupec memdnu udává počet dní, po který mají být data 2 3
PHPMyAdmin - webové rozhraní pro práci s databází zahashovat - upravit řetězec hasovací funkcí
24
Obr. 2.1: Struktura tabulky users (uživatelé).
Obr. 2.2: Struktura tabulky servers (servery).
serveru v databázi uchovávána. Položka activ rozlišuje, zda jsou data od serveru přijata či zahozena a ve sloupci uptime je uložena doba běhu serveru.
Obr. 2.3: Struktura tabulky services (úlohy). Všechny úlohy běžící na serverech jsou pak uloženy v tabulce services s poli idserver, nazev, vlastnik, stav, cpu, ram, start a ppid. Idserver ukazuje na server, z kterého úloha pochází. Slouží nám jako odkaz do tabulky servers. Pole nazev, vlastnik, ppid a start udávají název, vlastníka, identifikátor pid4 a čas 4
PID - Process Identifier
25
spuštění procesu. Buňka stav uchovává stav procesu. V polích cpu a ram se zobrazí spotřeba výpočetní kapacity procesoru a alokovaná paměť pro danou úlohu. Celá struktura této tabulky je zobrazena na obrázku 2.3. Informace o průběhu zátěže jednotlivých severů obsahuje tabulka zatez. S polem idserver pro identifikaci daného stroje je tu sloupec time, cpu, ramused a ramall. Pole time nám dává časovou informaci, kdy byl daný řádek tabulky zaznamenán. Ve sloupci cpu uložíme vytížení procesoru v procentech, v ramused využití paměti RAM a v ramall celkovou pamět RAM využitelnou pro běh úloh. Celá struktura tabulky je zobrazena na obrázku 2.4.
Obr. 2.4: Struktura tabulky zatez (zátěž serverů). Celkový přehled dostupností serverů je uložen v tabulce dostupnost (obrázek 2.5). S polem idserver pro identifikaci daného stroje je tu pole time pro identifikaci času a sloupec dostupnost, kde je uložena dostupnost daného stroje.
Obr. 2.5: Struktura tabulky dostupnost.
2.1.2
Připojení k databázi
Připojení k databázi je řešeno skriptem config.php. Ten je složen z deklarace proměnných, které určují parametry připojení. Následují funkce pro připojení databáze mysql_connect a mysql_select_db pro vybrání požadované databáze. Poslední je funkce SET CHARACTER SET LATIN2 pro nastavení znakové sady spojení. Zde je použit řetězec LATIN2 pro znakovou sadu iso-8859-2. Tento skript je pak dle potřeby připojován funkcí include do ostatních skriptů.
26
2.2
Skripty na straně admin serveru
Na admin serveru je skupina PHP skriptů, které se starají o uživatelskou přívětivost rozhraní a samotné zpracování monitorovacích dat. Jeden z nejdůležitějších skriptů je data.php, který se stará o příjem dat ze sledovaného severu. Zde po funkci include, include("./config.php"); která do kódu připojí kód skriptu config.php pro připojení k databázi, následuje načtení ip adresy serveru od něhož data přišla. Celý přenos je tedy iniciován sledovaným strojem, který spustí skript a zašle požadavek na stáhnutí dat admin serveru (skriptu data.php). Díky tomuto je na straně admin serveru v proměnné $_SERVER["REMOTE_ADDR"] právě ip adresa serveru. Tuto adresu dále využijeme pro kontrolu, jestli od tohoto serveru chceme data skutečně přijímat. Následuje tedy hledání uvedeného serveru v databázi. Současně s danou adresou musí podmínka splňovat i aktivní stav přijímání dat, který nám udává položka activ v tabulce servers. Výsledný dotaz pro ověření serveru tedy vypadá takto. $aae=MySQL_Query("SELECT * FROM servers WHERE ip=’$ip_zdroje’ AND activ=’1’ ORDER BY id_server "); while($bbe=mysql_fetch_array($aae)) { //zde jsou proměnné dostupné takto $bbe["sloupec_tabulky"]; } Po provedení SQL dotazu pomocí funkce mysql_query je výsledek tohoto dotazu vrácen metodě mysql_fetch_array, která v cyklu vypisuje řádky tabulky dokud nedojde na konec seznamu. V každé iteraci cyklu jsou pak jednotlivé sloupce řádku dostupné v uvedeném poli. První operace v tomto cyklu je realizace počítání dostupnosti serveru, která je řešena následujícím způsobem. S příchodem každého požadavku od sledovaného stroje se inkrementuje5 sloupec pocethitu. Pro každých 24 hodin je pak spočítána dostupnost. Vycházíme přitom z toho, že víme kolikrát měl stroj požadavek poslat a kolik jich ve skutečnosti přišlo. Následným procentuálním vyjádřením získáme dostupnost za posledních 24 hodin. Dalším krokem v tomto cyklu je smazání starých úloh v tabulce services u daného stroje. @$pridej = MySQL_query( "DELETE FROM services WHERE id_server=’$id_server’ "); 5
inkrementace - proces při kterém proměnná zvýší svou hodnotu o 1 krok
27
Podobným způsobem dojde ke smazání starých záznamů v tabulce zatez. Jejich smazání či ponechání závisí na požadované době uchovávání dat uvedené v položce memdnutabulky servers. Tabulky jsou tak připraveny k zápisu dat. Pro vlastní výměnu dat je nutná inicializace klienta protokolu SOAP. Poté jsou již volány funkce plnící potřebné proměnné. $client = new SoapClient(null, array(’location’ => "http://".$ip_zdroje."/server/my_data.php", ’uri’ => "http://test-uri/")); // volani metod pro ziskani sledovacich dat $cpu = $client->prtcpu(); Po předání parametrů serveru je volána poslední funkce $pole =$client->prtobj();, která vrací pole objektů třídy radek. Ten je deklarován hned v úvodu skriptu a definuje strukturu informace o jedné úloze. class { var var var var var var var var }
radek $cislo; $nazev; $vlastnik; $stav; $cpu; $ram; $start; $ppid;
V celém poli jsou tak uloženy jednotlivé úlohy. V cyklu for se pomocí dotazu insert @$pridej = MySQL_query( "INSERT INTO services VALUES(’’, ’$id_server’,’$hmenu2->nazev’,’$hmenu2->vlastnik’, ’$hmenu2->stav’,’$hmenu2->cpu’,’$hmenu2->ram’, ’$hmenu2->start’,’$hmenu2->ppid’)"); vkládají jednotlivé procesy do tabulky services. Po tomto cyklu se ještě provede zapsání informací o serveru do tabulky zatez a na konci skriptu je navíc provedena, dotazem update, inkrementace hodnoty pocethitu a také zapsání času poslední aktualizace dat.
28
2.2.1
Grafické rozhraní admin serveru
Grafické zpracování celé aplikace je vypracované jako kaskádový styl CSS6 . Je zde soubor default.css pro definování samotného stylu. Použit je upravený styl Indigo švédského designéra Viktora Perssona, který je volně k stažení. Pro zachování autorských práv je tedy v aplikaci uváděn i původní autor stylu.
Obr. 2.6: Přihlášení do webového rozhraní. Celé webové rozhraní začíná pro uživatele skriptem index.php. Jeho vzhled je patrný z obrázku 2.6. Pomocí něho se uživatel přihlásí do samotného systému, odkud se může odhlásit pomocí skriptu logout.php. Přihlašovací stránka obsahuje pouze formulář pro zadání loginu, hesla a tlačítko pro odeslání formuláře. Formulář je odesílán metodou POST skriptu kontrola.php. Zde se nejprve ověří, zda uživatel vůbec zadal všechny údaje. Následuje zahashování hesla a hledání uživatele v tabulce users. Pokud je nalezen, je mu registrována session session_register(’userid’); $_SESSION[’userid’] = $userid; a do ní potřebné proměnné jako userid, nick a pravo. V každém dalším skriptu je pak pomocí funkce session_start(); if (!$_SESSION[’nick’] ) header("Location:index.php"); zapnut session a následně ověřeno zda má uživatel session registrován. To způsobí, že uživatel, který nemá platný přístup, se do těchto skriptů nedostane a je přesměrován na úvodní stránku. 6
CSS - Cascading Style Sheets
29
Po úspěšném přihlášení následuje přesměrování na skript main.php. To je hlavní stránka celého rozhraní po přihlášení a její náhled je na obrázku 2.7. Obsahuje menu a proměnnou část zobrazovanou dle toho, jakou položku menu zvolíme. Toto je realizováno funkcí include, která do proměnné části zahrne vybranou stránku, jako by její obsah byl zapsán místo této funkce. Položky menu nám umožňují přejít na úvodní stránku, vložit server, spravovat uživatelský účet a odhlásit se. Úvodní stránka, která je připojována ke skriptu main.php, je home.php. Ta obsahuje výpis všech serverů a informace o nich. Zobrazí se tu vedle názvu serveru, ip adresa, čas poslední aktualizace, počet všech a běžících úloh, dostupnost a doba běhu serveru. Dále zde můžeme server smazat, editovat a aktivovat respektive deaktivovat příjem dat od něj. Aktivace a deaktivace probíhá zavoláním příslušného skriptu s parametrem udávajícím identifikační číslo serveru. V těchto skriptech se pouze pomocí dotazu update aktualizuje sloupec activ v tabulce servers a následně je uživatel přesměrován zpět na úvodní stránku. Pokud je server nastaven na neaktivní, je ve výpisu pro odlišení označen červenou barvou. Pod ikonou koše je skryta volba smazání serveru. To je provedeno dotazem delete ve skriptu smazserver.php. Po provedení tohoto dotazu opět následuje přesměrování na úvodní stránku. Pod další ikonou se skrývá editace serveru. Po klepnutí na ni se zavolá skript edit.php s identifikačním číslem serveru, který načte parametry serveru a umožní jejich editaci ve formuláři. Uložení nových parametrů je zajištěno skriptem edit0.php, kterému je formulář předán. Ve výpisu je zobrazen název serveru jako odkaz, přes nějž se dostaneme na výpis procesů daného serveru. Neběžící procesy se zobrazí hned pod serverem současně s volbou jejich restartu. Zobrazení grafů je možno nalézt pod ikonkou grafu. Ty budou podrobněji popsány dále v kapitole Grafy.
Obr. 2.7: Náhled základní stránky systému. Výpis procesů běžících na serveru je vypsán voláním skriptu services.php s identifikačním číslem serveru. Jeho náhled je na obrázku 2.8. Z tabulky services jsou vybrány všechny úlohy pro tento server a po malé úpravě některých hodnot
30
vypsány a zobrazeny v odpovídajícím formátu. Změnit je třeba dobu běhu procesu a stav procesu. Dle stavu procesu se také ve výpisu zobrazí odkazy restart a stop pro běžící proces nebo pouze restart pro úlohu, která je buď stopnutá, přerušená nebo mrtvá. Ve výsledku je zde tedy zobrazen název procesu, vlastník, stav, spotřeba kapacity CPU, spotřeba kapacity RAM, čas začátku procesu a akce, které s ním lze provést. Neběžící proces je opět označen červenou barvou. Odkazy pro restart a stop procesu jsou směrovány na skript send.php.
Obr. 2.8: Formát zobrazení procesů daného serveru. Jako parametr je připojen identifikátor procesu pid, identifikátor operace, url adresa skriptu provádějícího akce na monitorovaném serveru, jeho ip adresa a název úlohy. Odkaz je volán do nového okna, protože výsledek operace se zobrazí na sledovaném serveru a není přesměrován nazpět. Na začátku skriptu je vybrán uživatel provádějící změnu a spolu s dalšími daty jako název serveru, název úlohy, operace je vytvořeno tělo e-mailu. K tomu je zapotřebí funkce mail. mail($email , $predmet, $zprava, "From: " . $email2); Ta je odeslána na e-mail uživatele. Funkce má jako parametry předmět zprávy, tělo zprávy a e-mail z kterého je zpráva odeslána. Po vykonání této funkce je uživatel přesměrován už přímo na skript action.php na sledovaném serveru. Jako parametr je připojen identifikátor procesu pid a identifikátor operace, která se má vykonat. Při volbě položky vložit server v menu se volá skript newserver.php. V něm se zobrazí formulář pro přidání nového serveru k monitorování. Možno je zde zadat název, ip adresu, počet dnů uchovávání dat a informace, zda se data mají přijímat nebo zahazovat. Doba uchovávání dat je implicitně nastavena na 30 dnů. Formulář je odesílán skriptu newserver0.php. Ten tyto informace uloží pomocí dotazu insert do tabulky servers. Uživatel je poté přesměrován opět na úvodní stranu, kde ihned může vidět svůj přidaný server.
31
Předposlední nabídkou menu je správa účtu. Zde si po zadání starého a nového hesla můžeme změnit heslo. Staré samozřejmě musí souhlasit s aktuálním heslem. Ověření hesel je opět prováděno přes jejich zahashované tvary. V případě úspěchů se nové heslo uloží do tabulky users. Druhá položka je zde změna e-mailu, na který chodí zprávy o akcích prováděných na serveru. Jeho změna se zaznamená opět do tabulky users. Poslední položka menu nabízí odhlášení ze systému. Pro samotné odhlášení je volán skript logout.php, který pomocí funkce session_destroy(); zruší session a po uplynutí pár vteřin uživatele přesměruje zpět na přihlašovací stránku.
2.2.2
Grafy
Obr. 2.9: Příklad grafického zobrazení zátěže serveru. Grafické vyjádření statistik je podporováno mocnou knihovnou JpGraph. Skript my_stat.php je volán s identifikátorem serveru, podle kterého jsou vykreslovány grafy konkrétního serveru. Jedná se o dva druhy grafů. Graf pro dostupnost je ve skriptu my_dostupnost.php. Zobrazení zatížení procesoru a paměti za určité časové období je ve skriptu my_zatez.php. Nejdůležitější částí obou skriptů je vhodné načtení požadovaných hodnot z databáze do polí. Výsledná pole jsou pak předána objektu jako sada hodnot. Skripty jsou také volány s informací o počtu zobrazených dní pro pozdější určení časové osy. Důležité je pak správně spočítat interval popisků na ose. Popisky totiž nesmí být moc husté nebo řídké. Po spuštění instance objektu
32
se vhodným definováním několika parametrů graf nastaví. Vedle legendy, popisků grafu a popisků os jsou to třeba barva a velikost písma. Příklad výpisu zatěže serveru za posledních 24 hodin je uveden na obrázku 2.9. Výsledky skriptů jsou pak dostupné v HTML tagu img jako obrázek PNG7 .
U výpisu je myšleno i na variantu, kdy pro vykreslení grafu není dostatek dat. Příklad takového vykreslení je na obrázku 2.10.
Obr. 2.10: Příklad grafického zobrazení zátěže serveru (nedostatek dat).
2.3
Skripty sledovaného serveru
Na sledovaném serveru je následujících šest skriptů. Jejich úlohy jsou rozdělené na monitorování a provádění operací na serveru. Bližší nastavení serveru je uvedeno níže v odstavci nastavení a instalace. Iniciátorem celého přenosu dat je skript skript.php, který pouze pošle požadavek na admin server (skript data.php), aby si vyzvedl monitorovací data. Ten si v případě zájmu přebírá data od skriptu my_data.php. Celý tento skript je rozdělen do několika funkcí, které si admin server vzdáleně volá pomocí protokolu SOAP. Vedle definice třídy radek (stejná jako na admin serveru ve skriptu data.php), je tu funkce pro samotné získávání a odesílání informací o úlohách. Funkce je vlastně založena na spuštění a následném rozparsování příkazu ps. Tento příkaz s využitím určitých parametrů vypíše různé informace o procesech. Pro náš případ jsem zvolil tento zápis: 7
PNG - grafický formát pro uchování obrazových dat
33
ps axfo user,pcpu,pmem,stat,etime,pid,comm Parametry axfo stanovují, že výpis bude obsahovat všechny procesy od všech uživatelů spuštěných kdekoli. Poslední parametry definují formát výpisu. Výsledná pole výpisu tak obsahují uživatele, zatížení procesoru, vytížení paměti, stav procesu, čas startu úlohy a název úlohy. Výsledek celého příkazu by tedy mohl vypadat asi takto: USER %CPU %MEM STAT root 0.0 0.0 Ss root 0.0 0.0 SN root 0.0 0.0 S< root 0.0 0.0 S< root 0.0 0.0 S< root 0.0 0.0 S< root 0.0 0.0 S< root 0.0 0.0 S<
ELAPSED 48-20:37:43 48-20:37:43 48-20:37:43 48-20:37:43 48-20:37:43 48-20:37:43 48-20:37:43 48-20:37:43
PID 1 2 3 4 5 8 9 112
COMMAND init ksoftirqd/0 events/0 khelper kthread \_ kblockd/0 \_ kacpid \_ kseriod
Je logické, že výpis obsahuje proces ps. V PHP však nelze tento příkaz vykonat přímo. Musí být iniciován nějakou metodou spouštějící systémové příkazy. My použijeme metodu exec s následujícím prototypem. exec($prikaz,$pole); Ta po provedení příkazu vrátí do pole výpis provedeného programu. Každý řádek výpisu (jeden proces) je tedy v jedné buňce pole. Následuje velice šikovný cyklus foreach s tímto prototypem. foreach($result as $line) { ...$radek... } Ten automaticky s každou iterací uloží do proměnné $line jeden řádek z výpisu. Konkrétní položky jsou po ořezání přebytečných mezer ve výpisu rozděleny funkcí explode. $line_array= explode(’ ’,$line); Do line_array je vráceno pole vzniklé rozdělením řádku. Řádek je dělen vždy při nalezení mezery. Podřízený proces (spuštěný jiným procesem) označíme znakem "-". Nyní už pouze zbývá přiřadit konkrétní položku do třídy typu radek. $My_NewRow->nazev=$line_array[6];
34
Tato proměnná je s každou iterací cyklu uložena do pole, které je na konci celé funkce vráceno admin serveru. Další funkce získává celkový čas běhu serveru. Ten je ze souboru /proc/uptime získán těmito funkcemi. $soubor = fopen($cesta_k_souboru, "r"); $text = fread($soubor, 15); fclose($soubor); Tři podobné funkce získávají data o využití procesoru a paměti. Zde je využito příkazu top ve spojení s parsováním jeho výstupu pomocí jazyka awk8 . Tento příkaz například top -b -n 1 | awk ’/Mem/ {print $2}’ najde ve výpisu informaci o celkové paměti. Výstup příkazu je opět zbaven přebytečných řetězců a převeden do požadovaných jednotek. Výsledek každé z funkcí je distribuován pomocí SOAP serveru. $server=new SoapServer(null,array(’uri’=>"http://test-uri/")); $server->addFunction(’prtramused’); $server->handle(); Mezi skripty provádějící operace patří action.php. Uvnitř něho se testuje, zda je správně volán a nastaví se zde jaká úloha má být vykonána. Možnosti jsou dvě. Buď se provede zastavení nebo restart úlohy. Pro start úlohy je totiž proveden také příkaz restart. Také se musí do proměnné prikaz zapsat hodnota pid procesu, s kterou je poté skript volán. Příkaz je pak nutno použít pomocí metody passthru($prikaz,$result);, která vrátí do proměnné result výsledek operace. Ten následně otestujeme a vypíšeme hlášení jak požadovaná operace dopadla. Příkaz volaný v tomto skriptu má vlastně za úkol spustit jeden z dvojice bashových skriptů- Continued.sh pro restart či start úlohy a stoped.sh pro zastavení úlohy. Oba jsou volány s parametrem pid procesu, obsahují příkaz kill a vracejí hodnotu 0 v případě úspěchu. Ta je vrácena do action.php, který vypíše výsledek. Metoda pro zastavení procesu používá formát kill -stop pid_procesu; a metoda pro start či restart procesu využije tento prototyp kill -cont pid_procesu; Pomocí konfiguračního souboru config.php si načítají ostatní skripty potřebné proměnné. Před samotným spuštěním aplikace je tedy potřeba tento soubor nastavit. 8
AWK - jazyk pro zpracování textových dat
35
2.4
Nastavení a instalace
Admin server V nastavení admin serveru jde pouze o to, aby běžel webový server s PHP a MySQL. Pro většinu možných nastavení by měly skripty pro admin server fungovat bez jakýchkoli úprav. Po případném nastavení nahrajeme požadované skripty na server. Na url adrese admin serveru samozřejmě nezáleží, ale musíme ji uvést také v souboru config.php. V tomto souboru musíme nastavit všechny požadované parametry sloužící hlavně pro připojení databáze. Instalace dále pokračuje spuštěním skriptu install.php. Ten se uživatele ve formuláři zeptá na login, heslo a e-mail, které bude chtít používat. Formulář je odeslán do skriptu install0.php, který vygeneruje tabulky a přidá do nich zadané údaje. Pokud nenásleduje žádné chybové hlášení, je pravděpodobně vše provedeno správně. To můžeme vyzkoušet tím, že se zkusíme přihlásit do aplikace (v index.php). Případná chyba bude s nejvyšší pravděpodobností způsobena špatnými údaji v souboru config.php. Při úspěšném přihlášení je tedy vše v pořádku a my můžeme přidat sledovaný server. Po jeho přidání můžeme pokračovat s jeho samotným nastavením. Sledovaný server Na sledovaném serveru musí pro správnou funkci monitorování fungovat vedle webového serveru, PHP a Sudo. Pokud PHP běží jako modul, musí na serveru být i webový prohlížeč či jiná aplikace schopna odeslat HTTP požadavek na admin server. Pro PHP jako CGI interpret tato starost odpadá, protože Cron spouští rovnou PHP skript. Sudo je třeba nastavit tak, aby se pomocí admin serveru nechaly provádět různé operace na serveru. www-data ALL=(ALL) NOPASSWD:
/var/www/server/
Tímto jsme rozhodli, že uživatel www-data (uživatel ovládající webový server) může spouštět s právem superuživatele root vše co je v zadané složce. Do adresáře uvedeného v nastavení aplikace Sudo nahrajeme skripty pro sledovaný server. Jediným souborem pro konfiguraci je zde opět config.php, ve kterém musíme nastavit požadované parametry. Většina z nich udává volací příkazy pro zjišťování parametrů systému. Jejich editování by nemělo být nutné, ale s jinou distribucí se přesto mohou lišit. Vedle těchto parametrů je zde nutné uvést URL adresu admin serveru. Dále je potřeba nastavit Cron * * * * * /var/www/server/skript.sh, aby spouštěl skript každou minutu. Toto je nejlepší provést v okamžiku, kdy je připraven admin server a je na něm aktivován příjem dat od daného stroje. Pokud nenastal problém, mělo by všechno fungovat. V případě, že server data nepřijímá, zkontrolujeme konfigurační soubory a práva souborů. Z hlediska práv je
36
podstatná možnost spouštění souborů na sledovaném serveru. Případné další nesrovnalosti vysledujeme přes logovací systémové soubory nebo logovací soubory webového serveru. Pro přidání dalšího serveru použijeme opět návod pro nastavení sledovaného serveru. V postupu se nic nemění. Každé přidání serveru by tedy mělo probíhat stejně.
37
3
ZÁVĚR
Takto zpracovaná aplikace nám dává okamžitý přehled o dění na všech našich serverech. Je výhodná z hlediska toho, že administrátor nemusí kontrolovat každý server samostatně. Obsluze běží na pozadí webový prohlížeč a ta pouze sleduje a obsluhuje případné změny. Z pohledu toho, že spouštíme na serveru skripty, které mění stavy procesů na jiném serveru, se jedná o bezpečností riziko. Možnost spouštění skriptů se superuživatelskými právy by tak měla být zachována pouze pro daný adresář a do tohoto adresáře by se neměly ukládat jiné soubory. Tato aplikace se nechá využít jako základ pro řešení nějaké podobné úlohy. Případné rozšíření je samozřejmě možné. S ohledem na toto byla aplikace již navrhována. Například tabulky, jak už bylo zmíněno v popisu, jsou předpřipraveny pro širší využití. Možné jsou celé řady rozšíření jako třeba bezpečnější přenos dat nebo sledování a nastavovaní konkrétních úloh na serveru. Hlavní nevýhodou aplikace je, že na sledovaném serveru musí být webový server s podporou PHP. To by se samozřejmě nechalo vyřešit vznikem úplně nového programu, který by komunikoval s admin serverem pomocí jiného protokolu. Zhlediska toho, že celá aplikace je navrhována pro internetové prostředí, kde většina serverů je vybavena webovým serverem, není tato nevýhoda tak závažná. Navíc aktuálně využitý protokol SOAP, který je použit pro přenos dat, je velice všestranný a případnému rozšíření aplikace vůbec nebrání. Další nevýhodou je, že SCadmin zatím nedokáže rozlišit stroje, které obsahují více procesorů nebo vícejádrové procesory. Toto se musí zatím řešit zásahem do aplikace. Nepodařilo se to odstranit jednoduše proto, protože k takovému stroji nemám přístup.
38
LITERATURA [1] Steve Shan. Administrace systému Linux /Steve Shan, Wale Soyinka Grada Praha 2002 [2] Charles Aulds. Linux administrace serveru Apache. /Charles Aulds Praha 2003
Grada
[3] Luke Welling,Laura Thomasová. PHP MYSQL rozvoj webových aplikací Softpress Praha 2003 [4] kolektiv autorů. PHP programujeme profesionálně Computer Press Praha 2004 [5] kolektiv autorů. Linux Dokumentační projekt Computer Press Praha 2001 [6] Mark G.Sobell. mistrovství v Linuxu Computer Press Praha 2007 [7] kolektiv autorů. oficiální web distribuce Debian [online]. 2008, poslední aktualizace 5. 5. 2008 [cit. 5. 5. 2008]. Dostupné z URL:
. [8] kolektiv autorů. žebříček TOP500, 500 nejvýkonějších počítačů na světě: [online]. 2008, poslední aktualizace 12. 11. 2007 [cit. 3. 5. 2008]. Dostupné z URL:
. [9] kolektiv autorů. UNIX - The Open Group 1995-2007 [online]. 2008, poslední aktualizace - [cit. 1. 5. 2008]. Dostupné z URL:
. [10] kolektiv autorů. PHP: Hypertext Preprocessor - Wikipedie otevřená encyklopedie [online]. 2008, poslední aktualizace 25. 4. 2008 [cit. 30. 4. 2008]. Dostupné z URL:
. [11] kolektiv autorů. Různé licence a komentáře k nim, Licence spojene s projektem GNU(QPL) [online]. 2008, poslední aktualizace 5. 5. 2005 [cit. 1. 5. 2008]. Dostupné z URL: . [12] Sobotka Jiří. Profesionální grafy v PHP snadno a rychle - JpGraph [online]. 2002, poslední aktualizace 29. 5. 2002 [cit. 3. 5. 2008]. Dostupné z URL: . [13] kolektiv autorů. Linux kernel - Wikipedie otevřená encyklopedie [online]. 2008, poslední aktualizace 21. 4. 2008 [cit. 26. 4. 2008]. Dostupné z URL: .
39
[14] Karel Benák. Programování - JpGraph - knihovna pro kreslení grafů [online]. 2006, poslední aktualizace 17. 7. 2006 [cit. 28. 4. 2008]. Dostupné z URL: . [15] kolektiv autorů. Oficiální webové stránky firmy Auditus a knihovny JpGraph pro kreslení grafů [online]. 2008, poslední aktualizace 1. 3. 2008 [cit. 22. 4. 2008]. Dostupné z URL: . [16] Nelson. The Q Public License Version 1.0 - Znění licence QPL [online]. 2008, poslední aktualizace 31. 10. 2006 [cit. 5. 5. 2008]. Dostupné z URL: . [17] Shav, Steve. Bibliografické citace dokumentů podle ČSN ISO 690 a ČSN ISO 690-2 [online]. 2001, poslední aktualizace 11.11.2004 [cit. 17.2.2005]. Dostupné z URL: .
40
SEZNAM SYMBOLŮ, VELIČIN A ZKRATEK ANSI - American National Standards Institute - společnost vytvářející standardy AWK - jazyk pro zpracování textových dat - univerzální jazyk pro zpracování textových informací Bash - Bourne Again Shell - interpret příkazů CSS - Cascading Style Sheets - kaskádové styly definující vzhled HTML či jiných webových kódů GD2 - základní knihovna v PHP pro práci s obrázky GNU - Gnu´s Not Unix - projekt na vývoj open source OS GPL - General Public License - zdrojové kódy softwaru pod touto licencí jsou volně šiřitelné, upravitelné, ale dále distribuovatelné jen pod touto licencí HTML - Hypertext Markup Language - značkovací jazyk pro úpravu webových stránek HTTP - Hyper Text Transfer Protocol - protokol sloužící pro přenos webových stránek JpGraph - knihovna pro generování grafů a obrázků napsaná v PHP Live Search - vyhledávač od firmy Microsoft - http://www.live.com/ MySQL - My Structured Query Language - strukturovaný dotazovací jazyk vycházející z SQL OOP - objektově orientované programování Open Source Software - software s veřejnými zdrojovými kódy, které uživatel může měnit a využívat, někdy je tento výraz používán pro free(zadarmo) software OS - Operační Systém - Operating System PHP - PHP: Hypertext Preprocessor - skriptovací jazyk sloužící nejen pro tvorbu dynamického obsahu webových stránek, původně Personal Home Page PHPMyAdmin - webové rozhraní pro práci s databází - soustava skriptů psaných v PHP usnadňující práci s databázemi
41
PID - Process Identifier - každý proces či úloha běžící v Linuxovém OS má přiřazen vlastní identifikátor PNG - grafický formát pro uchování obrazových dat QPL - Qt Public License - svobodná softwarová licence bez copyleftu, po praktické stránce velice nevýhodná, protože modifikované zdroje mohou být distribuovány pouze jako patche SCadmin 1.1 - Server Control admin 1.1 - název vytvořené aplikace SOAP - Simple Object Access Protocol - protokol založený na požadavcích a odpovědích, definuje požadavky klientů a odpovědi serverů SQL - Structured Query Language - strukturovaný dotazovací jazyk pro vytváření dotazů nad databázemi Sudo - Superuser do - nástroj pro vykonání příkazu s právy superuživatele (nebo jinými) jiným uživatelem SUID - super user id - identifikační číslo superuživatele root, spojené s jeho právy TOP500 - žebříček 500 nejvýkonnějších počítačů světa http://www.top500.org URL - Uniform Resource Locator - jednotný lokátor zdroje pro jeho jednoznačné nalezení, užíváno nejen v internetu WML - Wirelless Markup Language - značkovací jazyk na úpravu webových stránek pro mobilní telefony Webhosting - poskytování prostoru pro webový obsah a jeho zveřejňování XHTML - eXtensible Hypertext Markup Language - značkovací jazyk na bázi XML, s podporou HTML XML - eXtensible Markup Language - rozšiřitelný značkovací jazyk, uživatel si může vytvářet vlastní tagy admin server - server, který sbírá, zobrazuje data od sledovaných serverů a stará se o chod celé aplikace binární formy software - předkompilovaný software dostupnost serveru - jedno z vyjádření kvalit serveru - poměr úspěšně vyřízených a všech požadavků na server násobený stem pro zobrazení v procentech
42
free-webhosting - nezpoplatněné poskytování webového prostoru pro prezentaci je to často spojeno s nižší kvalitou služeb či menším prostorem na disku, často je součástí poskytnutých služeb i doména 2. či 3. řádu zahashovat - upravit řetězec hasovací funkcí - daný řetězec je tím zakódován inkrementace - proces při kterém proměnná zvýší svou hodnotu o 1 krok kernel - jádro operačního systému sledovaný server - server, který poskytuje data admin serveru, je monitorován
43
SEZNAM PŘÍLOH A CD s SCadmin 1.1
45
44
A
CD S SCADMIN 1.1
CD s aplikací SCadmin 1.1 a elektronická verze bakalářské práce • SCadmin - admin server • SCadmin - sledovaný server • bakalářské práce
45