1/50
WWW – architektura serwerów HTTP

Protokół HTTP i serwery WWW jako fundament sieci

HTTP (Hypertext Transfer Protocol) to fundamentalny protokół warstwy aplikacji dla WWW, definiujący zasady komunikacji między klientem a serwerem w modelu zadanie-odpowiedź. Prezentacja obejmuje architekturę serwerów Apache (MPM prefork/worker/event) i Nginx (asynchroniczna pętla zdarzeń), szczegółową analizę metod HTTP, kodów statusu oraz nagłówków bezpieczeństwa. Materiał zawiera praktyczne laboratorium: konfiguracja wirtualnych hostów, diagnostyka narzędziami curl -vL oraz DevTools przeglądarki.

WWW - grafika tytulowa
2/50
Cel warsztatu: pod maską WWW

Praktyczne cele i umiejętności warsztatu

  • Cel główny: Zrozumienie działania serwerów HTTP – od momentu odebrania żądania od klienta do wygenerowania odpowiedzi, włącznie z wewnętrzną architekturą oprogramowania
  • Umiejętności praktyczne: konfiguracja serwerów Apache i Nginx, tworzenie wirtualnych hostów (zarówno name-based, jak i IP-based), zarządzanie logami i diagnozowanie problemów
  • Analiza ruchu: Dogłębna umiejętność czytania i interpretowania nagłówków HTTP, kodów statusu i mechanizmów negocjacji treści
  • Gotowość produkcyjna: Po warsztacie uczestnik samodzielnie skonfiguruje serwer WWW w sieci lokalnej i zdiagnozuje większość typowych problemów
Cel warsztatu
3/50
Agenda warsztatu

Struktura i tematyka poszczególnych bloków

  • Slajdy 4–12: Istota protokołu HTTP – bezstanowość, mechanizmy sesyjne (ciasteczka, tokeny), ewolucja od HTTP/1.0 do HTTP/3 (pipelining, multiplexing, QUIC)
  • Slajdy 13–20: Metody HTTP i kody statusu – GET, POST, PUT, DELETE, HEAD, OPTIONS; szczegółowy podział kodów 1xx–5xx z przykładami
  • Slajdy 21–30: Architektura serwerów – Apache MPM (prefork, worker, event), Nginx (asynchroniczna pętla zdarzeń, epoll), porównanie wydajności
  • Slajdy 31–38: Wirtualne hosty – VirtualHost w Apache, server blocks w Nginx, name-based i IP-based, aliasy interfejsów
  • Slajdy 39–44: Nagłówki HTTP – Host, User-Agent, Content-Type, X-Frame-Options, HSTS, CSP, mechanizmy cache
  • Slajdy 45–50: Laboratorium i troubleshooting – konfiguracja virtual hostów, curl -vL, DevTools, rozwiązywanie problemów HTTP
Agenda
4/50
Bezstanowość protokołu HTTP

Każde żądanie HTTP jest niezależną transakcją

  • HTTP jest protokołem bezstanowym (stateless) – każde żądanie jest niezależne, serwer nie przechowuje informacji o poprzednich żądaniach tego samego klienta
  • Każda para żądanie-odpowiedź jest traktowana jako odrębna, zamknięta transakcja – brak wbudowanego mechanizmu identyfikacji klienta
  • Serwer nie wie, czy dwa kolejne żądania pochodzą od tego samego użytkownika, chyba że zastosuje się mechanizmy zewnętrzne (ciasteczka, tokeny, sesje po stronie serwera)
  • Zalety bezstanowości: skalowalność – każde żądanie może być obsłużone przez dowolny serwer w klastrze, brak konieczności replikacji stanu między węzłami
bezstanowość HTTP
5/50
Problemy bezstanowości i mechanizmy sesji

Sesje, ciasteczka i tokeny jako rozwiązanie

  • bezstanowość HTTP uniemożliwia logowanie – serwer nie pamięta, że użytkownik się zalogował; każde żądanie do strefy chronionej wymaga ponownej autoryzacji
  • Rozwiązaniem jest przechowywanie identyfikatora sesji (session ID) po stronie klienta, najczęściej w ciasteczku HTTP, a stanu sesji po stronie serwera
  • Przebieg: po zalogowaniu serwer tworzy sesję, zwraca klientowi identyfikator sesji (np. PHPSESSID, JSESSIONID), klient dołącza go do każdego kolejnego żądania
  • Alternatywne podejście: tokeny JWT (JSON Web Token) – stan jest zakodowany w samym tokenie, serwer nie musi przechowywać sesji (stateless authentication)
Mechanizmy sesji
6/50
Ewolucja HTTP: od HTTP/1.0 do HTTP/1.1

Od osobnych połączeń do trwałych sesji TCP

  • HTTP/1.0 (RFC 1945, 1996): każde żądanie otwiera nowe połączenie TCP, żądanie jest wysyłane, serwer odpowiada, połączenie jest zamykane – narzut na ustanawianie i zamykanie połączeń TCP
  • Problem: strona z 10 obrazkami wymaga 11 osobnych połączeń TCP (strona główna + 10 obrazków), każde z trzykrotnym uzgadnianiem (3-way handshake)
  • HTTP/1.1 (RFC 2068, 1997; RFC 2616, 1999): domyślnie utrzymuje połączenie otwarte (Keep-Alive / persistent connection) – wiele żądań może być wysłanych na jednym połączeniu TCP
  • Dodatkowo: pipelining – możliwość wysłania kilku żądań bez czekania na odpowiedzi, ale ograniczenia w implementacji (problem HOL blocking)
HTTP/1.0 vs HTTP/1.1
7/50
Ewolucja HTTP: HTTP/2 i HTTP/3

Multiplexing i QUIC jako przełom w wydajności

  • HTTP/2 (RFC 7540, 2015): oparty na SPDY od Google, wprowadza multiplexing – wiele strumieni danych współdzieli jedno połączenie TCP, eliminując HOL blocking na poziomie żądania
  • Dodatkowo: kompresja nagłówków HPACK, priorytetyzacja strumieni, push serwerowy (server push – serwer wysyła zasoby, zanim klient o nie poprosi)
  • HTTP/3 (RFC 9114, 2022): oparty na QUIC (zamiast TCP), tłumaczonym na UDP z wbudowanym szyfrowaniem (TLS 1.3) i mechanizmem 0-RTT
  • Korzyść: eliminacja HOL blocking na poziomie transportu – utrata jednego pakietu nie blokuje pozostałych strumieni
HTTP/2 i HTTP/3
8/50
Połączenia HTTP: przegląd procedury

Pełny cykl żądania od DNS do odpowiedzi

  1. Klient (przeglądarka) rozpoczyna rozdzielczość DNS nazwy hosta na adres IP
  2. Jeśli URL zawiera https://, klient rozpoczyna uzgadnianie TLS (handshake) na standardowym porcie 443 (lub określonym w URL)
  3. Po ustanowieniu bezpiecznego kanału lub w przypadku HTTP na porcie 80, klient wysyła żądanie HTTP (metoda, ścieżka, nagłówki)
  4. Serwer HTTP przetwarza żądanie – sprawdza konfigurację, lokalizuje zasób, generuje odpowiedź (lub przekazuje do aplikacji backendowej)
  5. Klient otrzymuje odpowiedź, interpretuje kod statusu, nagłówki i treść; jeśli to dokument HTML, rozpoczyna pobieranie zasobów zależnych (CSS, JS, obrazki)
połączenie HTTP
9/50
Struktura zadania HTTP (request)

Linia żądania, nagłówki i opcjonalne ciało

  • Linia żądania (request line): METODA /ścieżka HTTP/1.1 – zawiera metodę HTTP, ścieżkę zasobu i wersję protokołu
  • Nagłówki (headers): pary Nazwa: wartość, np. Host: mojastrona.pl, User-Agent: Mozilla/5.0, Accept-Language: pl
  • Linia pusta – oddziela nagłówki od treści
  • Opcjonalna treść (body): obecna w metodach POST, PUT, PATCH; może być w formatach: application/x-www-form-urlencoded, multipart/form-data, application/json
Struktura zadania HTTP
10/50
Struktura odpowiedzi HTTP (response)

Status, nagłówki i treść odpowiedzi serwera

  • Linia statusu (status line): HTTP/1.1 200 OK – zawiera wersję protokołu, kod statusu (3 cyfry) i frazę opisową
  • Nagłówki (headers): pary Nazwa: wartość, np. Content-Type: text/html; charset=UTF-8, Content-Length: 1234, Server: Apache/2.4.41
  • Linia pusta – oddziela nagłówki od treści
  • Treść (body): właściwa odpowiedź serwera – może to być dokument HTML, obrazek, JSON, CSS, JS, plik do pobrania itp.
Struktura odpowiedzi HTTP
11/50
Przykładowa sesja HTTP (telnet)

Manualna komunikacja z serwerem przez telnet

Używając telnet lub nc (netcat) można ręcznie wykonać żądanie HTTP i zobaczyć surową odpowiedź serwera:

$ telnet example.com 80
Trying 93.184.216.34...
Connected to example.com.
Escape character is '^]'.
GET / HTTP/1.1
Host: example.com

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1256
...
<html>...</html>
Connection closed by foreign host.
Sesja telnet HTTP
12/50
Model zadanie-odpowiedź w HTTP

Klient inicjuje, serwer odpowiada biernie

  • HTTP wykorzystuje model żądanie-odpowiedź (request-response) – klient inicjuje komunikację, serwer odpowiada
  • Serwer nigdy nie inicjuje połączenia – nawet Server-Sent Events (SSE) i WebSocket rozpoczynają się od żądania klienta, a następnie serwer utrzymuje połączenie otwarte
  • Protokół jest synchroniczny w swojej podstawowej formie – klient wysyła żądanie i czeka na odpowiedź, choć HTTP/2 i HTTP/3 umożliwiają asynchroniczny multiplexing
  • Idempotentność: metody GET, PUT, DELETE, HEAD, OPTIONS są idempotentne – wielokrotne wykonanie tego samego żądania daje ten sam efekt
Model zadanie-odpowiedź
13/50
Metody HTTP – przegląd (cz. 1)

GET, POST, PUT, DELETE i ich właściwości

MetodaOpisCzy ma body?Idempotentna?
GETPobiera zasób – najczęściej używana metoda; służy do czytania danychNieTak
POSTPrzesyła dane do serwera w celu utworzenia nowego zasobu; nieidempotentnaTakNie
PUTZastępuje lub tworzy zasób pod wskazanym URI; całkowicie idempotentnaTakTak
DELETEUsuwa wskazany zasóbMożliweTak
PATCHCzęściowa modyfikacja zasobu – mniej "ciężki" niż PUTTakNie
Metody HTTP cz.1
14/50
Metody HTTP – przegląd (cz. 2)

HEAD, OPTIONS, TRACE i CONNECT w praktyce

MetodaOpisCzy ma body?Idempotentna?
HEADJak GET, ale serwer zwraca tylko nagłówki bez treści – używany do sprawdzania istnienia zasobu i nagłówkówNieTak
OPTIONSZapytanie o dozwolone metody dla danego zasobu – używany w mechanizmie CORS (preflight request)NieTak
TRACEEcho żądania – używany do diagnostyki, ale często wyłączany ze względów bezpieczeństwa (Cross-Site Tracing)NieTak
CONNECTUstanawia tunel – używany do proxy HTTPS (metoda CONNECT do serwera proxy)NieTak
Metody HTTP cz.2
15/50
Kody statusu HTTP – 1xx i 2xx

Komunikaty progresu i potwierdzenia sukcesu

  • 1xx Informacyjne: żądanie odebrane, kontynuacja przetwarzania
    • 100 Continue – klient może kontynuować wysyłanie treści (body)
    • 101 Switching Protocols – zmiana protokołu, np. upgrade do WebSocket
  • 2xx Sukces: żądanie zostało odebrane, zrozumiane i zaakceptowane
    • 200 OK – standardowa odpowiedź sukcesu
    • 201 Created – nowy zasób utworzony (zwykle w odpowiedzi na POST)
    • 204 No Content – sukces, ale bez treści (np. DELETE)
Kody 1xx i 2xx
16/50
Kody statusu HTTP – 3xx

Stałe i tymczasowe przekierowania zasobów

  • 301 Moved Permanently – zasób został trwale przeniesiony; klient powinien zaktualizować zakładki i używać nowego URI w przyszłości
  • 302 Found (Moved Temporarily) – tymczasowe przekierowanie; klient powinien nadal używać oryginalnego URI dla przyszłych żądań
  • 303 See Other – odpowiedź na POST; przekierowuje do innego URI (zwykle strona potwierdzenia)
  • 304 Not Modified – odpowiedź na warunkowe GET (If-Modified-Since, If-None-Match); treść nie uległa zmianie, klient może użyć cache'owanej wersji
  • 307 Temporary Redirect – jak 302, ale metoda i body muszą pozostać niezmienione (np. przekierowanie POST-POST)
  • 308 Permanent Redirect – jak 301, ale metoda i body muszą pozostać niezmienione
Kody 3xx
17/50
Kody statusu HTTP – 4xx (błędy klienta)

Błędy po stronie klienta i ich znaczenie

  • 400 Bad Request – błędne żądanie, nieprawidłowa składnia; serwer nie może go przetworzyć
  • 401 Unauthorized – wymagane uwierzytelnienie; klient nie podał autoryzacji (lub jest nieprawidłowa)
  • 403 Forbidden – serwer zrozumiał żądanie, ale odmawia autoryzacji (brak uprawnień)
  • 404 Not Found – zasób nie istnieje; najczęstszy błąd HTTP, często wynik błędnego linku lub usuniętej strony
  • 405 Method Not Allowed – metoda (np. POST) nie jest dozwolona dla danego zasobu
  • 408 Request Timeout – serwer przekroczył czas oczekiwania na żądanie
  • 429 Too Many Requests – przekroczono limit żądań (rate limiting)
Kody 4xx
18/50
Kody statusu HTTP – 5xx (błędy serwera)

Problemy serwera wymagające interwencji

  • 500 Internal Server Error – ogólny błąd serwera; przyczyna może być błąd w konfiguracji, błąd aplikacji lub przeciążenie
  • 501 Not Implemented – serwer nie obsługuje zadanej metody (rzadki, np. gdy serwer nie obsługuje PUT)
  • 502 Bad Gateway – serwer działający jako gateway/proxy otrzymał nieprawidłową odpowiedź z serwera nadrzędnego (upstream)
  • 503 Service Unavailable – serwer tymczasowo niedostępny (przeciążenie, konserwacja); klient może spróbować ponownie po czasie wskazanym w nagłówku Retry-After
  • 504 Gateway Timeout – serwer proxy nie otrzymał odpowiedzi od upstream w określonym czasie
Kody 5xx
19/50
curl -vL – narzędzie administratora

Wszechstronne narzędzie do diagnostyki HTTP

  • -v (verbose) – wyświetla pełną komunikację: połączenie TCP, uzgadnianie TLS, wysłanie żądania, nagłówki odpowiedzi
  • -L (location) – podążaj za przekierowaniami (śledzi kolejne odpowiedzi 3xx aż do osiągnięcia końcowego zasobu)
  • -I (head) – wysyła żądanie HEAD (tylko nagłówki, bez treści)
  • -H – dodaje niestandardowe nagłówki, np. -H "X-Custom: value" lub -H "Host: example.com"
  • -d (data) – przesyła dane w body żądania POST/PUT
  • -k (insecure) – pomija weryfikację certyfikatu SSL (tylko do testów!)
curl -vL
20/50
curl -vL w praktyce

Analiza rzeczywistej komunikacji z serwerem

$ curl -vL http://example.com 2>&1 | head -30
*   Trying 93.184.216.34:80...
* Connected to example.com (93.184.216.34) port 80
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Age: 185438
< Cache-Control: max-age=604800
< Content-Type: text/html; charset=UTF-8
< Date: Mon, 15 Jan 2024 10:00:00 GMT
< Etag: "3147526947"
< Expires: Mon, 22 Jan 2024 10:00:00 GMT
< Last-Modified: Thu, 17 Oct 2019 07:00:00 GMT
< Server: ECS (dcb/7F5A)
< Content-Length: 1256
curl -vL praktyka
21/50
Apache HTTP Server – architektura

Modularna budowa i modele przetwarzania

  • Apache HTTP Server (httpd) to jeden z najpopularniejszych serwerów WWW (ok. 20–30% udziału na rynku w 2024)
  • Apache oparty na modelu modularnym – większość funkcjonalności jest dostarczana w formie modułów ładowanych dynamicznie (DSO – Dynamic Shared Object)
  • Główne moduły: mod_ssl (HTTPS), mod_rewrite (reguły przepisywania URL), mod_proxy (proxy), mod_alias (aliasy)
  • Apache obsługuje różne modele przetwarzania (MPM – Multi-Processing Module), które można wybrać podczas kompilacji lub ładować dynamicznie
Apache architektura
22/50
Modele MPM w Apache (cz. 1)

Model procesowy o wysokim zużyciu pamięci

  • MPM Prefork: najstarszy model; każde połączenie obsługiwane przez osobny proces (fork)
  • Zalety: prostota, izolacja (jeden proces nie wpływa na inne), kompatybilność z modułami niewspierającymi wątków (np. mod_php w starych wersjach)
  • Wady: wysokie zużycie pamięci RAM (każdy proces ma własną kopię pamięci), ograniczona skalowalność przy dużej liczbie połączeń
  • Liczba procesów jest ograniczona przez dyrektywy StartServers, MinSpareServers, MaxSpareServers, MaxRequestWorkers
  • Działanie: główny proces (root) tworzy procesy potomne (działające jako www-data), które obsługują połączenia
MPM Prefork
23/50
Modele MPM w Apache (cz. 2)

Wątki i zdarzenia dla lepszej skalowalności

  • MPM Worker: model hybrydowy – wiele wątków w ramach jednego procesu; każdy wątek obsługuje jedno połączenie
  • Zalety: mniejsze zużycie pamięci niż Prefork (wątki współdzielą pamięć procesu), lepsza skalowalność
  • Wady: wymaga modułów bezpiecznych wątkowo (thread-safe), błędy w jednym wątku mogą wpłynąć na inne w tym samym procesie
  • MPM Event: rozszerzenie modelu Worker; dodaje dedykowany wątek do obsługi połączeń Keep-Alive (zdarzeniowo)
  • Działanie: połączenia Keep-Alive są "odkładane" do wątka głównego, zwalniając wątki robocze do obsługi aktywnych żądań
  • MPM Event staje się domyślnym modelem w Apache 2.4 na większości dystrybucji
MPM Worker i Event
24/50
Konfiguracja Apache – pliki

Struktura katalogów i plików konfiguracyjnych

  • Główny plik konfiguracyjny: /etc/apache2/apache2.conf (Debian/Ubuntu) lub /etc/httpd/conf/httpd.conf (RHEL/CentOS)
  • Apache ładuje pliki w określonej kolejności; do zarządzania modułami służy katalog mods-available/ i mods-enabled/
  • Wirtualne hosty są definiowane w /etc/apache2/sites-available/; aktywacja przez a2ensite
  • Wspólne kolokacje plików:
    • ports.conf – określa porty, na których serwer nasłuchuje
    • envvars – zmienne środowiskowe dla procesu Apache
    • conf-available/ – dodatkowe fragmenty konfiguracji
konfiguracja Apache
25/50
Apache VirtualHost – przykład

Definiowanie hosta wirtualnego w dyrektywach

<VirtualHost *:80>
    ServerName mojastrona.pl
    ServerAlias www.mojastrona.pl
    DocumentRoot /var/www/mojastrona
    ErrorLog /mojastrona_error.log
    CustomLog /mojastrona_access.log combined

    <Directory /var/www/mojastrona>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
Apache VirtualHost
26/50
Nginx – architektura

Wydajność dzięki nieblokującemu wejściu-wyjściu

  • Nginx (engine-x) zaprojektowany od podstaw z myślą o wydajności – model oparty na asynchronicznej, nieblokującej pętli zdarzeń (event loop)
  • Pojedynczy proces roboczy (worker process) może obsłużyć tysiące jednoczesnych połączeń, używając mechanizmów takich jak epoll (Linux), kqueue (BSD), IOCP (Windows)
  • Nginx nie tworzy nowego procesu ani wątku na każde połączenie – wszystkie połączenia są obsługiwane przez jeden wątek (lub kilka wątków) w ramach procesu roboczego
  • Architektura: jeden proces master (root) zarządza procesami roboczymi; worker procesy działają jako zwykły użytkownik (www-data)
Nginx architektura
27/50
Nginx – pętla zdarzeń (event loop)

Jeden wątek obsługujący tysiące połączeń

  • Pętla zdarzeń działa w jednym wątku: sprawdza, czy są nowe zdarzenia (np. nowe połączenie, dane do odczytu, możliwość zapisu) i obsługuje je po kolei
  • Operacje I/O (czytanie pliku, wysyłanie danych do klienta) są nieblokujące – proces nie czeka na zakończenie, tylko rejestruje callback i wraca do pętli
  • Przykład: gdy Nginx czyta plik z dysku, nie blokuje się – używa sendfile() (mechanizm kernela) i asynchronicznego I/O
  • Zalety: bardzo niskie zużycie pamięci (RAM) – jeden proces może obsłużyć 10 000 połączeń przy zużyciu pamięci rzędu kilkudziesięciu MB
Event loop Nginx
28/50
Konfiguracja Nginx – pliki

Hierarchiczna budowa plików konfiguracyjnych

  • Główny plik konfiguracyjny: /etc/nginx/nginx.conf
  • Nginx nie używa mechanizmu "available/enabled" jak Apache – standardowo ładuje wszystkie pliki z /etc/nginx/sites-enabled/ (lub conf.d/)
  • Struktura katalogów (Debian/Ubuntu):
    • /etc/nginx/nginx.conf – konfiguracja główna
    • /etc/nginx/sites-available/ – dostępne konfiguracje
    • /etc/nginx/sites-enabled/ – aktywne konfiguracje (dowiązania)
    • /etc/nginx/conf.d/ – dodatkowe fragmenty
  • Testowanie konfiguracji: nginx -t; przeładowanie: nginx -s reload
konfiguracja Nginx
29/50
Nginx server block – przykład

Blok server z dyrektywą server_name

server {
    listen 80;
    server_name mojastrona.pl www.mojastrona.pl;

    root /var/www/mojastrona;
    index index.html index.htm;

    access_log /var/log/nginx/mojastrona_access.log;
    error_log /var/log/nginx/mojastrona_error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}
Nginx server block
30/50
Apache vs Nginx – porównanie

Różnice architektoniczne i zastosowania

KryteriumApache (MPM Event)Nginx
Model przetwarzaniaWątek na połączenieAsynchroniczna pętla zdarzeń
Zużycie RAM na połączenieWysokie (~1–5 MB)Niskie (~10–50 KB)
Maks. połączeń jednoczesnych~10 000~100 000+
Obsługa PHPBezpośrednia (mod_php, php-fpm)Przez php-fpm (proxy)
Pliki statyczneDobra (sendfile)Doskonała (sendfile + asynchroniczność)
Konfiguracja.htaccess, per-directoryBrak .htaccess, centralna
ModularyzacjaDSO (ładowanie w czasie działania)Statyczna przy kompilacji
Apache vs Nginx
31/50
Wirtualne hosty – koncepcja

Name-based, IP-based i port-based hosting

  • Virtual hosting pozwala na obsługę wielu domen (stron WWW) na jednym serwerze fizycznym lub wirtualnym
  • Name-based virtual hosting: serwer rozpoznaje domeny na podstawie nagłówka Host w żądaniu HTTP – najczęstsza metoda
  • IP-based virtual hosting: każda domena ma przypisany oddzielny adres IP – rzadko stosowany (koszt adresów IPv4)
  • Port-based virtual hosting: każda domena na innym porcie (np. mojastrona.pl:8080)
Virtual hosting concept
32/50
Name-based vs IP-based virtual hosting

Nagłówek Host a dedykowany adres IP

CechaName-basedIP-based
Nagłówek HostWymaganyOpcjonalny
Adresy IPWiele domen na 1 IPKażda domena = 1 IP
HTTPS (SSL/TLS)Wymaga SNI (Server Name Indication)Działa bez SNI
KosztNiski (1 IP)Wysoki (wiele IP)
KonfiguracjaVirtualHost/server_nameVirtualHost/IP w listen
Wsparcie klientówWszystkie nowoczesne przeglądarkiPełne
Name-based vs IP-based
33/50
Wirtualne hosty w Apache (szczegóły)

Konfiguracja VirtualHost i dyrektywy SSL

  • Dyrektywa NameVirtualHost (Apache 2.2) – w Apache 2.4 jest domyślnie włączona i nie wymaga jawnego deklarowania
  • Pierwszy zdefiniowany VirtualHost dla danego adresu IP:port staje się domyślnym (default) – obsługuje żądania, które nie pasują do żadnego innego
  • Można mieszać name-based i IP-based w jednej konfiguracji
  • Dla SSL: <VirtualHost *:443> – dyrektywa SSLEngine on, SSLCertificateFile, SSLCertificateKeyFile
  • Szybka aktywacja: sudo a2ensite nazwa_hosta; dezaktywacja: sudo a2dissite nazwa_hosta
Apache VirtualHost szczegóły
34/50
Wirtualne hosty w Nginx (szczegóły)

Elastyczne dopasowywanie domen w Nginx

  • Nginx używa bloków server { ... } z dyrektywą server_name do rozróżniania domen
  • Jeśli server_name nie pasuje do żadnej domeny, Nginx wybiera pierwszy blok server na danym porcie jako domyślny
  • Można jawnie określić domyślny: listen 80 default_server;
  • Dyrektywa server_name obsługuje:
    • Pełne nazwy: mojastrona.pl
    • Wildcard: *.mojastrona.pl, .mojastrona.pl
    • Wyrażenia regularne: ~^(www\.)?mojastrona\.pl$
Nginx server_name
35/50
Aliasy interfejsów sieciowych

Aliasy interfejsów dla virtual hostingu

  • Do celów IP-based virtual hostingu można dodać wiele adresów IP do jednego interfejsu sieciowego (IP aliasing)
  • W systemach Linux: ip addr add 192.168.1.10/24 dev eth0 lub pliki konfiguracyjne /etc/network/interfaces
  • W systemach Windows: interfejs może mieć wiele adresów IP w ustawieniach zaawansowanych protokołu TCP/IPv4
  • # Linux: dodanie aliasu IP
    # ip addr add 192.168.1.10/24 dev eth0
    # ip addr show eth0
Aliasy interfejsów
36/50
Laboratorium: konfiguracja dwóch wirtualnych hostów

Tworzenie i aktywacja hostów testowych

  • Cel: Skonfigurować dwa wirtualne hosty na serwerze Apache: strona1.local i strona2.local
  • Krok 1: Utworzenie katalogów dla stron: /var/www/strona1 i /var/www/strona2
  • Krok 2: Dodanie wpisów w /etc/hosts (lub DNS) dla nazw testowych
  • Krok 3: Utworzenie plików VirtualHost w /etc/apache2/sites-available/
  • Krok 4: Aktywacja hostów: sudo a2ensite strona1.conf, sudo a2ensite strona2.conf
  • Krok 5: Przeładowanie Apache: sudo systemctl reload apache2
  • Krok 6: Test: curl -H "Host: strona1.local" http://localhost
Laboratorium wirtualne hosty
37/50
Laboratorium: plik VirtualHost dla stron

Kod konfiguracyjny dwóch wirtualnych hostów

# /etc/apache2/sites-available/strona1.conf
<VirtualHost *:80>
    ServerName strona1.local
    DocumentRoot /var/www/strona1
    ErrorLog /strona1_error.log
    CustomLog /strona1_access.log combined
</VirtualHost>

# /etc/apache2/sites-available/strona2.conf
<VirtualHost *:80>
    ServerName strona2.local
    DocumentRoot /var/www/strona2
</VirtualHost>
Plik VirtualHost
38/50
Laboratorium: testowanie wirtualnych hostów

Testy wirtualnych hostów z nagłówkiem Host

# Test strony 1
$ curl -H "Host: strona1.local" http://localhost
<html><body><h1>Strona 1</h1></body></html>

# Test strony 2
$ curl -H "Host: strona2.local" http://localhost
<html><body><h1>Strona 2</h1></body></html>

# Test z curl -v (pelna diagnostyka)
$ curl -v -H "Host: strona1.local" http://localhost
* Connected to localhost (127.0.0.1) port 80
> GET / HTTP/1.1
> Host: strona1.local
>
< HTTP/1.1 200 OK
< Server: Apache/2.4.41 (Ubuntu)
...
Testowanie hostów
39/50
Nagłówki HTTP – przegląd i znaczenie

Podział nagłówków według funkcji

  • nagłówki HTTP to pary Nazwa: wartosc przekazujące metadane o żądaniu lub odpowiedzi
  • Podział nagłówków:
    • General headers: dotyczą całego komunikatu (np. Date, Connection)
    • Request headers: tylko w żądaniu (np. Host, User-Agent, Accept)
    • Response headers: tylko w odpowiedzi (np. Server, Set-Cookie)
    • Entity headers: dotyczą treści (np. Content-Type, Content-Length)
nagłówki HTTP
40/50
Nagłówki bezpieczeństwa HTTP

CSP, HSTS i X-Frame-Options jako tarcza

  • X-Frame-Options: DENY – zabezpieczenie przed clickjackingiem; strona nie może być osadzona w ramce (iframe)
  • Content-Security-Policy (CSP): default-src 'self' – ogranicza źródła, z których można ładować zasoby; chroni przed XSS
  • Strict-Transport-Security (HSTS): max-age=31536000 – wymusza połączenia HTTPS; przeglądarka zapamiętuje i blokuje HTTP
  • X-Content-Type-Options: nosniff – zapobiega MIME sniffing (przeglądarka nie może zmieniać typu MIME)
nagłówki bezpieczeństwa
41/50
Nagłówki cache'owania HTTP

Sterowanie buforowaniem przez nagłówki

  • Cache-Control: max-age=3600 – określa, jak długo odpowiedź może być przechowywana w cache (w sekundach)
  • Cache-Control: no-cache, no-store, must-revalidate – wyłącza buforowanie; odpowiedź nie może być cache'owana
  • Expires: Thu, 01 Dec 2024 16:00:00 GMT – starszy nagłówek (HTTP/1.0) określający datę wygaśnięcia
  • ETag: "abc123" – znacznik wersji zasobu; klient może użyć If-None-Match do warunkowego GET (oszczędność pasma)
  • Last-Modified: Mon, 15 Jan 2024 10:00:00 GMT – data ostatniej modyfikacji; używany z If-Modified-Since
Nagłówki cache
42/50
Najważniejsze nagłówki żądania i odpowiedzi

Tabela najczęściej używanych nagłówków

nagłówekKierunekZastosowanie
HostZadanieWybór wirtualnego hosta; obowiązkowy w HTTP/1.1
User-AgentZadanieIdentyfikacja klienta (przeglądarka, bot, curl)
AcceptZadanieTypy MIME akceptowane przez klienta
Accept-LanguageZadaniePreferowany język odpowiedzi (np. pl, en-US)
RefererZadanieURL strony, z której przyszło żądanie
AuthorizationZadanieDane uwierzytelniające (Basic, Bearer token)
Content-TypeodpowiedźTyp MIME odpowiedzi (text/html, application/json)
Content-LengthodpowiedźRozmiar treści w bajtach
Set-CookieodpowiedźUstawienie ciasteczka przez serwer
Kompendium nagłówków
43/50
Negocjacja treści (content negotiation)

Wybór wersji zasobu dla konkretnego klienta

  • HTTP umożliwia negocjację treści – serwer może zwracać różne wersje tego samego zasobu w zależności od możliwości klienta
  • Typ negocjacji:
    • Server-driven: serwer wybiera najlepszą wersję na podstawie nagłówków klienta (Accept, Accept-Language, Accept-Encoding)
    • Agent-driven: klient otrzymuje listę dostępnych wersji i sam wybiera
  • przykład: przeglądarka wysyła Accept-Language: pl, serwer zwraca polską wersję strony
  • Apache: mod_negotiation, opcje MultiViews; Nginx: wymaga ręcznej konfiguracji
Negocjacja tresci
44/50
Diagnostyka HTTP – DevTools przeglądarki

Panel Network do analizy żądań i czasów

  • Zakładka Network (Sieć) – podgląd wszystkich żądań HTTP wysyłanych przez przeglądarkę podczas ładowania strony
  • Każde żądanie pokazuje: metodę, URL, kod statusu, typ MIME, rozmiar, czas ładowania, inicjator (Initiator)
  • Po kliknięciu w żądanie: szczegóły w zakładkach
    • Headers: nagłówki żądania i odpowiedzi (w tym odpowiedzi od cache)
    • Preview / Response: podgląd treści odpowiedzi
    • Timing: podział czasu na DNS, TCP, TLS, TTFB, pobieranie
  • Funkcje specjalne: przechwytywanie ruchu, symulacja wolnego łącza (throttling), blokowanie wybranych żądań
DevTools
45/50
Laboratorium: analiza ruchu HTTP

Pięć ćwiczeń z diagnostyki HTTP

  • Ćwiczenie 1 (curl -v): Wykonaj curl -v http://example.com i przeanalizuj linie z > i <
  • Ćwiczenie 2 (śledzenie przekierowań): Wykonaj curl -vL http://example.com i zidentyfikuj wszystkie odpowiedzi 3xx
  • Ćwiczenie 3 (niestandardowe nagłówki): Użyj curl -H "X-Debug: true" http://localhost
  • Ćwiczenie 4 (DevTools): Otwórz stronę, przejdź do zakładki Network, przeładuj stronę i przeanalizuj kolejność ładowania zasobów
  • Ćwiczenie 5 (metody HTTP): Sprawdź, jakie metody są dozwolone dla danego zasobu: curl -X OPTIONS http://example.com -v
Laboratorium analiza
46/50
Najczęstsze problemy HTTP i diagnostyka

Tabela problemów i metod rozwiązywania

ProblemObjawDiagnostyka
Błędny VirtualHostZła strona się wyświetlaSprawdź nagłówek Host, kolejność VirtualHost
Błąd 403 ForbiddenBrak dostępuSprawdź uprawnienia plików, dyrektywę Require
Błąd 500Wewnętrzny błąd serweraSprawdź logi Apache/Nginx, logi PHP
Przekierowanie w pętliERR_TOO_MANY_REDIRECTSSprawdź konfigurację redirectow, nagłówki cookie
Błąd SSL (Mismatch)Ostrzeżenie o certyfikacieSprawdź server_name w SSL, SNI, aliasy domen
Błąd 502/504 (proxy)Błąd bramySprawdź czy upstream działa, timeouty w proxy
Problemy HTTP
47/50
Logi serwera – jak czytać?

Rejestrowanie żądań i błędów serwera

  • Access log: rejestruje każde żądanie HTTP – adres IP klienta, znacznik czasu, metodę, ścieżkę, kod statusu, rozmiar odpowiedzi, User-Agent
  • Apache: /var/log/apache2/access.log (format combined)
  • Nginx: /var/log/nginx/access.log
  • Error log: rejestruje błędy serwera – błędy konfiguracji, problemy z modułami, błędy PHP
  • # Przyklad wpisu access log (Apache combined)
    192.168.1.10 - - [15/Jan/2024:10:00:00 +0100]
    "GET / HTTP/1.1" 200 1256
    "Mozilla/5.0 ..." "-"
Logi serwera
48/50
Narzędzia do testowania i diagnostyki HTTP

curl, openssl, httpie, DevTools, Wireshark

  • curl: narzędzie do ręcznego konstruowania żądań HTTP/HTTPS z pełną kontrolą nad nagłówkami i metodą
  • openssl s_client: ręczne nawiązywanie połączenia TLS do diagnostyki certyfikatów SSL (openssl s_client -connect example.com:443 -servername example.com)
  • httpie: alternatywa dla curl z kolorowym, czytelnym wyjściem (http http://example.com)
  • DevTools (F12): panel Network – pełna diagnostyka żądań, nagłówków i czasów
  • Wireshark/tcpdump: analiza ruchu sieciowego na poziomie pakietów (debugowanie problemów TCP/TLS)
Narzędzia HTTP
49/50
Podsumowanie

Główne zagadnienia i zdobyte umiejętności

  • HTTP to bezstanowy protokół żądanie-odpowiedź, który ewoluował od HTTP/1.0 przez HTTP/2 aż do HTTP/3 (QUIC)
  • Apache i Nginx to dwa dominujące serwery WWW o fundamentalnie różnej architekturze: procesy/wątki vs asynchroniczna pętla zdarzeń
  • Wirtualne hosty umożliwiają obsługę wielu domen na jednym serwerze – name-based (nagłówek Host) to standard
  • Nagłówki HTTP kontrolują bezpieczeństwo (CSP, HSTS, X-Frame-Options), cache'owanie (Cache-Control, ETag) i negocjacje treści
  • Diagnostyka HTTP: curl -vL do śledzenia przekierowań, DevTools do analizy czasu i nagłówków, logi serwera do identyfikacji błędów
Podsumowanie
50/50
Zadanie domowe / Pytania kontrolne

Pytania teoretyczne i praktyczne do sprawdzenia

  1. Jaka jest różnica między MPM Prefork a MPM Event w Apache? W jakich scenariuszach każdy z nich jest lepszy?
  2. Jak działa asynchroniczna pętla zdarzeń w Nginx? Dlaczego Nginx zużywa mniej pamięci niż Apache przy dużej liczbie połączeń?
  3. Co to jest name-based virtual hosting i jak jest realizowany na poziomie protokołu HTTP?
  4. Wymień i opisz trzy nagłówki bezpieczeństwa HTTP. Co chroni każdy z nich?
  5. Co oznacza kod 502 Bad Gateway? Jak zdiagnozować jego przyczynę?
  6. Używając curl -vL, sprawdź, ile przekierowań występuje dla adresu http://example.com
Zadanie domowe