Protokol HTTP je aplikační komunikační protokol určený pro přenos informací. V původních verzích sloužil pro publikovaní a získávání hypertextových stránek. Později byl rozšířen o další možnosti (například přesun binárních souborů). Pro přenos informací je využita architektura klient - server. Komunikace je nestavová a zprostředkovávají ji dotazy typu požadavek - odpověď. Vývoj protokolu HTTP byl původně koordinován organizacemi World Wide Web Consortium (W3C) a Internet Engineering Task Force (IETF). Klientu který se připojuje k HTTP serveru (zvanému webovému serveru) říkáme webový klient. Ten se po zadání adresy serveru a daného portu (výchozí je 80), pokusí připojit k serveru a to buď přímou cestou, nebo prostřednictvím proxy serveru. Ten slouží jako prostředník mezí klientem a daným cílem.
V současnosti jsou obvykle uváděny 4 verze protokolu. Značí se : 0.9 , HTTP/1.0, HTTP/1.1 a HTTP/1.2, kde větší číslo označuje novější verzi. Rozdíl mezi verzemi je výrazný. Komunikace mezi klientem a serverem probíhá za pomocí textových zpráv, proto si ji můžeme vyzkoušet jedním z telnetových klientů. Všimněte si verzí HTTP. V našem případě server kontroluje pouze to, zda umí verzi stejnou nebo vyšší, ne zda verze vůbec existuje.
psycho@psycho:/var/www$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /index.html HTTP/0.01 HTTP/1.1 200 OK Date: Tue, 01 Apr 2008 18:22:56 GMT Server: Apache/2.2.4 mod_perl/2.0.2 Perl/v5.8.8 Last-Modified: Tue, 01 Apr 2008 18:18:31 GMT ETag: "d7364-26-cbaecbc0" Accept-Ranges: bytes Content-Length: 38 Connection: close Content-Type: text/html <HTML><BODY>HELLO WORLD</BODY></HTML> Connection closed by foreign host.
psycho@psycho:/var/www$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /index.html HTTP/1.2 HTTP/1.1 400 Bad Request Date: Tue, 01 Apr 2008 18:23:18 GMT Server: Apache/2.2.4 mod_perl/2.0.2 Perl/v5.8.8 Content-Length: 348 Connection: close Content-Type: text/html; charset=iso-8859-1 . . . Connection closed by foreign host.
Verze 0.9:
Verze HTTP/1.0 (1996, RFC 1945):
Verze HTTP/1.1 (1999, RFC 2616):
Verze HTTP/1.2 (1999, RFC 2774 ):
Příklad některých použitých kódů v protokolu:
"100" : Continue "200" : OK "305" : Use Proxy "307" : Temporary Redirect "400" : Bad Request "401" : Unauthorized "403" : Forbidden "404" : Not Found "505" : HTTP Version not supported Úplný výčet v RFC 2616.
Příklad některých použitých hlaviček v protokolu:
Příklad hlaviček požadavku (dotazu):
Accept: přípustný obsah: Accept: text/plain Accept-Charset: přípustná znaková sada: Accept-Charset: iso-8859-5 Accept-Encoding: přípustné kódování: Accept-Encoding: compress, gzip Host: doménové jméno serveru: Host: en.wikipedia.org
Příklad hlaviček požadavku (dotazu):
Content-Encoding použité kódování Content-Encoding: gzip Content-Length délka obsahu Content-Length: 348 Content-Type typ obsahu (MIME) Content-Type: text/html; charset=utf-8 Server server Server: Apache/2.2.4 mod_perl/2.0.2 Perl/v5.8.8 Úplný výčet v RFC 2616.
Nejpopulárnější HTTP server, v současné době verze Apache2 (2.X.X). Jedná se o "open source" projekt (projekt s otevřeným zdrojovým kódem). Má svou vlastní licenci, viz http://www.apache.org/licenses/LICENSE-2.0 . Apache je tvořen modulární architekturou, umožňuje zavádět různé moduly, implementuje Apache API pro moduly. Podporuje IPv6 a je multiplatformní.
stáhnutí: $ lynx http://httpd.apache.org/download.cgi rozbalení: $ gzip -d httpd-NN.tar.gz $ tar xvf httpd-NN.tar $ cd httpd-NN autokonfigurace: $ ./configure --prefix=PREFIX kompilace: $ make instalace: $ make install konfigurace: $ vi PREFIX/conf/httpd.conf alternativa: $ vi PREFIX/conf/apache2.conf test: $ PREFIX/bin/apachectl -k start
Základní parametry konfigurace:
#cesta ke konfiguračním souborům ServerRoot "/etc/apache2" #soubor pro zamčení, není nutné spouštět server vícekrát LockFile /var/lock/apache2/accept.lock #číslo spuštěného procesu apache2 PidFile /var/run/apache2.pid Timeout 300 #parametry pro udržování spojení KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 #uživatel a skupina systému, pod kterým apache2 poběží User wwwuser Group wwwuser #název souboru, ve kterém je možno měnit přístupová práva AccessFileName .htaccess #výchozí MIME hlavička pro typ obsahu DefaultType text/plain #užitečný soubor s chybami, pokud nám něco nejede ErrorLog /var/log/apache2/error.log #úroveň logování LogLevel warn #zde se nachází pokračování nastavení Include /etc/apache2/mods-enabled/*.load Include /etc/apache2/mods-enabled/*.conf Include /etc/apache2/httpd.conf Include /etc/apache2/ports.conf Include /etc/apache2/sites-enabled/
Řízení přístupu můžeme ovlivnit na několika úrovních a to:
Máme například adresář /data/documents a chceme do něj omezit přístup pro uživatele z IP adresy 11.22:33:44 :
<Directory "/data/documents"> Options None AllowOverride None #vypneme možnost změny přístupu souborem .htaccess Order allow,deny #deny bude mít přednost před allow allow from all deny from 11.22.33.44 </Directory>
Nyní chceme například povolit přístup pouze uživatelům, kteří znají heslo, do adresáře /data/documents/ :
<Directory "/data/documents"> Require valid-user AuthName "Enter username and password" AuthType Basic AuthUserFile /data/users/.users </Directory>
Apache umožňuje vytvořit více nezávislých virtuálních serverů na jednom počítači, na jednotlivých ip adresách nebo portech. Umožňuje dokonce přidělit více virtuálních strojů jedné IP adrese, pokud bude virtuální host konfigurován s DNS jménem a ne s IP adresou. V DNS systému pak stačí konfigurovat překlad DN -> IP.
Příklad konfigurace virtuálních hostů na Apache2 s 2 DNS jmény (www.example1.com, www.example2.com):
#Poslouchej na portu 80 Listen 80 # Naslouchej na všech IP adresách NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot /www/example1 ServerName www.example1.com # Další parametry </VirtualHost> <VirtualHost *:80> DocumentRoot /www/example2 ServerName www.example2.org # Další parametry </VirtualHost>
Nyní můžeme počítači libovolně měnit IP adresu, stačí nastavovat správný překlad DN -> IP. Nemusíme tedy pokaždé měnit konfigurační soubor, jak by to bylo nutné v případě, kdy by VirtualHost nebyl nastaven pro * ale pro konkrétní IP adresu.
Apache2 má dobře propracované rozhraní pro moduly, díky čemuž můžeme jednoduše rozšiřovat funkcionalitu serveru. Častým příkladem rozšíření jsou například moduly pro CGI skripty, modul pro šifrovanou komunikaci SSL, modul pro přepisovaní požadavků (Rewrite modul) a podobně. Moduly, podobně jako u jádra Unixu/Linuxu, lze rovněž zakompilovat přímo do Apache.
Příklad konfigurace ssl spojení, modul mod_ssl:
Předpokládejme, že chceme rozběhat Virtuálního hosta na portu 443 a zároveň chceme, aby komunikace mezi klientem a serverem probíhala šifrovaně. Pokud nemáme ssl modul zakompilovaný přímo do serveru, nesmíme jej zapomenou načíst příkazem LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so
<VirtualHost *:443> LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so #načteme modul SSLEngine On #zapneme SSL engine SSLProtocol -all +SSLv3 +TLSv1 #zvolíme typ protokolu SSLCipherSuite RSA:!EXP:!NULL:+HIGH:+MEDIUM:-LOW #nastavíme parametry šifrování SSLVerifyClient none SSLCertificateFile /etc/apache2/ssl/apache2.pem #zadáme cestu k certifikátu serveru ServerAdmin admin@example3.cz DocumentRoot /www/example3/ # Další parametry </VirtualHost>
Podobným způsobem můžeme rozšířit server o další moduly, nastavení probíhá v konfiguračním souboru, popřípadě v dalších zahrnutých souborech (include), vždy je nutné daný modul načíst nebo zakompilovat do serveru a pak již můžeme nastavovat jeho parametry a využívat jeho funkce.
V případě problémů s Apache doporučuji nejprve zapnout vyšší úroveň logování a podívat se do logovacích souborů, než hned podléhat panice ;) .