HTTP servery

Tomáš Pyszko, 139625@mail.muni.cz

Obsah

Protokol HTTP (HyperText Transfer Protocol)

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.

Rozdíly verzí protokolu HTTP:

Verze 0.9:

Verze HTTP/1.0 (1996, RFC 1945):

Verze HTTP/1.1 (1999, RFC 2616):

Verze HTTP/1.2 (1999, RFC 2774 ):

Stavové kódy protokolu HTTP (ne stavy!)

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.

Hlavičky protokolu HTTP

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.

Apache

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í.

Kompilace a instalace Apache2

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

Spuštění systému

Konfigurace Apache2

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

Ří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>


Virtuální servery v Apache2

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.

Možnosti rozšíření Apache2

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 ;) .

Alternativy k serveru Apache

Literatura