UNIX a Internet

Webové servery

Autor: Jiří Hnídek / jiri.hnidek@tul.cz

Historie Webu

  • 1989 - CERN - Tim Barners-Lee

URI

  • Uniform Resource Identifier
  • Jednoznačně identifikuje "dokument" v síti
  • Skládá se z URL a URN
    • Příklad: https://www.nekde.cz/neco/index.php?baf

URL

  • Uniform Resource Locator
  • Obecně vypadá takto: schéma://jméno:heslo@doména:port
    • schéma ... jméno protokolu, definuje zbytek URI
    • jméno:heslo ... umožňuje autentizaci
    • doména ... doménové jméno hosta
    • port ... číslo portu
  • Lze zadat i IP adresu
    • IPv4: schéma://jméno:heslo@127.0.0.1:port
    • IPv6: schéma://jméno:heslo@[::1]:port

URN

  • Uniform Resource Name
  • Příklad: /cesta?dotaz#kotva
    • cesta (path) ... cesta k dokumentu
    • dotaz (query) ... metodou GET lze předat data
    • kotva (anchor) ... značka uvnitř stránky

HTTP

  • Hypertext Tranfer Protocol (RFC 2616)
  • Transportní protokol TCP
  • Výchozí port je 80
  • Nejrozšířenější verze (rok 2016) je HTTP/1.1
  • Od roku 2015 je standardizována verze HTTP/2 (RFC 7540)
  • Textový a bezestavový protokol

HTTP dotaz

Posílá klient serveru:

GET / HTTP/1.1
Host: www.tul.cz
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: cs,en-US;q=0.8,en;q=0.6

HTTP odpověď

Na dotaz server odpovídá odpovědí:

HTTP/1.0 200 OK
Date: Fri, 15 Oct 2004 08:20:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.8
X-Powered-By: PHP/4.3.8
Vary: Accept-Encoding,Cookie
Cache-Control: private, s-maxage=0, max-age=0, must-revalidate
Content-Language: cs
Content-Type: text/html; charset=utf-8

Metody HTTP

  • Klient posílá metodu jako první klíčové slovo v HTTP dotazu.
  • Klient tím říká, co chce dělat s daným dokumentem
  • Nejčastěji používané metody: GET, POST, HEAD
  • PUT, DELETE, TRACE, atd. se příliš nepoužívají.

Metoda GET

  • Požadavek na získání dokumentu (html, css, obrázek, atd.)
  • Součástí dotazu jen HTTP hlavička
  • Parametry součástí URN (max 512 bytů)

Metoda POST

  • Většinou slouží k odeslání formulářů na server
  • Součástí dotazu i tělo

Metoda HEAD

  • Požadavek na získání meta informací o daném dokumentu
  • Server vlastní data dokumentu nepošle

Hlavička HTTP

  • Textová část dotazu i odpovědi
  • Položky hlavičky na samostatných řádcích ukončené znaky: \r\n
  • Hlavička je ukončena prázdným řádkem
  • Některé definované položky: Host, Connection, User-Agent, Server, atd.
  • Uživatelské položky: začínají X-

MIME Type

  • Typ internetového média
  • Multipurpose Internet Mail Extension
  • Identifikátor souborových formátů, které standardizuje IANA
  • Typ média má formát: typ/podtyp; volitelné parametry
    • Příklad: text/html; charset=UTF-8

HTTP a CNAME

  • V DNS serveru může mít jeden server přiděleno více doménových jmen (aliasů).
  • Překlad dvou doménových jmen může skončit s jednou IP adresou:
    • Příklad: gitlab.tul.cz, jetbrains.tul.cz
  • Aby server věděl, na který server se klient v HTTP dotazu dotazuje, tak jméno serveru musí být v hlavičce
  • GET / HTTP/1.1
    Host: gitlab.tul.cz

Virtuální servery

  • Položka Host v hlavičce HHTP dotazu od verse HTTP/1.0
  • Pro každý CNAME je na serveru jakoby virtuální webový server
  • Pro každé doménové jméno rozdílná konfigurace, logy, nastavení, atd.

HTTPS

  • HTTP je možné zabezpečit pomocí SSL/TLS
  • Schéma je https
  • Výchozí port je 443
  • Může negativně ovlivnit výkon aplikace
  • Test nastavení server možno povést na: www.ssllabs.com

SNI

  • Sever Name Indication
  • Při použití SSL/TLS není během handshaku ještě jasné s jakým virtuálním webovým server se bude komunikovat
  • Bez použití SNI musel certifikát obsahovat doménová jména všech virt. web. serverů
  • Problém pro web-hostingy
  • SNI umožňuje již během SSL/TLS handshaku avizovat s jakým doménovým jménem chceme komunikovat
  • Server na základě toho může použít správný certifikát

HTTP 2.0

  • Vychází z protokolu SPDY (Google)
  • Proudy a jejich priority
  • Nový formát zpráv
  • Komprese hlaviček
  • Textový i binární (prohlížeče podporují většinou pouze binární)
  • Server Push
  • Kontrola zahlcení příjemce
  • V roce 2016 používá 10% webů HTTP/2 (statistika z 10 milionů nejanvštěvovanějších webů)

WebSocket

  • HTML5 & Javascript
  • RFC 6455
  • Umožňuje asynchronní, plně duplexní komunikaci mezi klientem a serverem.
  • Textový i binární protokol
  • Schémata: ws:// (nezabezpečený) a wss:// (šifrovaný přenos)
  • Serverem nemusí být nutně webový server
  • Klientem nemusí být webový prohlížeč

HTTP dotaz prohlížeče

GET /game HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: game-1.0, game-1.1
Sec-WebSocket-Version: 13
Origin: http://example.com

HTTP odpověď serveru

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: game-1.1

Příklad WebSocket klienta

<script type="text/javascript">
$(function() {
    window.WebSocket = window.WebSocket || window.MozWebSocket;
    var websocket = new WebSocket('ws://127.0.0.1:9000',
                                  'game-1.0, game-1.1');
    websocket.onopen = function () {console.log('Connected');};
    websocket.onerror = function () {console.log('');};
    websocket.onmessage = function (message) {
        console.log(message.data);
    };
    $('button').click(function(e) {
        e.preventDefault();
        websocket.send($('input').val());
    });
});
</script>

WebSocket server

  • Je možné implementovat na webové serveru a použít stejný port (80/443)
  • Je ovšem nutné se serverem vytvořit nové TCP spojení.
  • Node.js
  • Python
  • Java
  • PHP
  • C/C++

AutoBahn

  • Framework zjednodušující implementaci WebSocketu a WAMP
  • autobahn.ws
  • Součástí projektu je i sada testů pro projekty implementující WebSocket protokol (klient i server)

Statické stránky

  • Soubory jsou vygenerované a uložené na disku / v paměti počítače
  • Rychlé a bezpečné (1000-10000 požadavků za vteřinu)
  • Snadno lze dosáhnout vysokého výkonu a omezení je v rychlosti síte, velikosti RAM případně rychlosti disků

Dynamické stránky

  • Stránka generována podle požadavku klienta
  • Dnes se nejčastěji používají interpretované jazyky: PHP, Python, Ruby, atd.
  • Pro snížení režie program běží stále se serverem komunikuje např. pomocí CGI rozhraní.

Apache

  • Nejpoužívanější webový server (40%)
  • Poměrně starý návrh (90. léta)
  • Pre-fork model: vytvoří několik potomků do zásoby, ale pro každé spojení vlastní proces.
  • Worker model: kombinuje více procesů a více jader.
  • Event model: podobné workeru, ale má vždy jedno naslouchací a jedno pracující vlákno pro dané spojení.

Procesy vs. vlákna

Pro porovnání časové náročnosti vytváření procesů a vláken je možné použít tyto dva příklady:

Příklad konfigurace

Konfigurační soubory se nacházejí v adresáři /etc/httpd

Hlavní konfigurační soubor: /etc/httpd/conf/httpd.conf

Další konfigurační soubory v: /etc/httpd/conf.d/*.conf

Případně v /etc/httpd/conf.modules.d/*.conf

NGINX

  • Dle Netcraft 2. nejpoužívanější webový server
  • Vznik v roce 2006.
  • Jeden naslouchací proces a pro každé CPU jádro jeden worker proces
  • Snaha o efektivní využívání zdrojů (CPU, paměť)
  • HTTP server, reverzní proxy, cache server, rozklad zátěže, dynamické stránky

Příklad konfigurace

  • Konfigurační soubory v /etc/nginx
  • Další konfigurační soubory jsou v /etc/nginx/conf.d/*.conf

Testování serveru

Děkuji za pozornost. Nějaké otázky?