HTTP a WWW servery
David Nemec, xnemec5@fi.muni.cz
Obsah
Hypertext Transfer Protocol (HTTP)
- Internetový protokol určený na komunikáciu s WWW servermi
- Používa sa na prenos hypertextových dokumentov vo formáte HTML, XML a iných
- Obvykle používa TCP port 80
- Spolu s elektronickou poštou je HTTP najviac používaný protokol
- V súčasnej dobe je používaý na prenos aj ďalších informácií
- Na presnú špecifikáciu umiestnenia nejakého zdroja v internete sa používa URL (Uniform Resource Locator)
- Samotný protokol neumožnuje zabezpečiť šifrovanie ani integritu prenášaných dát, takže sa často využíva TLS spojenie nad TCP
Princíp komunikácie
- HTTP funguje ako request-response protokol
- Užívatel pošle dotaz na server obsahujűci označenie požadovaného dokumentu, informácie o schopnostiach prehliadača
- Server potom odpovie pomocou hlavičiek, ktoré popisujú výsledok dotazu nasledovanými dátami požadovaného dokumentu
Metódy
GET
- Najpoužívanejšia metóda, určená na získanie informácií od HTTP serveru, nemení stav serveru
POST
- Odosielanie dát na server, napríklad dát z webového formuláru
HEAD
- Na rozdiel od GET
vráti iba hlavičky
Stavové kódy
Stavový kód je súčasťou hlavičky odpovede na dotaz klienta, upresňuje ako bola odpoveď spracovaná serverom:
1xx
- Informational
-
2xx
- Successful
200 OK
- štandardná odpoveď pre úspešný HTTP request
-
3xx
- Redirection
301 Moved Permanently
- Tento a všetky nasledujúce požiadavky majú byť presmerované na zadané URL
304 Not Modified
- Indikuje, ze dokument sa od posledného požiadavu nezmenil
-
4xx
- Client Error
401 Unauthorized
- Podobná chyba ako 403, ale používa sa keď je vyžadovaná autorzizácia, ktorá však zlyhala alebo sa ešte neuskutočnila
403 Forbidden
- Server odmietol spracovať požiadavku klienta, chyba môže byť sposobená nedostatočnými právami klienta
404 Not Found
- Požadovaný dokument nebol nájdený
408 Request Timeout
- Vypršal čas vyhradený na spracovanie požiadavku
-
5xx
- Server Error
500 Internal Server Error
- Pri spracovaní došlo k bližšie nešpecifikovanej chybe
503 Service Unavailable
- Služba je dočasne nedostupná
Ďalšie stavové kódy viz. Wikipedia
Range request
- Umožňuje poslať iba časť iba časť súboru zo serveru
- Využitie napríklad pri sťahovaní súborov, možnosť zastavenia a znovu spustenia sťahovania
Príklad komunikácie
Klient odošle požiadavku na server:
GET / HTTP/1.1
Host: example.com
Server odpovedie požadovaným dokumentom:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 155
Connection: close
Date: Sat, 07 Nov 2020 12:35:33 GMT
Last-Modified: Thu, 06 Jun 2019 04:19:28 GMT
ETag: "92b6819fcf2865f6be341e02390d23bf"
Accept-Ranges: bytes
Server: AmazonS3
<html>
<head>
<title>An Example Page</title>
</head>
<body>
<p>Hello World, this is a very simple HTML document.</p>
</body>
</html>
HTTP server Nginx
- Nginx ("engine X") je open-source webový sever, ktorý može byť použitý aj ako reverzná proxy, load balancer alebo HTTP cache
- Zameraný na vyskoký výkon a malé nároky na pamať
- Používa 1 hlavný proces a niekolko ďalších worker procesov
- Hlavný proces číta konfiguráciu a spravuje worker procesy, ktoré sa starajú o spracovanie poziadaviek od klientov
Konfigurácia
Hlavný konfiguračný súbor je uložený v /etc/nginx/nginx.conf
Príklad hlavného konfiguračného súboru podla ArchWiki
user http;
worker_processes auto;
worker_cpu_affinity auto;
events {
multi_accept on;
worker_connections 1024;
}
http {
charset utf-8;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
log_not_found off;
types_hash_max_size 4096;
client_max_body_size 16M;
# MIME
include mime.types;
default_type application/octet-stream;
# logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
# load configs
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Virtuálne servery
- Spôsob hostovania viacerých domén na jednom serveri, umožňuje to zdielať zdroje serveru bez toho aby všetky sluzby používali rovnaké doménove meno
- VirtualHost je pomenovanie, ktoré používa webový server Apache, Ngnix používa Server Blocks
server {
listen 80;
listen [::]:80;
server_name example1.xyz;
root /usr/share/nginx/example1.xyz/html;
}
server {
listen 80;
listen [::]:80;
server_name example2.xyz;
root /usr/share/nginx/example2.xyz/html;
}
SSL/TLS
- SNI (Server Name Indication), rozšírenie protokolu TLS pomocou ktorého je možné prevádzkovať viaceré virtuálne servery na jednej IP adrese, klient pred výmenou šifrovacích kľúčov najprv zdelí meno požadovaného web severu, server tak môže vybrať príslušný šifrovací kľúč patriaci požadovanému virtuálnemu serveru
- Let's Encrypt - certifiačná autorita, zadarmo poskytuje DV (Domain validated) certifikáty typu X.509
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name examplesecure.xyz;
ssl_certificate /etc/nginx/ssl/examplesecure.crt;
ssl_certificate_key /etc/nginx/ssl/examplesecure.key;
root /usr/share/nginx/examplesecure.xyz/html;
}
Autentizácia
- HTTP Basic Authentication, jednoduchá autentizačná metóda pri ktorej webový server vyzve webový prehliadač aby v rámci požiadavku poslal aj autentizačné informácie, meno a heslo je zaslané ako jeden nezašifrovaný textový retazec
- HTTP Cookie, malé množstvo dát uložených na počítači užívatela, často sa používajú na identifikáciu konkrétneho užívateľa pri prihlasovaní do webovych stránok
Príklad Konfigurácie HTTP Basic Auth vo web serveri Nginx:
location /private {
auth_basic "Password protected area";
auth_basic_user_file /path/to/generated/htpasswd;
}
Súbor, ktorý obsahuje mená a heslá užívateľov je možné vygenerovať pomocou programu htpasswd
:
xnemec5@proto12 $ htpasswd -c passwd_file user1
New password:
Re-type new password:
Adding password for user user1
xnemec5@proto12 $ htpasswd passwd_file user2
New password:
Re-type new password:
Adding password for user user2
Výsledný súbor passwd_file
:
user1:$apr1$x3lgFcQD$WI09oPxWmGfiKrFmnPdSL/
user2:$apr1$82OFsu8E$jkH7mCt8hsk.fqaaeIpTz.
CGI
- CGI (Common Gateway Interface) je protokol umožňujúci prepojenie externých aplikácií s webovým serverom
- Server deleguje požiadavok od klienta na externú aplikáciu, ktorá podla požiadavku vráti výstup vo forme statickej stránky
- Táto statická stránka je následne odoslaná klientovi ako odpoveď
- V minulosti predstavovalo jedinú možnosť dynamického spracovania obsahu
- CGI bolo postupne nahradené efektivnejšími riešeniami ako napríklad FastCGI
- Pre Nginx exituje FastCGI wrapper
fcgiwrap
, ktorý umožňuje vykonávanie CGI skriptov
HTTP/2
- Druhá hlavná verzia protokolu HTTP, vychádza z experimetálneho protokolu SPDY, ktorého hlavným cielom bolo zaistiť rýchlejšie načítanie webových stránok
- Rozdiely od predchádajúcich verzií: binárny protokol (namiesto textového), multiplexovanie požiadavkov (viaceré požiadavky vrámci 1 spojenia), kompresia hlavičiek
- Nevyžaduje šifrovanie, avšak vačšina implementácií na strane klienta podporuje HTTP/2 iba na šifrovaných spojeniach
Zapnutie podpory HTTP/2 v konfigurácii virtuálneho servera:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name examplehttp2.xyz;
ssl_certificate /etc/nginx/ssl/examplehttp2.crt;
ssl_certificate_key /etc/nginx/ssl/examplehttp2.key;
root /usr/share/nginx/examplehttp2.xyz/html;
}
Literatúra