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ěď)
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, ...
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
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
Instalovat můžeme z distribučních balíčků, nebo ze zdrojáků:
zdrojovou distribuci získáme např. z http://httpd.apache.org/download.cgi
zkonfigurujeme pomocí ./configure. Pro zakompilování modulu rewrite přidáme parametr --enable-module=rewrite
, nebo --with-shared=rewrite
make
make install
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
.
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.
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:
IP-based: virtuální hosti rozlišení podle IP adresy požadavku
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ů.
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:
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
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
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
.
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.
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
.
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.