WWW, HTTP Servery

Martin Kyselák, xkyselak@fi.muni.cz

Protokol HTTP

HTTP (HyperText Transfer Protocol) je jednoduchý protokol, který byl původně určený pro přenos HTML (HyperText Markup Language) dokumentů, dnes používán pro transport i jiných typů souborů včetně binárních. HTTP se v TCP/IP nachází v aplikační vrstvě. Přestože je postavený nad TCP, může spolehlivě fungovat nad jakýmkoliv jiným protokolem. Standardně je používán port 80. Komunikace probíhá na modelu klient-server, většinou formou request-response (požadavek-odpověď). HTTP je bezstavový protokol, tj. neposkytuje žádnou podporu pro uchování stavu HTTP komunikace.

Verze protokolu

HTTP/0.9

HTTP/1.0 (RFC 1945 z roku 1996)

HTTP/1.1 (RFC 2616 z roku 1999)

Hlavičky

Každá hlavička je na samostatné řádce a má tvar [jméno hlavičky]: [hodnota].

Hlavičky zasílané klientem

Hlavičky zasílané serverem

Adresování dokumentů

[schéma]://[uživatel]:[heslo]@[server]:[port]/[umístění]

Příklad metody GET

			
Trying 147.251.48.1...
Connected to aisa.fi.muni.cz.
Escape character is '^]'.
GET /~xkyselak/www.html HTTP/1.1
Host: www.fi.muni.cz
Accept: text/html, text/plain
Accept-Language: cs
Accept-Charset: iso-8859-2

HTTP/1.1 200 OK
Date: Thu, 05 Apr 2007 05:14:58 GMT
Server: Apache/2.0.59 (Unix) mod_fastcgi/mod_fastcgi-SNAP-0404142202 mod_ssl/2.0.59 OpenSSL/0.9.8
Last-Modified: Thu, 05 Apr 2007 05:14:18 GMT
ETag: "57d834b-18c-a48d3e80"
Accept-Ranges: bytes
Content-Length: 396
Content-Type: text/html; charset=ISO-8859-2
Content-Language: cs

<?xml version="1.0" encoding="iso-8859-2"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs">
        <head>
                <meta http-equiv="content-type" content="text/html; charset=iso-8859-2"/>
                <title>WWW, HTTP Servery</title>
        </head>
        <body>
                <h1>WWW, HTTP Servery</h1>
        </body>
</html>
Connection closed by foreign host.

HTTP server Apache

Apache HTTP Server je softwarový webový server s otevřeným kódem pro Linux, BSD, Microsoft Windows a další platformy. Vychází z NCSA HTTPd, v současné době je jeho vývoj koordinován sdružením Apache Group. Jeho podíl na webových serverch roste, v roce 2006 přesáhl 63 % (podle společnosti Netcraft). Domovská stránka pojektu je http://httpd.apache.org.

Instalace

Parametr pro configure --prefix=PREFIX určuje základní adresář pro instalaci, např. /usr/local/apache

Konfigurace serveru

Základem konfigurace Apache je bohatě komentovaný konfigurační soubor PREFIX/conf/httpd.conf

Některé volby (kurzívou výchozí hodnoty):

Omezení přístupu

Nastavení pomocí httpd.conf, varianty: jméno domény, ip adresa nebo její část, ip + maska.

Order Allow,Deny     # zamítnutí má vyšší prioritu
Order Deny,Allow     # povolení má vyšší prioritu

Příklad:

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

Nastavení pro adresáře

<Directory />   
   Options FollowSymLinks
   AllowOverride None
   Order Allow,Deny
   Deny from all
</Directory>

Hodnoty pro Options:

Další informace např. na http://www.root.cz/serialy/maly-pruvodce-konfiguraci-apache/.

Moduly - rozšíření funkcionality Apache

Moduly Apache, podobně jako moduly kernelu, je možné buď zakompilovat přímo do Apache nebo je nahrávat dynamicky jako tzv. DSO (Dynamic Shared Object). Pro nahrávání DSO Modulů slouží volba LoadModule v souboru httpd.conf, např.:

Příklady některých modulů:

Virtuální servery

Existují dva způsoby konstrukce virtuálních serverů: buď na základě IP adresy (IP-based) nebo využitím vlastností protokolu HTTP 1.1 (na základě jména - Name-based).

IP-based

Pro tuto konfiguraci je potřeba tolik virtuálních síťových rozhrananí, kolich chceme mít virtuálních serverů (v jádře musí být povolena podpora pro ip-aliasing). Nové virtuální rozhraní vytvoříme příkazem ifconfig:

ifconfig eth0:1 192.168.1.1
ifconfig eth0:2 192.168.1.2

a přidáme pro takto vytvořenou adresu platný DNS záznam, např. 192.168.1.1 --> www.domena1.cz a 192.168.1.2 --> www.domena2.cz. Zbývá nakonfigurovat httpd.conf:

<VirtualHost www.domena1.cz>
  ServerAdmin admin@domena1.cz
  DocumentRoot /home/httpd/html/virtual/domena1
  ServerName www.domena1.cz
  ServerAlias domena1.cz
  ErrorLog logs/domena1-error_log
  TransferLog logs/domena1-access_log
</VirtualHost> 

Pomocí ServerAlias můžeme přiřadít jednomu serveru více jmen (tomu můsí odpovídat DNS záznamy).

Name-based

Vytvoříme DNS záznamy pro všechny virtuální servery, v tomto případě ukazující na jednu IP adresu. Konfigurace httpd.conf je potom následující:

NameVirtualHost 194.213.243.3

<VirtualHost 194.213.243.3>
  ServerAdmin virtual1admin@domena.cz
  DocumentRoot /home/httpd/html/virtual1/
  ServerName www.virtual1.domena.cz
  ServerAlias virtual1.domena.cz
  ErrorLog /home/httpd/html/virtual1/log/error.log
  TransferLog /home/httpd/html/virtual1/log/access.log
  RefererLog /home/httpd/html/virtual1/log/referer.log
  AgentLog /home/httpd/html/virtual1/log/agent.log
</VirtualHost>

<VirtualHost 194.213.243.3>
  ServerAdmin virtual2admin@domena.cz
  DocumentRoot /home/httpd/html/virtual2
  ServerName www.virtual2.domena.cz
  ServerAlias virtual2.domena.cz
  ErrorLog /home/httpd/html/virtual2/log/error.log
  TransferLog /home/httpd/html/virtual2/log/access.log
  RefererLog /home/httpd/html/virtual2/log/referer.log
  AgentLog /home/httpd/html/virtual2/log/agent.log
</VirtualHost>
			

SSL

SSL/TLS je síťový protokol operující mezi transportní a aplikační vrstvou. Používá se pro šifrovaný přenos dat mezi serverem a klientem. SSL využívá asymetrické kryptografie (autentizaci a ustanovení sdíleného klíče relace) a symetrické kryptografie (přenášení dat v rámci relace).

Pro použití a nakonfigurování Apache se často používá OpenSSL a modul mod_ssl.

Konfigurační postup

SSL nelze použít u name-based virtuálních serverů. Vrstva SSL je umístěna pod vrstvou HTTP (de facto jej obaluje). Jakmile je vytvořeno SSL spojení (HTTPS), Apache (resp. mod_ssl) musí se vzdálenou stranou (klientem) domluvit parametry SSL spojení. Apache ale nemůže bez HTTP hlavičky Host delegovat dotaz na správný virtuální server, protože to je možné pouze po načtení HTTP hlavičky od klienta. Parametry SSL spojení naproti tomu musí být domluveny ještě před tím, než klient pošle nějaká data.

CGI

Common Gateway Interface (CGI) je technologie umožňující vytváření dynamických stránek. Jedná se vlastně o skripty, které na straně serveru dynamicky generují HTML, které webovýc server pošle klientovi. Při konfiguraci Apache je nutné aktivovat modul mod_cgi a nastavit příslušné volby v httpd.conf:

LoadModule modules/mod_cgi # aktivace modulu 
AddType application/x-httpd-cgi .cgi # skripty mají příponu CGI
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin" # použití aliasu na cgi-bin
<Directory "/usr/local/apache/cgi-bin"> # povolení spouštění CGI skriptů z adresáře
  Options ExecCGI
</Directory>

Pokud použijeme např. PHP, máme dvě možnosti. Nastavit PHP jako CGI (pak případně změníme přípony souborů z .cgi na .php) nebo jako modul php4_module (pro PHP 4), který se načte při startu Apache. Zde je nutná ještě dodatečná úprava konfiguračního souboru:

LoadModule php4_module modules/libphp4.so
AddType application/x-httpd-php .php # pro interpretaci PHP skriptů

Hlavní nastavení PHP je uloženo (typicky) v /etc/php.ini.

Alternativní HTTP servery

Jeden dokument ve více jazycích

Při dotazu na server může klient specifikovat znakovou sadu a jazyk dokumentů, které podporuje/preferuje (včetně případných kombinací a priorit možností). Např. Apache umožňuje zvolit reprezentaci dokumentů na základě těchto údajů:

Pro výběr vhodného dokumentu slouží volba MultiViews, resp. Options MultiViews (pro konfiguraci adresáře) a soubory v adresáři se liší příponou odpovídající kódu jazyka (dle ISO 639) a znakové sadě (např. index.html.cs.utf-8).

Čeština

Nevýhodou MultiViews je nutnost vytvářet pro každý jazyk a znakovou sadu celý vlastní dokument. Proto je lepší vytvořit jednu verzi dokumentu a tu dynamicky překódovávat (a překládat) podle klientem akceptovaných preferencí. K tomu slouží např. WWWdia, SaCzech, CSáček, mod_czech a mod_html.

Autentizace

Autentizace

Nepoužíváme-li SSL, je nutné provést autentizaci při každém spojení klienta se serverem znovu (HTTP je bezstavový protokol).

HTTP protokol nabízí Basic autentizaci pro autentizaci klienta pomocí hlavičky WWW-Authenticate: Basic realm="[jméno realmu]" a stavového kódu HTTP/1.0 401 Unauthorized. Pokud klient přijme uvedenou hlavičku a kód, musí si vyžádat od uživatele autentizaci. Protože tuto operaci je nutné provádět při každém požadavku, klient si přihlašovací údaje většinou pamatuje a uživatele autentizuje de facto bez jeho vědomí.

Další možnosti autentizace jsou např. pomocí otevřených cookies, pomocí identifikátoru spojení v cookies, pomocí IP adresy, a další.

Autentizovaný přístup do adresáře

V adresáři vytvoříme soubor .htaccess s  následujícím kódem:

AuthType Basic
AuthName "Můj adresář"
AuthUserFile <cesta k souboru s uživately a jejich hesly>
Require valid-user

Soubor se jmény uživatelů a jejich hesly se vytváří pomocí příkazu htpasswd.

Literatura

Archiv referátů (http://www.fi.muni.cz/~kas/p090/referaty/)
Netcraft: July 2006 Web Server Survey (http://news.netcraft.com/archives/2006/06/28/july_2006_web_server_survey.html)
Apache HTTP Server (http://cs.wikipedia.org/wiki/Apache)
PHP: Hypertext Preprocessor (http://www.php.cz)