WWW, HTTP servery

Petr Beneš, 60865 na mail.muni.cz


Obsah


Protokol HTTP

Protokol HTTP je postaven na principu dotaz - odpověď. Ke komunikaci se používá protokol TCP/IP, na serveru většinou port 80.

Dotaz

metoda cesta verze_protokolu 
hlavičky 
prázdný_řádek
data_dotazu

Příklad dotazu

#>telnet www.root.cz 80
GET http://www.root.cz/ HTTP/1.1
Host: www.root.cz

Odpověď

verze_protokolu stav_kód stav_text 
hlavicky 
prázdný_řádek
data_odpovědi

Příklad odpovědi

HTTP/1.1 200 OK
Date: Thu, 29 Sep 2005 13:03:20 GMT
Server: Apache/1.3.33 (Debian GNU/Linux) mod_gzip/1.3.26.1a PHP/4.3.10-16 
...
Content-Type: text/html; charset=iso-8859-2

Server Apache

open source HTTP server, v současné době (2005) 68% web serverů používá apache

Instalace

stažení         $ lynx http://httpd.apache.org/download.cgi
rozbalení	$ gzip -d httpd-2_0_NN.tar.gz				NN=verze
                $ tar xvf httpd-2_0_NN.tar
	      	$ ./configure --prefix=PREFIX	 PREFIX=adr,def:/usr/local/apache
kompilace	$ make
instalace	$ make install
konfigurace 	$ vi PREFIX/conf/httpd.conf
test		$ PREFIX/bin/apachectl start

při instalaci (konkrétně v příkazu configure) můžeme zvolit pomocí --enable jaké moduly chceme sdíleně (DSO -- dynamic shared object) a jaké přímo.

Konfigurace

konfigurační soubor     PREFIX/conf/httpd.conf      dobře komentovaný (#)

ServerType [inetd | standalone] běží jako samostatný proces nebo je vyvolán pomocí inetd při požadavku default:standalone
ServerAdmin email administrátora serveru
ServerRoot instalační adresář serveru apache
ServerName www.lab.fi.muni.cz název serveru
PidFile kam si server ukládá id čísla procesů
AccessFileName .htaccess méno souboru pomocí něhož lze měnit přístupová práva v aktuálním adresáři default:.htaccess
KeepAlive [On | Off] dovolí perzistentní spojení - více než jeden požadavek na jedno spojení (viz výše)
LoadModule které moduly chceme používat např. modules/mod_ssl.so
Listen addr:port na které adrese a portu se má poslouchat 80, 443 ..., popřípadě Listen 80
DocumentRoot hlavní adresář
AccessLog, ErrorLog, TransferLog různé logy
...

Omezení přístupu          editujeme httpd.conf       varianty: jméno domény, ip adresa nebo její část, ip + maska

Order Allow,Deny     #Deny (zamítnutí) má vyšší prioritu
Order Deny,Allow     #vyšší prioritu má Allow (povolení)

Příklad: pokud v obou (jako tento případ při přístupu z apache.org) tak se využije priorita

Order Deny,Allow
Deny from all 
Allow from apache.org

Nastavení pro adresáře

#hlavní adresář
<Directory />   
   Options FollowSymLinks
   AllowOverride None
   Order Allow,Deny
   Deny from all
</Directory>

při překrývání oblastí dojde k kombinaci oprávnění, více na http://www.root.cz/serialy/maly-pruvodce-konfiguraci-apache/

Nastavení pro adresáře: Options
Indexes povolení výpisu adresáře
FollowSymLinks povolení symbolických odkazů
ExecCGI povolení CGI
AllowOverride překrývání oprávnění definované v externích souborech (.htaccess) s Allow/Deny v httpd.conf

Moduly

Moduly můžeme mít buďto zakompilované přímo do Apache nebo je nahrávat dynamicky jako tzv. DSO. DSO Moduly nahráváme pomocí LoadModule v souboru httpd.conf.

LoadModule access_module modules/mod_access.so řízení přístupu
LoadModule auth_module modules/mod_auth.so autentizace
LoadModule cgi_module modules/mod_cgi.so CGI skripty
LoadModule ssl_module modules/mod_ssl.so podpora SSL
LoadModule userdir_module modules/mod_userdir.so weby uživatelů ve tvaru ~/public_html/
.....

Virtuální servery

Virtuální servery se řeší dvěma způsoby. Server buď konstruujeme na bázi ip adres (ip-based) nebo využíváme vlastnosti protokolu HTTP 1.1 na základě jmen (name-based)

ip-based

Potřebujeme tolik virtuálních síťových rozhraní kolik budeme mít virtuálních www serverů. Je tedy potřeba mít v jádře povolenu podporu ip-aliasing. V Virtuální rozhraní vytvoříme příkazem ifconfig. Ke každé takto vytvořené adrese musí být platné záznamy DNS

ifconfig eth0:1 192.168.1.1
ifconfig eth0:2 192.168.1.2
ifconfig eth0:3 192.168.1.3

Například 192.168.1.1 --> www.domena1.cz, 192.168.1.2 --> www.domena2.cz, 192.168.1.3 --> www.domena3.cz
Potom už ke každé z nich vytvoříme v httpd.conf příslušné:

<VirtualHost www.domenai.cz>
  ServerAdmin admin@domenai.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 přiřadíme jednomu serveru více jmen. Je samozřejmě nutné mít v DNS záznamech tvar pro obě adresy.

name-based

Opět je zapotřebí mít DNS záznamy pro všechny virtuální servery, tentokrát ukazují na jedinou ip adresu.

NameVirtualHost 194.213.243.3

<VirtualHost 194.213.243.3>
  ServerAdmin virtual1admin@domena.cz
  DocumentRoot /home/httpd/html/virtual/semily
  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>
  ServerName www.virtual2.domena.cz
  ServerAlias virtual2.domena.cz
  ServerAdmin virtual2admin@domena.cz
  DocumentRoot /home/httpd/html/virtual2
  ...
</VirtualHost>

CGI skripty

CGI -- Common Gateway Interface umožňuje spouštět skripty na straně serveru. a výsledek posílat klientovi.

   LoadModule modules/mod_cgi
   
je také vhodné použít alias na adresář cgi-bin,
   ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin"
   
Ještě je nutné povolit v tomto adresáři spouštění CGI skriptů.
   <Directory "/usr/local/apache2/cgi-bin"> 
       Options ExecCGI
   </Directory>

   


SSL vrstva

SSL (Secure Sockets Layer) je protokol založený na asymetrické kryptografii. Zajišťuje šifrovaný přenos. Skládá se ze dvou částí -- Record protocol a Handshake protocol, více na http://roger.jikos.cz/ssl-ssh.html

Problémy s virtuálními servery: Protože virtuální server identifikujeme v hlavičce kde už máme šifrování, nelze SSL použít s virtuálními servery.

Instalace

Je nutné nejprve nainstalovat "kryptovaci engine", např. OpenSSL http://www.openssl.org. Podporu SSL do Apache je možné nainstalovat dvěma způsoby -- jako DSO nebo přímo zakompilovat do Apache. Při instalaci jako DSO stáhneme zdrojové kódy mod_ssl www.modssl.org, zkompilujeme a výsledný .so modul nahrajeme do apache direktivou LoadModule.

Konfigurace a vygenerování certifikátů


openssl req -new -out my-server.csr
openssl rsa -in privkey.pem -out my-server.key
openssl x509 -in my-server.csr -out my-server.crt -req -signkey my-server.key -days 365

my-server.crt obsahuje veřejný certifikát, soubor my-server.key obsahuje soukromý klíč Konfigurace v httpd.conf, prípadne ssl.conf.

Kódování jazyka

Při komunikaci může klient přes hlavičky protokolu HTTP specifikovat podporované znakové sady včetně priorit. Server tak může vybrat (nebo připravit) dokument "na míru" klientovi. Výběr provedeme pomocí

Accept
Accept-Language
Accept-Charset
Accept-Encoding

Možnosti:
MultiViews -- nastavíme v httpd.conf pomocí Options MultiViews. Příklad index.html.iso.8859-2
Musíme mít nastaven příznak MultiViews v Options u daného adresáře

<Directory "/usr/local/apache2/adresar">
   Options Indexes FollowSymLinks MultiViews
</Directory> 
Type-Map     -- identifikuje, kde jsou umístěny definice příslušných dokumentů v konkrétních jazycích.
AddHandler type-map var
DirectoryIndex index.html index.html.var 
Příklad souboru index.html.var
URI: index.html.de
Content-language: de
Content-type: text/html

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

URI: index.html.cs.iso8859-2
Content-language: cs
Content-type: text/html;charset=ISO-8859-2

URI: index.html.cs.win-1250
Content-language: cs
Content-type: text/html;charset=WIN-1250
Samozřejmě musíme vytvořit příslušné soubory ve zvolených kódováních.

Dynamické generování     -- WWWDia, CSacek, Mod_czech


Autentizace

Protože protokol HTTP je bezstavovoý, je potřeba nějak řešit změnu stavu. Například to, že se uživatel autentizuje je změna stavu.
Protokol HTTP umožňuje serveru pomocí hlavičky WWW-Authenticate: Basic realm="JMENO" a zašle kód ze série 4xx, konkrétně 401 Unauthorized Po přijetí této hlavičky klientem bude uživatel dotázán na autentizaci. Většinou si klient zadané údaje dočasně pamatuje a další spojení probíhají už bez účasti uživatele.


Alternativní HTTP servery

Roxen - OpenSource šířený pod GPL http://www.roxen.com/products/webserver/
Zeus Web Server - komerční
webový server jako součást jádra OS Linux. kHTTPD


Další odkazy

SSL
HTTP 1.1
Vyjednávání o obsahu
Konfigurace Apache
root.cz: pruvodce konfiguraci Apache