WWW, HTTP servery

Ivan Králik <xkralik6 (zavináč) fi.muni.cz>

Obsah

Popis protokolu HTTP

HTTP (Hypertext transfer protocol) je aplikačný protokol nad TCP. HTTP servery sú štandardne dostupné na TCP porte 80, resp. 443 pre zabezpečené HTTP (HTTPS). Komunikácia pozostáva zo servera a klienta, kde klient nadviaže spojenie zo serverom, pošle mu požiadavku (angl. request), na ktorú server zašle odpoveď (angl. response).

Formát HTTP požiadavky

Method SP Request-URI SP HTTP-Version CRLF
Header1: Value1 CRLF
...
CRLF
[ message-body ]

napr.

GET /prednasky.cgi?fakulta=1433 HTTP/1.0
Host: www.video.muni.cz

Formát HTTP odpovede

HTTP-Version SP Status-Code SP Reason-Phrase CRLF
Header1: Value1 CRLF
...
CRLF
[ message-body ]

napr.

HTTP/1.1 200 OK
Date: Sun, 01 Nov 2015 09:44:40 GMT
Server: Apache/2.2.16 (Debian) PHP/5.3.3-7+squeeze25 with Suhosin-Patch mod_ssl/2.2.16 OpenSSL/0.9.8o mod_perl/2.0.4 Perl/v5.10.1
Connection: close
Content-Type: text/html; charset=utf-8

Najpoužívanejšie HTTP metódy

GETZískanie obsahu entity identifikovanej pomocou Request-URI
POSTVytvorenie novej podriadenej entity pod entitou identifikovanou pomocou Request-URI
PUTVytvorenie alebo úprava entity identifikovanej pomocou Request-URI
DELETEZmazanie entity identifikovanej pomocou Request-URI
CONNECTNadviazanie spojenia

Príklady

GET /clanky?zoradenie=datum
POST /clanky
GET /clanky/1
PUT /clanky/1
DELETE /clanky/1

Najpoužívanejšie stavové kódy

1XXInformácie
2XXÚspech
3XXPresmerovanie
4XXChyby na strane klienta
5XXChyby na strane servera

Apache HTTP server

Oficiálne stránky: https://httpd.apache.org/

Globálne konfiguračné direktívy

Listen 80
User www-data
Group www-data
AccessFileName .htaccess

<VirtualHost> direktívy

Direktívy, ktoré sa vzťahujú len na konkrétny virtuálny host, napr.:

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	ServerName localhost
	ServerAlias *.localhost

	DocumentRoot /var/www
	
	ErrorLog /var/apache/default-error.log
	CustomLog /var/apache/default-access.log combined
</VirtualHost>

<Directory> direktívy

Direktívy, ktoré sa vzťahujú len na konkrétny adresár, napr.:

<Directory /var/www>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride All
	Order allow,deny
	allow from all
</Directory>

Doplnková konfigurácia

Ak sa na nejaký adresár vzťahuje direktíva AllowOverride All , je možné pomocou súboru s názvom definovaným v direktíve AccessFileName (typicky .htaccess) definovať niektoré ďalšie konfiguračné direktívy, ktoré Apache HTTP server použije pri spracovávaní HTTP požiadavky na objekt vnútri daného adresára.

Umiestnenie konfiguračných súborov

Rôzne distribúcie linuxu môžu mať rôzne umiestnenia a názvy. Príklady

SSL, zabezpečené HTTP

HTTP komunikácia štandardne nie je šifrovaná, preto nie je možné zaistiť jej dôvernosť. Na zaistenie dôvernosti HTTP komunikácie sa využíva šifrovanie založené na certifikátoch. V Apache HTTP serveri podporu zaisťuje modul SSL, ktorý využíva knižnicu OpenSSL.

Pri virtuálnych hostoch založených na názvoch (name-based virtual hosts) je potrebné, aby server v čase nadväzovania zabezpečenej komunikácie vedel, aký certifikát a kľúč má použiť (z ktorého virtuálneho hostu). Tento problém rieši SNI (Server Name Indication), ktoré pridáva možnosť klienta zaslať serveru názov hostu pri úvodnom handshake.

Konfigurácia

Je potrebné mať načítaný modul SSL:

LoadModule ssl_module modules/mod_ssl.so

V distribúcii Debian alebo Ubuntu je možné zapnúť pomocou príkazu:

a2enmod ssl
<VirtualHost *:443>
	# .. konfigurácia hostu
	
	SSLEngine on

	SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
	SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>

CGI skripty

CGI (Common Gateway Interface) je rozhranie, ktoré typicky slúži na prístup k nejakému informačnému systému pomocou HTTP. Toto rozhranie býva implementované pomocou skriptov v ľubovoľnom skriptovacom jazyku, ktorý server podporuje. Skripty obvykle pristupujú k databáze alebo iným zdrojom daného informačného systému a zo získaných informácií generujú HTML výstup.

Konfigurácia

Je potrebné mať v Apache HTTP serveri povolený modul CGI:

LoadModule cgi_module modules/mod_cgi.so

Ďalej je potrebné pre daný virtual host nakonfigurovať URL prefix, z ktorého budú požiadavky smerované do adresára obsahujúceho CGI skripty. Tento adresár obvykle býva mimo koreňového adresára webservera, definovaného v DocumentRoot.

ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"

Alebo je možné nastaviť, aby sa súbory s určitou príponou spúšťali ako CGI skripty

AddHandler cgi-script .pl
AddHandler cgi-script .php

Príklad CGI skriptu v jazyku PERL

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "Hello, World.";

Príklad CGI skriptu v jazyku PHP

#!/usr/bin/php-cgi

echo "Hello world";

Detekcia kódovania a jazyka

Apache HTTP server je schopný na základe hlavičiek Accept-charset a Accept-language zistiť preferencie klienta na kódovanie, resp. jazyk požadovaného dokumentu. Pre podporu výberu dokumentu na základe preferencií klienta je potrebný modul Negotiation.

LoadModule negotiation_module modules/mod_negotiation.so

Ďalej je potrebné nastaviť pre virtual host možnosť MultiViews a príponu súboru s mapou typov dokumentu:

Options MultiViews
AddHandler type-map .var

Príklad súboru foo.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

Tiež je možné pomocou modulu MIME asociovať prípony súborov s požadovaným znakovým kódovaním, resp. jazykom:

LoadModule mod_mime /usr/lib/apache2/modules/mod_mime.so
AddLanguage ja .ja
AddCharset UTF-8 .utf8

Autentizácia

Autentizácia pomocou HTTP hlavičiek

S každým HTTP požiadavkom klient posiela hlavičku Authorization obsahujúcu prihlasovacie údaje používateľa zakódované pomocou Base64

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Ak klient nie je autentizovaný a server vyžaduje autentizáciu, server posiela hlavičku WWW-Authenticate

WWW-Authenticate: Basic realm="Realm"

V Apache HTTP serveri je podpora HTTP autentizácie implementovaná v module mod_auth_basic

Príklad konfigurácie, kde používatelia sú načítaní zo súboru .htpasswd

<Location /secure>
	AuthType basic
	AuthName "private area"
	AuthBasicProvider file
	AuthUserFile .htpasswd
	Require valid-user
</Location>

Autentizácia pomocou cookies

Klient pomocou prihlasovacieho formulára odošle serveru prihlasovacie údaje, na základe ktorých server overí používateľa. Server po overení nastaví používateľovi cookie obsahujúcu náhodný token, ktorou sa môže pri ďalších požiadavkách identifikovať. Táto cookie sa nazýva Session cookie.

HTTP proxy cache

Spracovanie niektorých požiadaviek môže na serveri vyžadovať zvýšenú záťaž (overhead), ktorá sa pri rastúcom počte používateľov môže prejaviť ako problém. Typicky sa jedná o spúšťanie CGI skriptov, ktoré dynamicky generujú svoju odpoveď. Aby server nemusel zakaždým spúšťať skript, ktorý vygeneruje stále rovnakú odpoveď, je možné použiť HTTP cache.

Model expirácie

Server pošle v odpovedi hlavičku obsahujúcu informáciu, do kedy je daná odpoveď platná. HTTP proxy cache potom po celú dobu zasiela túto odpoveď bez ďalšieho dotazovania servera.

Expires: Thu, 01 Mar 2011 16:00:00 GMT

Model validácie

Server pošle v odpovedi hlavičku, ktorá obsahuje informáciu o poslednej zmene (Last-modified), resp. špeciálnu značku (ETag) predstavujúcu danú verziu dokumentu. HTTP proxy cache si odpoveď uloží a následne serveru zasiela hlavičku "If-modified-since", alebo "If-None-Match" v prípade ETag. V tomto prípade je server dotazovaný vždy a má zmysel ho použiť vtedy, keď zistenie poslednej zmeny, resp. výpočet ETag je oveľa jednoduchší, ako vygenerovanie celého výstupu.

Implementácie HTTP proxy cache

Literatura