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
open source HTTP server, v současné době (2005) 68% web serverů používá apache
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.
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 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 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-basedPotř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-basedOpě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 -- Common Gateway Interface umožňuje spouštět skripty na straně serveru.
a výsledek posílat klientovi.
LoadModule modules/mod_cgije 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 (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 365my-server.crt obsahuje veřejný certifikát, soubor my-server.key obsahuje soukromý klíč Konfigurace v httpd.conf, prípadne ssl.conf.
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.varPří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-1250Samozřejmě musíme vytvořit příslušné soubory ve zvolených kódováních. Dynamické generování -- WWWDia, CSacek, Mod_czech
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.
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