HTTP servery

Martin Bukatovič, xbukatov@fi.muni.cz

Obsah

Protokol HTTP

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.

Verze protokolu

Metody

Určují typ požadavku klienta. Mezi základní patří:

GETpožadavek na HTML stránku nebo jiný soubor
HEADpožadavek na hlavičku HTML stránky
POSTpředávání dat na server
PUTnahraje soubor na server
DELETEmaže soubor na serveru
OPTIONSzjišťování možností spojení
TRACEsledování dotazu zasílaný na server
CONNECTnastavení spojení

Hlavičky

Vychází ze standardu MIME. Každá hlavička je uvedena na samostatném řádku ve tvaru:

jméno-hlavičky: hodnota
Pokud hlavička začíná bílým znakem, jde o pokračování z předchozího řádku.

Zasílané klientem

Doplňují požadavek zaslaný serveru. Některé z nich:

Hostuvádí plné doménové jméno serveru
Acceptseznam MIME typů, kterým klient rozumí
Accept-Charsetpreferovaný znakové sady
Accept-Encodingpreferované kódování
Accept-Languagepreferované jazyky
User-Agentidentifikace klienta

Zasílané serverem

Popisují zasílaná data, některé zajímavé:

Content-TypeMIME typ zasílaných dat, např. image/png
Content-Encodingkódování zasílaných dat
Content-Lengthdélka dat
Expiresplatnost dat
Serveridentifikace serveru

Stavové kódy

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:

Apache

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.

Základní konfigurace

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.

Některé konfigurační direktivy

ServerNamenastavuje jméno serveru
DocumentRootkořenový adresář serveru
KeepAlivepovoluje výše zmíněných perzistentních spojení
Listenurčuje kde (adresa a port) bude server čekat požadavky
Includevložení konfigurace z jiného souboru

Moduly

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ř.:

Virtuální servery

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

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>

CGI

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>

Alternativní implementace

Literatura