WWW, HTTP servery

Jan Krčál, 139854 at mail.muni.cz


Obsah


Protokol HTTP

HTTP je bezestavovým 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ě se používají 2 verze:


Požadavek

Schéma

metoda cesta_dokumentu verze_protokolu
hlavičky
prázdný_řádek
data

Metody: (první tři od verze 1.0, další od verze 1.1)

GET
získaní dokumentu ze serveru. Parametry sa předávají přes adresu požadavku
POST
zaslání dat na server (např. u formuláře)
HEAD
získání hlaviček dokumentu
DELETE
odstranění dokumentu na daném URL ze serveru
PUT
uložení dokumentu na daném URL
TRACE
zjištění spojení
CONNECT
nastavení způsobu spojení
OPTIONS
zjištění možností spojení

Vybrané hlavičky:

NázevPopisPříklad
AcceptMIME typy, které dokáže klient zpracovat.text/html, text/plain, image/jpeg
Accept-CharsetPřijatelné znakové sadyiso-8859-2
Accept-EncodingPřijatelné zakódování obsahucompress, gzip
Accept-LanguagePřijatelné jazyky dokumentucs, en
User-AgentKlientský program uživateleCtuWebPresTelnet1.0
RefererZ které stránky klient přišelhttp://www.fi.muni.cz/
If-Modified-SinceByl dokument modifikovaný od zadané chvíle?Tue, 11 Apr 2006 19:40:00 GMT

Odpověď

Schéma

verze_protokolu stavový_kód stavový_text
hlavičky
prázdný_řádek
data_odpovědi

Vybrané kódy odpovědi

200
OK
301
Moved Permanently
304
Not Modified
403
Forbidden
404
Not Found
500
Internal Server Error

Vybrané hlavičky odpovědi:

NázevPopisPříklad
Content-TypeMIME typ odpovědi a znaková sada.text/html; charset=ISO-8859-2
Content-EncodingKódování odpovědicompress, gzip
Content-LanguageJazyk odpovědien
Content-LengthDélka odpovědi (počet bytů).11265
ServerServer, který odpověď poslalApache
LocationSkutečné umístění obdrženého dokumentuindex.xhtml.cs
ExpiresČas kdy vyprší platnost dokumentuWed, 08 Nov 2006 03:14:21 GMT
Last-ModifiedDatum poslední úpravy dokumentuWed, 08 Nov 2006 01:38:32 GMT

Příklad komunikace GET

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

HTTP/1.1 200 OK
Date: Wed, 08 Nov 2006 04:12:13 GMT
Server: Apache
Content-Location: index.xhtml.cs
Vary: negotiate,accept-language,accept-charset
TCN: choice
Content-language: cs, cs
Last-Modified: Wed, 08 Nov 2006 03:38:34 GMT
ETag: "1f8bf89-2b20-4551513a-iso-8859-2;454d5c51"
Accept-Ranges: bytes
Content-Length: 11040
Content-Type: text/html; charset=iso-8859-2

<?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">
<!-- Generovano  -->
...

Příklad komunikace POST

$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
POST /okb/index.php HTTP/1.0
From: 139854@mail.muni.cz
User-Agent: telnet
Content-Type: application/x-www-form-urlencoded
Content-Length: 14

password=xxx
HTTP/1.1 200 OK
Date: Wed, 08 Nov 2006 04:02:10 GMT
Server: Apache/2.0.55 (Ubuntu) PHP/5.1.6
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=d115267eba6810fe9e2b178598b2393d; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 704
Connection: close
Content-Type: text/html; charset=UTF-8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head>
...

Hlavičky HTTP-Equiv

Protože je spousta důležitých informací o dokumentu přenášena ve formě http hlaviček, nastane problém, když otevřeme lokálně uložený html soubor. K němu totiž http hlavičky přímo nemáme. Proto je vhodné do html přidávat náhradu za tyto hlavičky - HTML META http-equiv:

<META http-equiv="Content-Type" content="text/html; charset=utf-8">

Server Apache

Jednotlivé verze

Open source server, který vyvýjí The Apache Software Foundation. Podle výzkumu firmy Netcraft je Apache v současnosti na přibližně 60% z celkového počtu 102 miliónů veřejných webových serverů.

V současné době existují v zásadě tři verze serveru:

Dále se budu zabývat verzí 2.0.


Konfigurační direktivy

Nastavení serveru je rozdělené do několika souborů. Všechny se typicky nacházejí v adresáři /etc/apache2. Konfiguruje se pomocí direktiv, které se mohou vyskytnout v následujících kontextech:

nastavení serveru
tedy hlavně v souboru apache2.conf, vztahují se k celému serveru
virtuální hostitel
uvnitř sekce <VirtualHost>, vztahují se k jednomu konkrétnímu virtuálnímu serveru
adresář
uvnitř sekce <Directory>, <Location> nebo <Files>, vztahují se k souborům/adreářům vybraným v parametrech sekce (k výběru se možné využít i regulární výrazy)
.htaccess
opět se vztahuje k vybranému adresáři a jeho podadresářům, rozdíl je v tom, že konfigurační soubor je fyzicky v tomto adresáři (např. na sdíleném webhostingu umožňuje jednotlivým uživatelům nastavit moduly, které potřebují)

Následuje tabulka několika základních konfiguračních voleb.

názevpopispříklad
DocumentRootkořen dokumentů virtuálního serveruDocumentRoot /var/www/
DirectoryIndexsoubory, které server hledá v adresáři, aby je zobrazil, když uživatel zadá adresu adresářeDirectoryIndex index.html index.cgi index.pl index.php index.xhtml
ServerAdmine-mailová adresa správce serveruServerAdmin admin@speo.lab.fi.muni.cz
AllowOverrideurčuje, které direktivy mohou být nahrány ze souborů .htaccess (povolené nastavení v .htaccess pak převáží globální nastavení). Může nabývat hodnot:
All | None | (AuthConfig | FileInfo | Indexes | Limit | Options)*
AllowOverride AuthConfig Indexes
Optionsnastavuje (nebo upravuje) povolené funkce pro daný adresář. Například zobrazení obsahu adresáře, spouštění CGI skriptů, povolení SSI, ...Options -Indexes

Viruální servery

Na každém serveru může současně běžet mnoho virtuálních serverů. A každý z nich může být jinak nastavený. Všechny nakonfigurované virtuální servery by měly být v adresáři /etc/apache2/sites-available. Zapínají se pak přidáním symbolického odkazu do adresáře /etc/apache2/sites-enabled.

Jsou dva typy rozslišení jednotlivých virtuálních serverů:


Moduly

Apache je silně modulární. V oficiální distribuci je okolo 60 modulů, na internetu jich je dostupných několik stovek. Konfigurace k jednotlivým modulům je v adresáři /etc/apache2/mods-available, zapnuté moduly mají symbolický odkaz ke konfiguraci v adresáři /etc/apache2/mods-enabled.

Příklad konfigurace modulu mod_userdir (v praxi je rozdělena na dva soubory userdir.load a userdir.conf):

LoadModule userdir_module /usr/lib/apache2/modules/mod_userdir.so
<IfModule mod_userdir.c>
        UserDir public_html
        UserDir disabled root

        <Directory /home/*/public_html>
                AllowOverride FileInfo AuthConfig Limit
                Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
        </Directory>
</IfModule>

Praktické konfigurační úkoly

Další možnosti Apache raději ukážu na konkrétních úkolech.

Filtrování přístupu

direktivy Allow, Deny, Order

Filtrování uživatelů podle doménového jména, IP adresy (nebo rozsahu IP adres) nebo parametrů HTTP požadavku.

Příklad podle IP:
Order Deny,Allow
Deny from all
Allow from 10 172.20 192.168.2
Allow from fi.muni.cz
Příklad podle proměnné prostředí:
SetEnvIf User-Agent ^KnockKnock/2\.0 let_me_in
Order Deny,Allow
Deny from all
Allow from env=let_me_in

SSL vrstva

modul mod_ssl, direktivy SSLEngine, SSLCertificateKeyFile, SSLCertificateFile a mnoho dalších

SSL (resp. TSL) je protokol transportní vrstvy pro zabezpečenou komunikaci. Využívá jak asymetrickou kryptografii (při vytváření spojení), tak symetrickou kryptografii (pro samotná data). Tento protokol implementuje například OpenSSL.

Protože protokol SSL obaluje HTTP, je SSL sezení oddělené od HTTP sezení. SSL požadavek neobsahuje jméno hostitele, proto není možné použít více virtuálních serverů se SSL odlišených podle jména. Podle IP adresy to samozřejmě možné je. Příklad vytvoření tajného klíče a certifikátu:

	# vytvoření tajného klíče
$ openssl genrsa -out server.key 1024
	# vytvoření CSR (Certificate signing request)
$ openssl req -new -key server.key -out server.csr
	# certifikát pak generuje certifikační autorita. Pro testovací učely si to můžeme podepsat sami:
$ openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365
Příklad konfigurace:
<VirtualHost _default_:443>
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SSLProtocol All -SSLv2
SSLCipherSuite HIGH:MEDIUM
</VirtualHost>

CGI a jiné skripty

modul mod_cgi, mod_php5, atd., direktivy Options, AddType

CGI (Common Gateway Interface) umožňují pomocí skriptů dynamicky generovat data zasílaná klientovi.

Příklad s CGI:
LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so		# modul cgi
AddHandler cgi-script .cgi						# akce pro soubory .cgi
ScriptAlias /cgi-bin/ "/var/www/cgi-bin"				# alias pro adresář s cgi skripty
<Directory "/var/www/cgi-bin">						# nastavení adresáře
 Options ExecCGI
</Directory>
Příklad s PHP:
LoadModule php5_module /usr/lib/apache2/modules/libphp5.so		# modul php
AddType application/x-httpd-php .php .phtml .php3			# typ php souboru
AddType application/x-httpd-php-source .phps

Více jazykových verzí jednoho souboru

modul mod_negotiation , direktivy Options, AddType

Často chceme mít jeden dokument ve více jazycích a kódováních. Apache podporuje vyjednávání obsahu podle HTTP/1.1. Klient může zaslat následující hlavičky:

V zásadě máme několik možností:

Příklad s mapou:
AddHandler type-map .var
 URI: foo

URI: foo.en.html
Content-type: text/html
Content-language: en

URI: foo.fr.de.html
Content-type: text/html;charset=iso-8859-2
Content-language: fr, de
Příklad s MultiViews:
Options +MultiViews

Vyžádání autentizace

modul mod_auth , direktivy AuthType, AuthName, AuthUserFile, Require

Protože protokol HTTP nemá žádnou podporu pro sezení, je potřeba autentizaci provádět při každém požadavku. Existuje několik možností:

U HTTP Basic autentizace je potřeba vytvořit hesla, k tomu slouží příkaz htpasswd.

Příklad s HTTP Basic:
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/apache2/passwords
Require valid-user

Elegantní adresy pomocí přepisu

modul mod_rewrite , direktivy RewriteEngine, RewriteRule, RewriteCond

Pokud chceme získat na našem webu snadno zapamatovatelné a atraktivní adresy, které ovšem všechny obslouží jeden (např. PHP) skript, nezbývá než použít přepis adres.

Ten způsobí, že navenek se zdá, že přistupujeme k pěkné adrese (např. http://www.firma.cz/kontakt), ve skutečnosti se tato adresa uvnitř serveru přepíše na úplně jinou (např. http://www.firma.cz/index.php?name=kontakt).

Příklad:
RewriteEngine On

RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ /index.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^(.*)\/?$
RewriteRule ^(.*)$ /index.php?name=$1 [L]

Syntaxe je poměrně komplexní a umožňuje i mnoho jiných způsobů využití.


Jiné servery

V porovnání se serverem Apache jsou všechny ostatní dost marginální. Přesto exituje několik alternativ:


Odkazy a zdroje