Základ web serveru
Ako je už zvykom, aj pri vytváraní web serveru je možné vybrať si software, ktorý použijeme. Pri nasadzovaní je potrebné zvážiť viacero aspektov:
- Vaše zručnosti
- Časová náročnosť
- Dostupný hardware
- Funkčnostné požiadavky na server
LightHTTPD Server
( domovská stránka projektu http://www.lighttpd.net/ )
Ako prvý v poradí je najmenej náročný Lighttpd. Jeho názov vznikol spojením slov Light, HTTP a Daemon. Je navrhnutý a optimalizovaný pre vysoko výkonné prostredie, má malé nároky na pamäť, efektívne riadi vyťaženie procesora a má pokročilú sadu funkcií. Lighttpd je perfektné riešenie pre servery, ktoré trpia zvýšenou záťažou. Je vydaný pod upravenou BSD licenciou a je samozrejme Open Source. Aby toho nebolo málo, medzi jeho referencie patria giganti ako je YouTube, Wikipedia a Meebo. Je optimalizovaný pre množstvo paralelných ( keep-alive ) spojení, čo je veľmi dôležité pre dosiahnutie najlepšieho výkonu AJAX aplikácií.
Apache HTTP Server
( domovská stránka projektu http://httpd.apache.org/ )
Druhý v poradí prichádza do úvahy Apache HTTP Server. V dnešnej dobe je najrozšírenejší ( v r. 2008 používanosť dosiahla 50,42% ), má širokú komunitu vývojárov a používateľov a veľkú podporu. Samozrejme, spadá do kategórie Open Source a je poskytovaný pre Linux, BSD systémy, systémy Microsoft Windows a i.. Je pomerne jednoducho konfigurovateľný a zvláda väčšie záťaže. Je o čosi robustnejší ako Lighttpd a dnes patrí medzi štandarty.
Nginx
( domovská stránka projektu http://nginx.org/en/ )
S gradujúcou náročnosťou tu máme Nginx, čím sa už prestávame hrať na piesočku a nastupujeme na vyšší level. Aj napriek tomu že sa dá používať aj ako bežný web server, prevažne sa používa na vysoko navštevovaných a často používaných serveroch, ktoré musia spracovávať veľké množstvo dopytov každú sekundu. Sila Nginx spočíta v tom, že každou operáciou používateľ odosiela žiadosti ( requests ) na Nginx server, no ten si podľa typu obsahu obdržaného requestom operácie roztrieďuje do vlastnej, súkromnej siete serverov. Ako ostatné je samozrejme Open Source a je vydaný pod 2-článkovou BSD licenciou.
V nasledujúcich častiach seriálu si prejdeme konfigurácu každého jedného, pričom pri každom jednom sa toho pokusím zahrnúť čo najviac.
Databázový server
Databázový server je neodmysliteľnou súčasťou väčšiny web serverov. Plní úlohu uchovávania dát a poskytuje k nim jednoduchý a rýchly prístup. Ako aj pri web serveroch, aj tu máme možnosť voľby a preto záleží iba na nás, čo sa rozhodneme nasadiť. Je však potrebné, aby nasadeniu predchádzalo pečlivé zváženie okolností.
SQLite3
( domovská stránka projektu: http://www.sqlite.org/ )
SQLite3 je najrozšírenejším SQL engine-om, je veľmi malý, sebestačný a nevyžaduje žiadnu konfiguráciu. Jeho uplatnenie nájdeme napríklad pri Mozilla Firefox / Thunderbird, ktoré využívajú potenciál tejto knižnice pre ukladanie rôznych položiek, ako napríklad záložky, cookies, kontakty a podobných drobností, pri ktorých si SQLite3 našla svoje uplatnenie.
MySQL
( domovská stránka projektu: http://www.mysql.com/ )
MySQL databázový systém sa stal najobľúbenejším vďaka svojej podpore, vysokému výkonu, spoľahlivosti a jednoduchému používaniu. Je často používaný v spojení LAMP, tj. Linux Apache MySQL Perl / Php / Python. Používa ju väčšina serverov, vrátane Facebook, Google, Adobe a iné.
PostgreSQL
( domovská stránka projektu: http://www.postgresql.org )
Gradáciou sme sa dostali až ku PostgreSQL, čo je výkonný, open source objektovo-relačný databázový systém. Má za sebou viac ako 15 rokov aktívneho vývoja, beží na väčšine operačných systémov, vrátane UNIX ( AIX, BSD, HP-UX a iné ). Len pre predstavu masívnosti tohto systému, jedna tabuľka môže mať veľkosť až 32 TB.
V skratke sme si predstavili tri základné databázové systémy, z ktorých si vyberieme, ako som už spomenul, iba MySQL. Zaoberať sa tak širokospektrálne všetkým nie je možné, ale vzhľadom na dostupnosť informácií v dnešnej dobe pre nikoho nemôže byť problém v prípade záujmu nájsť si ďalšie informácie.
Inštaláciu MySQL serveru prevedieme ako prvú, vzhľadom na to, že bude použitý pre každý zo spomenutých softwareových web serverov, ktoré si hodláme predstaviť v ďalších častiach seriálu. Inštalácia je veľmi jednoduchá, no pre každý systém odlišná.
Debian:
Inštaláciu prevedieme za pomoci
# aptitude install mysql-server mysql-client
Arch Linux:
Inštaláciu prevedieme za pomoci
# pacman -S mysql
Následne spustíme MySQL server a bezpečnostné opatrenia
# /etc/rc.d/mysqld start && mysql_secure_installation
Následne je potrebné MySQL reštartovať príkazom
# /etc/rc.d/mysqld restart
Fedora:
Inštaláciu prevedieme za pomoci
# yum -y install mysql mysql-server
Následne povolíme MySQL služby systému
# /sbin/chkconfig mysqld on
Spustíme MySQL
# /sbin/service mysqld start
Nastavíme nové heslo používateľovi root
# mysqladmin -u root password 'heslo'
Tým by sme mali MySQL server nainštalovaný. Pre overenie, či mysql beží, spustíme
# netstat -tap
Vo výslednom logu by sme mali vidieť niečo podobné:
tcp 0 0 localhost:mysql *:* LISTEN 6802/mysqld
Následne sa môžme do MySQL prihlásiť príkazom
$ mysql -u root -p
Po prihlásení do MySQL prostredia nás privíta riadok začinajúci na mysql>. V prípade, že ideme nasadzovať hotový systém pre správu webu alebo inak pracovať s MySQL, je veľmi užitočné vytvoriť si pre každú aplikáciu zvlášť prihlasovací účet a nastaviť mu korektne práva.
Vytvoríme si modelovú situáciu. Server nasadzujeme vo firme, v ktorej pracuje interný pracovník, ktorý má plný prístup ku správe databáz. Rozsah siete je 10.174.32.1/24 a internista má pridelenú statickú IP adresu 10.174.32.102 . Ďalej máme externý skript na adrese 192.168.3.2, ktorý tieto informácie z databáze čerpá a následne ich spracováva. Najjednoduchšie by bolo používať jeden používateľský účet a tj. root, ale to je z pohľadu bezpečnosti veľmi riskantné a neuvážené správanie.
Pre túto potrebu si vytvoríme databázu, ku ktorej budeme pristupovať:
mysql> CREATE DATABASE sklad;
A vytvoríme si dvoch používateľov:
mysql> CREATE USER 'internista'@10.174.32.102 IDENTIFIED BY 'heslo_internistu';
mysql> CREATE USER 'externista'@192.168.3.2 IDENTIFIED BY 'heslo_externistu';
Zápis je pomerne jednoduchý, myslím si, že rozoberať ho nie je potrebné. Teraz pristúpime na nastavenie práv.
Pre uľahčenie budeme nastavovať práva pre všetky tabulky v databázi.
mysql> GRANT ALL PRIVILEGES ON sklad.* TO 'internista'@10.174.32.102;
mysql> GRANT SELECT ON sklad.* TO 'externista'@192.168.3.2;
Prvý príkaz dá všetky práva na databázu sklad a všetky tabuľky v nej používateľovi 'internista' na adrese 10.174.32.102. Pričom druhý príkaz pridelí právo iba na SELECT na databázu sklad a všetky tabuľky v nej používateľovi 'externista' iba z adresy 192.168.3.2.
Týmto by ste mali získať elementárne znalosti ohľadom zabezpečenia databáz a predísť tak prípadným nejasnostiam. Aj napriek elementárnosti problematiky je tento fakt často podceňovaný.
Poďme si však predstaviť fintičky, ktoré zefektívnia našu prácu s MySQL serverom.
Vypnutie DNS Hostname Lookup
Aj napriek niekoľkým negatívnym reakciám považujem vypnutie DNS Hostname Lookupu za zefektívnenie prístupu. MySQL server často a často zbytočne rozpoznáva DNS záznamy aj napriek tomu, že na to nemá reálny dôvod. Väčšina z nás používa na pripájanie sa na MySQL server IP adresu a nie DNS záznam. Vypnutím sledovania DNS záznamu zvýšime prihlasovaciu odozvu o 2 sekundy, čo nie je na zahodenie. Taktiež, tento krok znemožnuje útočníkovi podstrčiť iný stroj pre DNS záznam ktorý používame zmenou /etc/hosts.
Konfiguračný súbor MySQL sa nachádza v /etc/mysql/my.conf. Stačí ho editovať podľa predlohy:
[mysqld]
.....
......
skip-name-resolve
Pozor si však musíme dávať pri nastavovaní prístupových práv, nakoľko doteraz sme mohli používať aj zápis obsahujúci DNS záznam, teraz musíme miesto DNS používať IP adresu.
Aktivovanie tzv. "Query cache"
Po predošlom kroku môžme sledovať rýchlejšiu odozvu, no server stále naberá na záťaži. Môže za to tzv. vyrovnávacia pamäť dotazov.
Pre zistenie aktuálneho stavu použijeme príkaz:
mysql> SHOW STATUS LIKE 'Qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 3 |
| Qcache_free_memory | 16657360 |
| Qcache_hits | 789 |
| Qcache_inserts | 119 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 369 |
| Qcache_queries_in_cache | 89 |
| Qcache_total_blocks | 196 |
+-------------------------+----------+
8 rows in set (0.00 sec)
Na zaťaženom serveri môžme pozorovať absenciu pamäťe a preto je nutné zväčšiť vyrovnávaciu pamäť dotazov. Pre zistenie aktuálneho nastavenia serveru môžme použiť:
mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+----------+
| Variable_name | Value |
+------------------------------+----------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 16777216 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+----------+
6 rows in set (0.00 sec)
Je potrebné, aby bolo have_query_cache nastavené na YES a query_cache_type na ON. Ak nie je, intuitívne pozmente nasledujúci príkaz, ktorým zvýšime vyrovnávaciu pamäť na 50M
mysql> SET GLOBAL query_cache_size = 52428800;
Ak chcete previesť zmenu na stálo, editujte /etc/mysql/my.conf nasledovne:
[mysqld]
...
...
query_cache_size = 52428800
Týmto by sme mali MySQL server zvládnutý. V nasledujúcich dieloch si prejdeme detailným nastavením Lighttpd, Apache a Nginx, poriadne si zabezpečíme server a naučíme sa monitorovať si činnosť na serveri. Tento diel je potrebný ako jemný úvod do nasledujúcich častí seriálu a preto je potrebné, aby sme mali aspoň ako taký prehľad o technológiách, ktoré budeme používať.
Čo sme sa dnes naučili:
- Rozdiely medzi SQLite3, MySQL a PostgreSQL a ich uplatnenie v praxi
- Rozdiely medzi Lighttpd, Apache2 a Nginx a ich nasadenie
- Nainštalovať databázový server MySQL na systémoch Debian/Arch Linux/Fedora
- Nastaviť základné prístupové práva pre databázu, čím sme zvýšili bezpečnosť serveru
- Zlepšiť výkon MySQL serveru
Napriklad google pouzival svoju noSQL databazu Bigtable, MySQL pouziva napriklad na reklamy. Facebook pouziva MySQL len na ukladanie hodnot key->value, zvysok sa rata externe a na niektore veci pouzivaju tiez nejaku noSQL databazu (tu som si nie isty, ale asi tiez nieco vlastne).
Páči sa mi to
dík
[mysqld]
...
...
query_cache_size = 52428800<font color=red>;</font>"
; na konci riadku v /etc/my.cnf (Tam je subor umiestneny vo Fedore 14.) sposobi, ze mysqld sa nenastartuje a vyhodi chybovu hlasku.
Asi to nepôjde aj na raspberry pi, však ?