HTTP a WWW servery

Vladimír Schreiner, xschrein@fi.muni.cz


Obsah

1. protokol HTTP
1.1. Request
1.2. Response
2. HTTP server Apache
2.1. instalace
2.2. konfigurace
2.3. moduly
2.4. virtuální servery
2.5. SSL
2.6. CGI skripty
3. alternativní HTTP servery
4. problém kódování a jazyka
4.1. statické řešení (MultiViews)
4.2. dynamické řešení
5. autentizace
6. reference

1. protokol HTTP

HTTP je protokolem aplikační vrstvy pracující nad TCP/IP. Původně byl navržen pro přenos hypertextových dat. Jeho univerzálnost jej ovšem předurčila k daleko širšímu použití. V současné době je k dispozici ve 3 verzích:

  • HTTP/0.9 - jednoduchý, pouze metoda GET

  • HTTP/1.0 - RFC 1945, metainformace o přenášených datech

  • HTTP/1.1 - RFC 2616, současná verze, podpora perzistentních spojení (keep-alive), request pipelining, lepší podpora virtuálních hostů

Protokol je bezstavový, postavený na architektuře request - response (požadavek - odpověď)

1.1. Request

Požadavek má tvar:

metoda url HTTP/verze
hlavičky

tělo dotazu

Jeho součástí je specifikace metody, která určuje, jak s požadovaným zdrojem naložit. Nejčastěji používanými metodami jsou GET, POST (paramtery v těle dotazu), HEAD (pouze hlavičky). Povinnout hlavičkou v HTTP/1.1 je Host:, pomocí Accept hlaviček lze serveru říct, jaké klient upřednostňuje kódování, jazyk, kompresi, ...

1.2. Response

Odpověď serveru má formát:

HTTP/verze kód_odpovědi krátký_popis_kódu_odpovědi
hlavičky

tělo odpovědi

Kód odpovědi je 3místné číslo oznamující klientovi jak byl požadavek zpracován (OK, chyba serveru, nutná autentizace, ..).

Příklad 1. příklad HTTP komunikace

$ telnet www.fi.muni.cz 80
Trying 147.251.48.1...
Connected to www.fi.muni.cz.
Escape character is '^]'.
HEAD /index.xhtml HTTP/1.1
Host: www.fi.muni.cz
Accept-Language: cs

HTTP/1.1 200 OK
Date: Sun, 09 Apr 2006 15:47:44 GMT
Server: Apache
Content-Location: index.xhtml.cs
Vary: negotiate,accept-language,accept-charset
TCN: choice
Content-language: cs, cs
Last-Modified: Tue, 28 Mar 2006 14:35:36 GMT
ETag: "1d746b8-21dc-442949b8-iso-8859-2;44386f42"
Accept-Ranges: bytes
Content-Length: 8668
Content-Type: text/html; charset=iso-8859-2

2. HTTP server Apache

Apache HTTP server je produktem Apache software foundation, jedná se tedy o open-source projekte (Apache license). Na Apachi běží více než 60% všech webových serverů. Za svou popularitu vděčí především bezpečnosti, modularitě (a tudíž snadné rozšiřitelnosti) a výkonu.

K dispozici je ve dvou vývojových větvích:

  • 1.x (aktuálně 1.3) - původní verze, dosud podporovaná a používaná. (Bude dále popisována)

  • 2.x - vyvinuta „from scratch“, multivláknová, podporuje IPv6, aktuálně doporučována verze 2.2

2.1. instalace

Instalovat můžeme z distribučních balíčků, nebo ze zdrojáků:

  1. zdrojovou distribuci získáme např. z http://httpd.apache.org/download.cgi

  2. zkonfigurujeme pomocí ./configure. Pro zakompilování modulu rewrite přidáme parametr --enable-module=rewrite, nebo --with-shared=rewrite

  3. make

  4. make install

2.2. konfigurace

Hlavním konfiguračním souborem je httpd.conf (v distribuci Slackware v /etc/apache/]. Detailní popis všech konfiguračních voleb nabízí dokumentace.

Tabulka 1. Popis vybraných konfiguračních voleb

název popis
ServerType inetd nebo standalone
DocumentRoot kořen adresářového stromu, ve kterém Apache hledá dokumenty
Listen [IP adresa:]port - server poslouchá jen na zvoleném rozhraní (defaultně poslouchá na všech rozhraních a portu definovaném pomocí Port
KeepAlive on nebo off - umožňuje využít vlastností HTTP/1.1 a neuzavřít spojení s klientem hned po odeslání odpovědi
User jméno uživatele, pod kterým má server běžet (měl by jej tedy spouštět superuživatel), obdobně Group
Options nastavuje, které z podpůrných funkcí serveru můžou být v využity. Nastavení dědičné pomocí + a - před názvem vlastnosti.
AccessFileName jméno souboru, který při patřičném nastavení definuje parametry pro přístup a práci s adresářem ve kterém se vyskytuje. Defaultně se používá .htaccess
AllowOverride která nastavení mohou být nakonfigurována v .htaccess

Přístup k jednotlivým zdrojům lze v Apachi kontrolovat jednoduše pomocí nástrojů modulu mod_access - nabízí direktivy Deny a Allow, přičemž jejich pořadí specifikuje Order

Příklad 2. povolení přístupu pouze z apache.org kromě foo.apache.org

Order Allow,Deny
Allow from apache.org
Deny from foo.apache.org

Platnosti některých konfiguračních voleb lze omezit, to obstarávají konfigurační direktivy <Directory> (omezení pak platí jen pro zadaný adresář a jeho podadresáře), <Files> (omezení platí jen pro soubory s názvem odpovídajícm zadané masce; lze zanořit do <Directory>) a <Location> (omezení platí jen pokud část URL specifikující cestu k dokumentu odpovídá zadané masce).

V bloku definovaném pomocí <Directory> se pak typicky využívá direktivy Options k vymezení funkcí, které lze v adresáři a podadresářích použít. Tedy např. spouštění CGI, generování seznamu souborů při chybějícím indexu, ...

Příklad 3. Použití Options

<Directory /web/docs>
    Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
    Options +Includes -Indexes
</Directory>

Tato nastavení lze měnit i pomocí souboru .htaccess v příslušném adresáři. Jeho používání musí být povoleno direktivou AllowOverride.

2.3. moduly

Modularita zajišťuje Apachi snadnou rozšiřitelnost. Moduly mohou být zakompilovné přímo do Apache, nebo být dostupé ve formě DSO (Dynamic Shared Object). DSO se zavádí direktivou LoadModule:

LoadModule vhost_alias_module libexec/apache/mod_vhost_alias.so

Zakompilované moduly se zavádí pomocí AddModule:

AddModule mod_cgi.c

Při přípravě modulů třetích stran lze využít aplikace apxs.

2.4. virtuální servery

Virtuální servery (v Apachi nazývaní virtuální hosti) umožňují současný běh několika serverů (s různými jmény) na jednom stroji. Rozlišujeme:

  1. IP-based: virtuální hosti rozlišení podle IP adresy požadavku

    Příklad 4. Nastavní IP-based hostů

    <VirtualHost 10.0.0.1>
        ServerName www.baygroup.org
        ServerAdmin webmaster@mail.baygroup.org
        DocumentRoot /groups/baygroup/www
    </VirtualHost>
  2. Name-based: rozlišení podle hlavičky Head: HTTP požadavku

    Příklad 5. Nastavení name-based hostů

    NameVirtualHost *
    
    <VirtualHost *>
        ServerName www.domain.tld
        DocumentRoot /www/domain
    </VirtualHost>
    
    <VirtualHost *>
        ServerName www.otherdomain.tld
        DocumentRoot /www/otherdomain
    </VirtualHost>

    Nelze použít se SSL - SSL je na jiné vrstvě ISO OSI modelu než HTTP, o hlavičce Host tedy nic neví. V době ustavování SSL spojení tedy Apache vybere prvního virtuáního hosta, který odpovídá rozhraní/portu, ze kterého spojení přichází.

Užitečný je příkaz httpd -S, vypíše konfiguraci virtuálních serverů.

2.5. SSL

SSL (a jeho nástupce TLS) je protokolem transportní vrstvy zajišťující bezpečnou komunikaci pomocí asymetrické (při vyjednávání o parametrech spojení) a symetrické (pro samotnou komunikaci) kryptografie.

Implementací SSL je například OpenSSL. Apache může využívat SSL pomocí modulu mod_ssl. Nejdříve je nutné vygenerovat certifikát, kterým se bude server autentizovat:

  1. vygenerování soukromého klíče serveru:

    $ openssl genrsa -des3 -out server.key 1024

    při vytváření se openssl ptá na heslo, kterým klíč chrání. To musí být později zadáno pokaždé při spuštění Apache - to lze obejít:

    $ cp server.key server.key.org
    $ openssl rsa -in server.key.org -out server.key 
  2. vytvoření CSR (Certificate signing request) - CN by mělo být doménovým jménem serveru

    $ openssl req -new -key server.key -out server.csr
  3. certifikát z těchto polotovarů generuje certifikační autorita. Pro testovací učely lze podepsat sám sebou:

    openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365

Apache se pak nakonfiguruje pro použití SSL s certifikátem server.crt a veřejným klíčem server.key.

2.6. CGI skripty

Mechanismus CGI (Common Gateway Interface) umožňuje klientům spouštět skripty na straně severu využívaje modulu mod_cgi.

Příklad 6. nastavení CGI

AddHandler cgi-script .cgi

<Directory "/kde/povolit/cgi">
    +ExecCGI
</Directory>

3. alternativní HTTP servery


4. problém kódování a jazyka

Apache akceptuje v klientově žádosti o dokument také hlavičky Accept , Accept-Language, Accept-Charset a Accept-Encoding, kterými klient sdělí serveru svou „představu“ o očekávaném dokumentu.

4.1. statické řešení (MultiViews)

Dokument se umístí do adresáře v různých jazykových mutacích s příslušným pojmenováním (např index.html.utf-8, nebo index.html.cs) a pro příslušný adresář se zapne Options +MultiViews. Kódy pro jazyky a znaové sady viz. AddLanguage, AddCharset, AddEncoding.

4.2. dynamické řešení

Kódování dokumentu lze měnit i dynamicky, toto řešení umožňuje udžovat pouze jendu verzi dokumentu a elegantně překódovávat dynamicky generované dokumenty. Lze využít např. CSáček, mod_czech nebo mod_html.


5. autentizace

Server Apache podporuje Basic autentizaci. Pokud je požadován takto chráněný dokument, vrací server odpověď 401 Authentication Required. Klient musí reagovat odesláním jména a hesla. Jelikož je HTTP bezstavový protokol, musí být jméno a heslo posíláno při každém požadavku - klienti se uživatele typicky zeptají pouze jednou, potom už jméno/heslo posílají automaticky.

Příklad 7. soubor .htaccess a omezení přístupu pomocí Basic autentizace

AuthType Basic
AuthName "Název realmu"
AuthUserFile /soubor/s/hesly
Require valid-user

Soubor s hesly lze spravovat nástrojem htpasswd.


6. reference