Martin Kyselák, xkyselak@fi.muni.cz
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.
HTTP/0.9
HTTP/1.0 (RFC 1945 z roku 1996)
HTTP/1.1 (RFC 2616 z roku 1999)
Každá hlavička je na samostatné řádce a má tvar [jméno hlavičky]: [hodnota]
.
Host
(plné doménové jméno virtuálního serveru)Accept
(MIME typy rozpoznávané klientem)Accept-Charset
(znakové sady, které klient akceptuje)
Accept-Encoding
(kódování, která klient akceptuje)
Accept-Language
(jazyky, které klient akceptuje)
User-Agent
(řetězec identifikující typ klienta)
From
(adresa člověka zodpovědného za tento požadavek)
Referer
(ze které stránky jsme se sem dostali)
If-Modified-Since
(žádost o dokument pouze pokud byl od tohoto data modifikován)
Content-Type
(MIME typ použitý v datech)
Content-Encoding
(MIME kódování použitý v datech)
Content-Language
(MIME jazyk použitý v datech)
Content-Length
(délka dat)
Date
(současné datum)
Expires
(platnost dokumentu)
Location
(URL, na které se má klient přemístit, aby získal požadovanou odpověď)
Server
(verze a typ serveru)
Retry-After
(za jakou dobu bude dokument přístupný)
[schéma]://[uživatel]:[heslo]@[server]:[port]/[umístění]
umístění
pouze adresář, předá se buď soubor implicitního jména určeného serverem (např. index.html), nebo obsah (výpis) adresáře~login
, pak se bude procházet podadresář určeného uživatele ~login/public_html
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.
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.
configure
, make
, make install
Parametr pro configure
--prefix=PREFIX
určuje základní adresář pro instalaci, např. /usr/local/apache
Základem konfigurace Apache je bohatě komentovaný konfigurační soubor PREFIX/conf/httpd.conf
Některé volby (kurzívou výchozí hodnoty):
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 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ř.:
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).
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).
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/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.
openssl genrsa -out server.key 1024 openssl req -new -x509 -key server.key -out server.crt -days [platnost certifikátů]
Před generování vyplníme několik atributů, atribut CN (CommonName)
by měl být shodný s plným doménovým jménem našeho HTTPS serveru.
Soubor server.crt
je veřejný certifikát a
soubor server.key
potom soukromý klíč.
httpd.conf
v definici virtuálního serveru (musí být IP-based):
SSLCertificateFile
(veřejný certifikát serveru)SSLCertificateKeyFile
(soukromý klíč serveru)SSLEngine [On|Off]
(povoluje SSL)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.
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
.
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
).
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.
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ší.
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
.
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)