HyperText Transfer Protocol je síťový aplikační protokol, který byl původně navržen pro přenos HTML stránek a později byl rozšířen o možnost přenosu libovolných dat. Vývoj protokolu probíhal pod vedením organizací W3C (World Wide Web Consortium) a IETF (Internet Engineering Task Force).
HTTP je postaveno na architektuře klient-server. Komunikace je bezstavová s následujícím základním schématem: klient otevře na server spojení, pošle svoji žádost a po doručení odpovědi je spojení uzavřeno. Protokol má textovou podobu a je mu vyhrazen tcp port 80.
Příklad jednoduché komunikace:$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET / HTTP/1.0 Host: localhost HTTP/1.1 200 OK Date: Sun, 01 Nov 2009 14:06:54 GMT Server: Apache Last-Modified: Sun, 01 Nov 2009 14:05:04 GMT Accept-Ranges: bytes Content-Length: 279 Connection: close Content-Type: text/html <html> <head><title>Hello World</title></head> <body> <h1>Welcome</h1> <p>It's working!</p> </body> </html> Connection closed by foreign host.
Určují typ požadavku klienta. Mezi základní patří:
GET | požadavek na HTML stránku nebo jiný soubor |
HEAD | požadavek na hlavičku HTML stránky |
POST | předávání dat na server |
PUT | nahraje soubor na server |
DELETE | maže soubor na serveru |
OPTIONS | zjišťování možností spojení |
TRACE | sledování dotazu zasílaný na server |
CONNECT | nastavení spojení |
Vychází ze standardu MIME. Každá hlavička je uvedena na samostatném řádku ve tvaru:
jméno-hlavičky: hodnotaPokud hlavička začíná bílým znakem, jde o pokračování z předchozího řádku.
Doplňují požadavek zaslaný serveru. Některé z nich:
Host | uvádí plné doménové jméno serveru |
Accept | seznam MIME typů, kterým klient rozumí |
Accept-Charset | preferovaný znakové sady |
Accept-Encoding | preferované kódování |
Accept-Language | preferované jazyky |
User-Agent | identifikace klienta |
Popisují zasílaná data, některé zajímavé:
Content-Type | MIME typ zasílaných dat, např. image/png |
Content-Encoding | kódování zasílaných dat |
Content-Length | délka dat |
Expires | platnost dat |
Server | identifikace serveru |
Stavový kód reprezentuje stav zpracování dotazu serverem. Je uveden na prvním řádku odpovědi serveru (před hlavičkou). Kódy jsou rozděleny do 5 skupin:
Server Apache dlouhodobě patří mezi nejrozšířenější http servery. Vznikl z NCSA HTTPd serveru a v současnosti se o jeho vývoj stará Apache Software Foundation.
Instalaci lze provést pomocí balíčkovacího systému, na Debianu jde o balíček apache2.
Konfigurace je kvůli přehlednosti rozdělena do několika konfiguračních souborů. Ve výchozím nastavení je hlavním konfigurační souborem httpd.conf. Každá distribuce řeší rozmístění a pojmenování konfiguračních souborů jinak, např. Debian má konfigurační soubory v adresáři /etc/apache2 s hlavním konfiguračním souborem apache2.conf.
ServerName | nastavuje jméno serveru |
DocumentRoot | kořenový adresář serveru |
KeepAlive | povoluje výše zmíněných perzistentních spojení |
Listen | určuje kde (adresa a port) bude server čekat požadavky |
Include | vložení konfigurace z jiného souboru |
Apache je navržen modulárně a existuje tak pro něj spousta rozšiřujících modulů.Ty mohou být buď přímo zakompilovány v serveru nebo zvlášť ve formě sdílených knihoven. Konkrétní externí moduly se zapínají pomocí direktivy LoadModule. Použití, např.:
Server Apache dokáže provozovat více nezávislých serverů v rámci jednoho stroje, čehož se využívá např. při webhostingu. Konfigurace virtuálního serveru je nezávislá na ostatních - každý má svůj adresář s daty, log a pod. Aby bylo možné od sebe virtuální stroje rozeznat, má každý přiřazenu buď přímo ip adresu (tj. fyzické nebo virtuální síťové rozhraní) nebo doménové jméno.
Příklad konfigurace virtuálních serverů dle jména (name-based): na stroji s jednou ip adresou provozujeme servery pro www.domain.tld a www.otherdomain.tld.
NameVirtualHost *:80 <VirtualHost *:80> ServerName www.domain.tld ServerAlias domain.tld *.domain.tld DocumentRoot /www/domain </VirtualHost> <VirtualHost *:80> ServerName www.otherdomain.tld DocumentRoot /www/otherdomain </VirtualHost>
Příklad konfigurace virtuálních serverů dle ip adresy (ip-based): na stroji, který má několik síťových rozhraní, provozujeme server pro každé rozhraní zvlášť.
<VirtualHost 172.20.30.40> DocumentRoot /www/example1 ServerName www.example.com </VirtualHost> <VirtualHost 172.20.30.50> DocumentRoot /www/example2 ServerName www.example.org </VirtualHost>
Obě možnosti jdou kombinovat, např. v případě, kdy má stejný server běžet na více různých rozhraních.
SSL zajišťuje zabezpečený přenos dat založený na kryptografii s veřejným klíčem. Certifikát serveru může pro zvýšení důvěryhodnosti podepsán certifikační autoritou. Pro použití SSL je třeba načíst modul mod_ssl, který je rozhraním pro knihovnu OpenSSL.
U virtuálních serverů založených na jméně lze zprovoznit podporu pro SSL jen u jednoho z nich, jinak by došlo ke konfliktům - SSL certifikáty jsou vystavovány na doménové jméno.
Ukázka konfigurace SSL u virtuálního serveru:
<VirtualHost _default_:443> SSLEngine on SSLCertificateFile /etc/pki/tls/certs/localhost.cert SSLCertificateKeyFile /etc/pki/tls/private/localhost.key </VirtualHost>
Jde o techniku, která umožňuje spouštění skriptů pro generování http odpovědí. Řeší podobný problém jako mod_php nebo mod_perl, ale není omezeno na konkrétní jazyk. Pro spouštění cgi skriptů je nutné načíst modul mod_cgi.
CGI skripty je možné umístit v jednom adresáři pomocí direktivy ScriptAlias, která zajišťuje přesměrování i povolení ke spouštění skriptů:
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
Dále je možné povolit spouštění skriptů mimo adresář cgi-bin dle přípony:
<Directory /home/*/public_html> Options +ExecCGI AddHandler cgi-script .cgi DirectoryIndex index.html index.cgi </Directory>