Budujeme web server I.

19.02.2011 23:20 | Články | Dare_devil
Mnohé/mnohí z nás túžia spravovať vlastný web server. Či už z jednoduchej potreby mať veci pod kontrolou alebo z finančného hladiska. V tomto seriáli sa pokúsim zhrnúť všetky podrobnosti potrebné pre správny chod web serveru a jeho reálne nasadenie v praxi. Ako koreňovú distribúciu som vybral Debian, no články budú podľa možností obohatené aj o postupy pre distribúcie Arch Linux a Fedora. Za databázový server volíme MySQL, úvodom rozoberieme aj SQLite3 a PostgreSQL, no tým sa už ďalej venovať nebudeme.

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

    • chyba 20.02.2011 | 01:40
      Avatar Tomáš Srnka Barz čo, už asi všetko  Administrátor
      "včetne" => je cechizmus, spravne je vratane
      Dlho som robil linuxos.sk, neskôr založil vpsFree.cz, posledných pár rokov ako tech. riaditeľ vo Websupporte
      • Re: chyba 20.02.2011 | 11:03
        Avatar Dare_devil Debian, OpenSuse  Používateľ
        Dik, uvedomoval som si to ale nevedel som najst to spravne slovo po slovensky. Niekedy to hold vypadne
        There is no flag large enough to cover the shame of killing innocent people
        • Re: chyba 20.02.2011 | 14:45
          Avatar Tomáš Srnka Barz čo, už asi všetko  Administrátor
          sak pohoda, ja to poznam (2 roky v prahe)
          Dlho som robil linuxos.sk, neskôr založil vpsFree.cz, posledných pár rokov ako tech. riaditeľ vo Websupporte
          • Re: chyba 26.03.2011 | 03:48
            Avatar bedňa LegacyIce-antiX  Administrátor
            Ja píšem naschvál čechizmy už len z denno denného kontaktu a neviem kto okrem Matice slovenskej má s tým problém. Sorry, ale kakám na to. Každý nech píše ako to cíti, nech sa ešte aj Cimrmanove výroky začnú prekladať, zbohom. Na Slovenčinu seru, mám rád všetkých dobrých ľudí.
            Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
            • Re: chyba 11.04.2011 | 16:43
              Avatar Tomáš Srnka Barz čo, už asi všetko  Administrátor
              Sak jasne, ale ked uz pise niekto clanky (nie blogy!) v slovencine, tak by im mohol dat okrem odbornosti aj stipku profesionalizmu v podobe spravnej gramatiky.
              Dlho som robil linuxos.sk, neskôr založil vpsFree.cz, posledných pár rokov ako tech. riaditeľ vo Websupporte
    • Postrehy 20.02.2011 | 17:18
      Avatar Dare_devil Debian, OpenSuse  Používateľ
      Nejake postrehy, kritika 1. dielu ? Viem, ze tu toho moc nie je, hadam sa vam dalsie diely budu pacit viac
      There is no flag large enough to cover the shame of killing innocent people
      • Re: Postrehy 20.02.2011 | 17:59
        Avatar Michal Nánási Ubuntu 11.04  Používateľ
        Chybala mi tam zmienka o noSQL databazach (napriklad CouchDB), ktore su v niektorych pripadoch vhodnejsie ako SQL databazy.

        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).



        Hi! I'm a .signature virus! Copy me into your ~/.signature to help me spread!
        • Re: Postrehy 20.02.2011 | 18:00
          Avatar Michal Nánási Ubuntu 11.04  Používateľ
          Ale zabudol som povedat, ze sa mi ten clanok pacil:-)
          Hi! I'm a .signature virus! Copy me into your ~/.signature to help me spread!
        • Re: Postrehy 20.02.2011 | 18:08
          Avatar Dare_devil Debian, OpenSuse  Používateľ
          Vdaka za kritiku. Pravdupovediac ma zaradenie noSQL databaz ani nenapadlo, nakolko sa databazam v tomto clanku venujem velmi okrajovo a v ostatnych castiach serialu sa im nebudem venovat vobec. Vybral som preto tie tri najhlavnejsie, ktore som predpokladal, ze o nich mohla/mohol citatelka/citatal pocut/mat moznost pracovat s nimi.
          There is no flag large enough to cover the shame of killing innocent people
        • Re: Postrehy 20.02.2011 | 20:37
          Avatar Tomáš Srnka Barz čo, už asi všetko  Administrátor
          K facebooku - pouziva sa cassandra
          Dlho som robil linuxos.sk, neskôr založil vpsFree.cz, posledných pár rokov ako tech. riaditeľ vo Websupporte
          • Re: Postrehy 20.02.2011 | 20:39
            Avatar Dare_devil Debian, OpenSuse  Používateľ
            Chceli by ste aby som pri konfiguracii Apache zahrnul ako Cassandru ?
            There is no flag large enough to cover the shame of killing innocent people
            • Re: Postrehy 20.02.2011 | 22:56
              Avatar Tomáš Srnka Barz čo, už asi všetko  Administrátor
              Skor to zahrn k databazam, to s apache (ako webserver) nema okrem nadacie nic spolocneho
              Dlho som robil linuxos.sk, neskôr založil vpsFree.cz, posledných pár rokov ako tech. riaditeľ vo Websupporte
              • Re: Postrehy 21.02.2011 | 09:29
                tomy   Návštevník
                Verím, že ako je v názve uvedené I., bude to pokračovať.

                Páči sa mi to


                dík
                • Re: Postrehy 21.02.2011 | 16:46
                  Avatar Dare_devil Debian, OpenSuse  Používateľ
                  Dnes sa zverejni dalsi diel, perioda je cca kazde 3 dni
                  There is no flag large enough to cover the shame of killing innocent people
    • my.cnf syntax error 04.03.2011 | 16:11
      Palo   Návštevník
      "Ak chcete previesť zmenu na stálo, editujte /etc/mysql/my.conf nasledovne:
      [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.
      • Re: my.cnf syntax error 05.03.2011 | 13:41
        Avatar Dare_devil Debian, OpenSuse  Používateľ
        Vdaka za opravu
        There is no flag large enough to cover the shame of killing innocent people
    • RE: Budujeme web server I. 18.01.2014 | 20:29
      Avatar Patrik   Návštevník

      Asi to nepôjde aj na raspberry pi, však ?