HTTP a WWW servery

Martin Rumánek, martin(@)rumanek.cz

Obsah

Protokol HTTP

Je to nejčastěji používaný protokol v internetu. HTTP (HyperText Transfer Protocol) je protokol aplikační vrstvy. Byl navržený pro výměnu hypertextových dokumentů ve formátu HTML, které jsou uživatelům zobrazeny přes webový prohlížeč. Ale používá se i jinde, například pro webové rest služby. U těch se obvykle nepřenáší hypertextové dokumenty, ale data zabalená ve formátu JSON nebo XML.

HTTP Metody

GETvrací HTML stránku na dané URL
POSTposílání dat na server
HEADvrací hlavičku HTML stránky
PUTnahraje objekt na server
DELETEsmaže objekt ze serveru
CONNECTnaváže TCP spojení přes HTTP proxy (nutné pro SSL)

HTTP stavové kódy

1xxinformační
2xxúspěch
3xxpřesměrování
4xxchyba na straně klienta
5xxchyba na straně serveru

Příklady komunikace

GET METODA

nc fi.muni.cz 80
GET / HTTP 1.1
Host: www.fi.muni.cz

HTTP/1.1 200 OK
Date: Sun, 19 Oct 2014 19:17:45 GMT
Server: Apache
Content-Location: index.xhtml.cs
Vary: negotiate,accept-language,cookie
TCN: choice
Last-Modified: Sat, 18 Oct 2014 23:38:48 GMT
ETag: "368004-5eae-505bafbac9200"
Accept-Ranges: bytes
Content-Length: 24238
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Language: cs

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <title>Fakulta informatiky Masarykovy univerzity</title>
...

Range request

nc fi.muni.cz 80
GET // HTTP/1.1
Host: www.fi.muni.cz
Range: bytes=100-110
 
HTTP/1.1 206 Partial Content
Date: Mon, 20 Oct 2014 08:25:55 GMT
Server: Apache
Content-Location: index.xhtml.cs
Vary: negotiate,accept-language,cookie
TCN: choice
Last-Modified: Sun, 19 Oct 2014 23:39:04 GMT
ETag: "368003-5eae-505cf1a781600"
Accept-Ranges: bytes
Content-Length: 11
Content-Range: bytes 100-110/24238
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Language: cs

p://www.w3.
...

SPDY

HTTP neumí přenášet objekty paraleně, místo toho se otevírá několik TCP spojení. SPDY umožňuje multiplexing.

Komprimace hlaviček

Server push a server hint

Není standardní součástí Apache, nutné doinstalovat a načíst modul mod_spdy.

Konfigurace Apache

V různých distribucích na různých místech a pod různými jmény :-):

Debian: /etc/apache2/apache2.conf
Fedora: /etc/httpd/conf/httpd.conf

Kontexty konfiguračních direktiv

server config

Globální konfigurační direktivy
Listen 80 
DocumentRoot /var/www/html
AddDefaultCharset UTF-8

virtual host

Konfigurační direktivy pro konkrétního hosta

directory

Konfigurační direktivy pro konkrétní adresář
AllowOverride All
Options MultiViews Indexes FollowSymLinks

.htaccess

Soubor v konkrétním adresáři, vhodné když chceme například zaheslovat adresář. Musí být povolený AllowOverride.

Po každé změně konfigurace (kromě kontextu .htaccess) je nutné provést restart HTTP služby.

apachectl graceful

Virtuální servery

<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /www/example1
</VirtualHost>

Moduly

Detekce jazyka a kódování

Na základě hlaviček Accept-charset a Accept-language je možné zjistit, co koncový uživatel/prohlížeč preferuje. Vyhledání vhodné varianty dokumentu se zapíná parametrem MultiViews.

mod_negotation

Modul, který dodá klientovi správný soubor na základě hlaviček např. na základě Accept-Language a Accept-charset. Je nutné povolit MultiViews.
    Options MultiViews Indexes FollowSymLinks
    LanguagePriority en cs

mod_mime

Modul, který asociuje "meta informace" s příponou souborů.
    AddCharset UTF-8 utf8
    AddCharset iso-8859-2 iso8859-2
    AddLanguage cs cs
    AddLanguage en en	

SSL

Secure Sockets Layer zabezpečuje spojení mezi serverem a klientem pomocí šifrování a autentizace.

Certifikát podepsaný sám sebou vytvoříme interaktivním příkazem:

openssl req -new -x509 -days 365 -nodes -out /etc/ssl/certs/apache.pem -keyout /etc/ssl/certs/apache.key

U name-based virtuálních serverů je se SSL problém. SSL spojení se vytvoří ještě před jakoukoliv HTTP komunikací, v tomto momentě server netuší, na jaký virtuální server bude klientův požadavek směrovat.

Je možné použít SNI (Server Name Indication), musí být podpora na straně serveru i na straně klienta (ta je u nových prohlížečů dobrá).

mod_ssl

<VirtualHost 192.168.1.1:443>
        SSLEngine on

        SSLCertificateFile      /etc/ssl/httpd.crt
        SSLCertificateKeyFile   /etc/ssl/httpd.key
</VirtualHost>

Autentizace

Basic access authentication nevyžaduje cookies, login a heslo je zasíláno v hlavičce při každém requestu. Tyto údaje jsou zašifrovány pomocí base64, je možné je odposlechnout při každém reqeustu. Zajímavé je, že v HTTP není metoda, jak takto přihlášeného klienta odhlásit.

WWW-Authenticate: Basic realm="nmrs_m7VKmomQ2YM3:"

Nebo můžeme používat autentizační token uložený v cookies, jeho získání neumožní zpětné získání hesla. Samotný autentizační mechanismus (odeslání hesla přes formulář), by ale měl stejně běžet přes SSL.

Cookie: name=value; name2=value2

mod_auth_basic

<Location /secure>
    AuthType basic
    AuthName "private area"
    AuthBasicProvider  file
    AuthUserFile .htapasswd
    Require            valid-user
</Location>

mod_authn_file

Mod_auth_basic je možné napojit na několik druhů autentizačních modulů (LDAP a jiné databáze), nejjednodušší z nich je asi mod_authn_file. Stačí pouze vytvořit soubor s hesly příkazem:

htpasswd -c .htapasswd username

CGI

Je vchodné mít CGI skripty mimo náš DocumentRoot. Většinou se používá /var/www/cgi-bin.

mod_alias

 ScriptAlias /skript.cgi "/var/www/cgi-bin/skript.pl"
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

Apache a Debian

Seznam nainstalovaných modulů

/etc/apache2/mods-available
Načtení/vypnutí modulů: a2enmod, a2dismod

Definice virtuálních hostů

/etc/apache2/sites-available
Načtení/vypnutí virtuálních hostů: a2ensite, a2dissite

PROXY cache servery

Proxy server je prostředník mezi počítačem a serverem. Pro server se tváří jako klient, přijatou odpověď následně posílá zpět na klienta. Pokud ji má odpověď v keši, serveru se nedotazuje.

SSL a proxy cache servery

Reverse Cache Proxy

Bývá přímo před aplikačním serverem. Mezi ním a aplikačním serverem probíhá komunikace bez šifrování. SSL zajistí až reverzní proxy.

Forward Cache Proxy

V případě SSL komunikace se zajistí spojení přes PROXY server, HTTP metodou CONNECT. Takovéto spojení nemůže být technicky kešováno. Nebo se použije SSL Bumb - proxy server standardně komunikuje za nás a potom to podepíše vlastním certifikátem.

HTTP hlavičky versus HTTP-EQUIV

Funguje na prohlížeče, nikoliv na proxy servery - ty obvykle nečtou HTML zdrojový kód stránky, tak se těmi hlavičkami ani nemohou řídit.

Alternativní HTTP servery


Užitečné utility

Zjištění kódování:

enca soubor

HTTP požadavky na server:

curl -I -H "Accept-Charset: iso-8859-2" -H "Accept-Language: cs" http://localhost/

Konverze kódování:

iconv -f utf-8 -t iso-8859-2 soubor.utf8 > soubor.iso8859-2

Literatura