Architektura databázového serveru, její podstatné komponenty a úloha databázového administrátora při jejich správě
Tento okruh pokrývá celkovou architekturu databázového serveru PostgreSQL – jeho fyzické i logické komponenty, konfigurační soubory, systémové procesy, správu uživatelů, zálohování, replikaci, rozšíření, monitorování, ladění výkonu a roli DBA při jejich správě. Zahrnuje také srovnání s Neo4j (NoSQL, grafové databáze).
📌 Co je databázová administrace a kdo je DBA?
DBA (Database Administrator) musí zvládat všechny výše uvedené oblasti, mít solidní znalost hostitelského operačního systému a jeho konfigurace, a být komunikativní – spolupracuje s vývojáři, manažery i provozním týmem.
- Standardní správa: vytváření/rušení databází, schémat, uživatelů, rolí, tablespaces
- Backup & Recovery: logické i fyzické zálohy, PITR (Point-in-Time Recovery)
- Monitoring: sledování výkonu, zatížení, chybových stavů
- Bezpečnost: autentizace, autorizace, šifrování spojení
- Ladění výkonu (Tuning): optimalizace SQL, indexy, statistiky, execution plány
- Replikace: nastavení a správa logické/fyzické replikace
- Troubleshooting: diagnostika a oprava chyb, konfliktů, blokací
🐘 PostgreSQL – přehled a historický kontext
- Kód PostgreSQL sloužil jako základ pro jiné databázové enginy (Ingres, Sybase, …)
- Aktuální verze: PostgreSQL 17 (+ 18 v přípravě, září 2025)
- ORDBMS = podporuje objektové rozšíření (dědičnost, vlastní datové typy, funkce)
- Open-source od začátku – BSD licence, silná komunita
- Enterprise funkce: replikace, full-text search, JSON/JSONB, PostGIS, …
PostgreSQL je plně ACID compliant, podporuje komplexní SQL (CTE, window functions, lateral joins), nabízí bohatý ekosystém rozšíření (extensions) a je preferován pro enterprise prostředí. Historicky vznikl na UC Berkeley z projektu Ingres (proto jméno Post-gres).
🏗️ Architektura PostgreSQL – klíčové pojmy: Cluster, Instance, Databáze
$PGDATA). Cluster může obsahovat více databází.
Na jednom fyzickém serveru (OS nodu) může běžet více clusterů (různé verze PostgreSQL, různé porty). Každý cluster je spravován samostatně.
Logická hierarchie objektů
| Úroveň | Objekt | Popis |
|---|---|---|
| 1 | Cluster / Instance | Jedna spuštěná instance PostgreSQL; má svůj $PGDATA adresář a port (výchozí 5432) |
| 2 | Databáze | Logická databáze uvnitř clusteru; uživatel se vždy připojuje ke konkrétní databázi |
| 3 | Schema | Namespace uvnitř databáze; skupinuje objekty (tabulky, funkce, …) |
| 4 | Objekty | Tabulky, indexy, sekvence, views, funkce, … |
Fyzická struktura – $PGDATA adresář
base/– datové soubory jednotlivých databází (každá databáze = podadresář pojmenovaný OID)global/– globální systémové katalogy (role, tablespaces, …) sdílené celým clusterempg_wal/– WAL (Write-Ahead Log) soubory – klíčové pro obnovu a replikacipg_tblspc/– symlinky na tablespace adresáře mimo $PGDATApostgresql.conf– hlavní konfigurační soubor instancepg_hba.conf– konfigurace autentizace (host-based authentication)pg_ident.conf– mapování OS uživatelů na DB uživatelePG_VERSION– verze PostgreSQL pro daný clusterpostmaster.pid– PID hlavního procesu (přítomen jen při běhu)
Cluster ≠ databáze. Na jednom serveru může běžet více clusterů (každý na jiném portu, jiný $PGDATA). Role/uživatelé jsou definovány na úrovni clusteru, ne na úrovni jednotlivé databáze!
⚙️ Systémové procesy PostgreSQL (Background Processes)
PostgreSQL používá multi-process model (ne multi-thread). Každé připojení klienta = nový OS proces.
Klíčové procesy a jejich úloha
| Proces | Funkce |
|---|---|
| postmaster / postgres | Hlavní proces; naslouchá na portu, forkuje backend procesy, hlídá ostatní procesy |
| backend process | Jeden process per klientské spojení; vykonává SQL dotazy |
| checkpointer | Pravidelně zapisuje dirty buffery z paměti na disk; vytváří checkpoint v WAL |
| bgwriter | Zapisuje dirty buffery na disk průběžně (redukuje práci checkpointeru) |
| walwriter | Periodicky zapisuje WAL buffery na disk |
| autovacuum launcher + worker | Automaticky spouští VACUUM a ANALYZE pro uvolnění mrtvých řádků a aktualizaci statistik |
| stats collector | Sbírá statistiky o aktivitě (počty čtení, zápisů, přístupy k indexům, …) |
| wal sender | Odesílá WAL data replikačním odběratelům (consumer strana v logické replikaci) |
| wal receiver | Přijímá WAL od primárního serveru (fyzická replikace) |
| logical replication launcher | Sleduje pg_subscription, spouští apply workery pro logickou replikaci |
| apply worker | Aplikuje změny z publikace na tabulky subscribera |
PostgreSQL záměrně používá multi-process model – každý backend proces je izolovaný, selhání jednoho procesu neshodí celý server. Sdílená paměť (shared buffers) je sdílena mezi procesy přes OS mechanismy (shared memory segments).
🧠 Paměťové komponenty – Shared Buffers, WAL, Cache
- Shared Buffers: Stránky (datové bloky, velikost 8 KB) jsou do shared buffers načítány z disku při čtení a modifikovány při zápisu. "Dirty" = modifikovaná, ale ještě nezapsaná na disk.
- WAL Buffers: Paměťová oblast pro WAL záznamy (před jejich zápisem na disk do
pg_wal/). - Work_mem: Paměť pro řazení a hašovací operace per dotaz (resp. per uzel v execution plánu). Nastavení příliš nízké → spill to disk; příliš vysoké → OOM riziko při mnoha souběžných dotazech.
- Maintenance Work_mem: Paměť pro maintenance operace (VACUUM, CREATE INDEX, …).
- Effective Cache Size: Odhad (hint pro optimalizátor), jak velká část FS cache OS je k dispozici. Ovlivňuje volbu execution plánu, reálně nic nealokuje.
WAL – Write-Ahead Log
- Klíčový pro implementaci ACID – garantuje Durability (trvanlivost): i po pádu serveru lze z WAL obnovit stav databáze
- Klíčový pro PITR (Point-In-Time Recovery)
- Klíčový pro replikaci (logická i fyzická)
- LSN (Log Sequence Number) = ukazatel do WAL (pozice záznamu); používá se pro správu konzistence replikace
- WAL soubory jsou recyklovány (přepisovány) – nerostou do nekonečna
- wal_level – parametr určující množství informací v WAL:
minimal|replica|logical
Checkpoint
- Řídí ho proces checkpointer
- Po checkpointu lze WAL záznamy před ním (v případě zotavení) přeskočit
- Vytváří se periodicky (
checkpoint_timeout) nebo při naplnění WAL (max_wal_size) - DBA může vynutit manuálně:
CHECKPOINT;
Při kopírování souborů běžící databáze mohou být některé stránky zachyceny v nedokončeném stavu (partial write). WAL a informace o posledním checkpointu jsou nutné k tomu, aby bylo možné tyto soubory přivést do konzistentního stavu při obnově.
📋 Konfigurační soubory – postgresql.conf, pg_hba.conf, pg_ident.conf
postgresql.conf – konfigurace instance
Hlavní konfigurační soubor celé instance (clusteru). Změny typicky vyžadují reload (pg_ctlcluster reload nebo SELECT pg_reload_conf();), některé vyžadují restart.
listen_addresses = '*'– na jakých IP adresách naslouchat (výchozí:localhost)port = 5432– port serverumax_connections– maximální počet současných klientských připojeníshared_buffers– velikost sdílené cachework_mem– paměť pro sort/hash per operaciwal_level = logical– nutné pro logickou replikacilog_*– parametry logování (log_min_duration_statement, log_connections, …)shared_preload_libraries– rozšíření načtená při startu (např.pg_stat_statements)track_activities, track_counts, track_functions– nastavení statistik- Zobrazení aktuálního nastavení:
SELECT * FROM pg_settings;neboSHOW ALL; - Změna za běhu:
ALTER SYSTEM SET parametr = hodnota;(zapíše dopostgresql.auto.conf)
pg_hba.conf – Host-Based Authentication
Formát záznamu:
# type database user address method
local all all peer
host all all 127.0.0.1/32 scram-sha-256
host all all 0.0.0.0/0 scram-sha-256
| Klíčový pojem | Vysvětlení |
|---|---|
| local | Unix domain socket připojení (bez TCP/IP) |
| host | TCP/IP připojení (i z localhostu) |
| hostssl | TCP/IP + povinné SSL/TLS |
| peer | Autentizace přes OS uživatelské jméno (vhodné jen pro local) |
| scram-sha-256 | Bezpečná autentizace heslem přes challenge-response protokol (doporučeno) |
| md5 | Starší autentizace heslem (méně bezpečná) |
| trust | Bez autentizace – NEBEZPEČNÉ v produkci! |
| ident | Mapování přes identd protokol (ident server) |
- Záznamy se procházejí shora dolů, první shoda platí
- Po výchozí instalaci: nikdo z venku se nemůže připojit (bezpečnostní výchozí stav)
- Otevření pro vzdálená připojení: změnit
pg_hba.conf+ nastavitlisten_addresses = '*'+ restart/reload
pg_ident.conf
Mapuje OS uživatelská jména na databázové uživatele (použitelné pro metody ident a peer). Např. OS uživatel jan → DB uživatel app_user.
.pgpass soubor
Umožňuje automatické přihlašování bez zadávání hesla (uložení hesla v ~/.pgpass). Formát: hostname:port:database:username:password. Soubor musí mít práva 400 (jinak ho PostgreSQL ignoruje). Vhodné pro adminy a scripty, ale hesla jsou v plaintextu!
👤 Role, uživatelé a správa přístupu
Klíčové atributy role
| Atribut | Popis |
|---|---|
| LOGIN | Role se může přihlásit (= uživatel). CREATE USER je zkratka pro CREATE ROLE ... LOGIN |
| SUPERUSER | Obchází všechna přístupová omezení |
| CREATEDB | Může vytvářet databáze |
| CREATEROLE | Může vytvářet role |
| REPLICATION | Může se připojit v replikačním módu |
| INHERIT | Automaticky dědí oprávnění skupinových rolí, jejichž je členem |
CREATE USER jmeno WITH PASSWORD 'heslo';– vytvoří roli s LOGIN atributemCREATE ROLE skupinova_role;– skupinová role bez LOGINGRANT skupinova_role TO uzivatel;– přidání uživatele do skupinyREVOKE skupinova_role FROM uzivatel;– odebrání\du– zobrazí role s atributy v psqlSELECT SESSION_USER, CURRENT_USER;– aktuální uživatelSET ROLE jmeno;– přepnutí role v rámci session
Dědičnost rolí umožňuje modelovat skupiny oprávnění: vytvoříme roli readonly s GRANT SELECT na tabulky, pak přidáme uživatele GRANT readonly TO jan. Jan automaticky zdědí všechna SELECT práva. Role bez INHERIT musí pro přepnutí práv explicitně volat SET ROLE.
📦 Databáze, Schémata a Tablespaces
Vytváření databáze
CREATE DATABASE. Do template1 lze přidávat rozšíření, která se pak propagují do nových databází.
- template0 = "čistá" kopie template1 z doby inicializace clusteru (bez žádných rozšíření). Vhodná pro obnovu ze zálohy s jiným locale.
CREATE DATABASE db_name TEMPLATE template1;– vytvoření databázeCREATE DATABASE db_name TEMPLATE template0 LOCALE 'cs_CZ.utf8';– s jiným locale- Databáze fyzicky odpovídá adresáři v
$PGDATA/base/<OID>/
Schémata (Schemas)
schema_name.object_name.
- Výchozí schema:
public search_path= seznam schémat, ve kterých se hledají objekty bez explicitního prefixuSET search_path = my_schema;– nastavení v psqlSHOW search_path;– zobrazení aktuálního search_path- Různé aplikace mohou sdílet jednu databázi přes různá schémata (multi-tenant)
Tablespaces
$PGDATA.
- Praktické použití: kriticky zatížené tabulky/indexy na SSD, archivní data na HDD
CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';CREATE TABLE velka_tabulka (...) TABLESPACE fastspace;ALTER TABLE tabulka SET TABLESPACE jiny_tablespace;– přesun objektu\db+– zobrazení tablespaces v psql; neboSELECT * FROM pg_tablespace;
💾 Zálohování a obnova (Backup & Recovery)
Typy záloh
| Typ zálohy | Metoda | Výhody | Nevýhody |
|---|---|---|---|
| Logická záloha (cold/hot) | pg_dump / pg_restore |
Přenositelná, selektivní (schema/data/tabulka), cross-version | Pomalejší pro velké DB, snapshot v čase dump |
| Fyzická studená záloha | cp, tar (zastavený cluster) |
Jednoduchá, rychlá | Vyžaduje downtime |
| Fyzická online (hot) záloha | pg_basebackup + archivace WAL |
Bez downtime, umožňuje PITR | Komplexní nastavení, potřeba archivovat WAL |
pg_dump / pg_restore – logická záloha (preferovaná pro vývojáře/adminy)
pg_dump -Fc dbname > backup.dump– záloha ve vlastním formátu (custom, doporučeno)pg_dump -Fp dbname > backup.sql– plain SQL formátpg_dumpall > all_databases.sql– záloha celého clusteru včetně rolípg_restore -d newdb backup.dump– obnova ze zálohy- Přepínače:
--schema-only,--data-only,--table=jmeno,--no-owner, …
Online (hot) fyzická záloha + PITR
- Fyzická kopie běžící databáze není sama o sobě konzistentní (partial writes)
- WAL záznamy popisují všechny změny od posledního checkpointu – přehráním WAL lze přivést base backup do konzistentního stavu
- Archivace WAL:
archive_mode = on,archive_commandv postgresql.conf - Obnova: rozbalení base backupu + konfigurace
recovery.conf(PostgreSQL 12+:recovery_target_timev postgresql.conf) - Logická replikace je postavena na stejném principu jako PITR (WAL dekódování)
WAL záznamy obsahují pouze change vektory (co se změnilo), nikoli plný obraz dat. Pro přehrání WAL potřebujeme výchozí stav (base backup). WAL od bodu base backupu pak postupně aplikujeme až do požadovaného bodu v čase.
🔄 Přesun dat – COPY a \copy
| COPY (serverový) | \copy (klientský psql) | |
|---|---|---|
| Filesystém | Serverový FS | Klientský FS |
| Cesty | Absolutní | Relativní |
| Oprávnění | Vyžaduje superuser nebo pg_read/write_server_files | Práva klientského OS uživatele |
| Použití | Import do DB na serveru | Flexibilní, i pro vzdálené klienty |
\copy tabulka FROM 'soubor.csv' WITH CSV HEADER;\copy (SELECT ...) TO 'export.csv' WITH CSV HEADER;- CSV formát je velmi praktický a rychlý pro přenos dat mezi databázemi
- Výrazně rychlejší než
INSERT INTO ... VALUES(...);(generovaný pg_dumpem) - Excel umí číst CSV – snadné reportování uživatelům
📊 Monitoring, ladění výkonu a optimalizace SQL
Cumulative Statistics System
PostgreSQL automaticky sbírá statistiky o aktivitě serveru. Parametry: track_activities, track_counts, track_functions, track_io_timing, track_wal_io_timing.
- Dynamické statistické pohledy – aktuální stav systému (např.
pg_stat_activity– aktivní dotazy) - Kumulované statistické pohledy – nashromážděné statistiky od startu/resetu
pg_stat_all_tables– statistiky per tabulka (seq scany, index scany, mrtvé řádky, …)pg_stat_all_indexes– využití indexů (klíčové pro nalezení nepoužívaných indexů)pg_stat_bgwriter– statistiky bgwriteru a checkpointůpg_stat_replication– stav replikačních připojení
Logování – nastavení v postgresql.conf
log_line_prefix = '%t [%p]: [%l-1] '
log_min_duration_statement = 0 -- logovat všechny dotazy (0 = všechny)
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 0
log_autovacuum_min_duration = 0
log_destination = 'csvlog'
log_directory = '/work/pglogs'
log_statement = 'all'
logging_collector = on
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
Nástroje pro monitoring a analýzu
- pgbadger – analýza PostgreSQL logů, generuje HTML report se statistikami pomalých dotazů
- pg_bench – generátor zátěže (implementace TPC-B benchmarku); simuluje bankovní transakce
- pgAdmin – grafická administrační aplikace (doporučen přes Docker)
- DataGrip – spíše pro vývojáře
- OS nástroje:
top,htop,iostat,vmstat
pg_bench – generování zátěže
createdb example
pgbench -i -s 5 example # inicializace testovací DB (scale factor 5)
pgbench -c 10 -j 2 -t 10000 example # 10 klientů, 2 thready, 10000 transakcí
TPC-B simuluje banku s pobočkami a klienty manipulujícími s účty. TPC-C a TPC-E jsou modernější benchmarky používané v praxi.
Oracle AWR (pro srovnání)
Oracle má automatizovanou infrastrukturu pro monitoring: AWR (Automatic Workload Repository) ukládá snapshoty zatížení, na jejichž základě fungují automatičtí "advisors" (Index Advisor, Memory Advisor, …). PostgreSQL tento mechanismus nativně nemá, ale pg_stat_statements a pgBadger pokrývají podobné potřeby.
🔍 SQL Optimalizace – EXPLAIN, indexy, statistiky, materializované pohledy
Princip cost-based optimalizace
- Cost = odhadovaná cena v abstraktních jednotkách (page reads, CPU operations)
- Plán = strom operací; listy jsou zdroje dat (Seq Scan, Index Scan), uzly jsou operace (Join, Sort, Hash, …)
EXPLAIN a EXPLAIN ANALYZE
EXPLAIN dotaz;– zobrazí odhadovaný execution plán (cost, rows, width)EXPLAIN ANALYZE dotaz;– skutečně provede dotaz + zobrazí skutečné časy a počty řádků vs. odhadovanéEXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) dotaz;– detailní výstup s buffer statistikami
Příklad výstupu EXPLAIN:
HashSetOp Except (cost=0.00..33.14 rows=70 width=1056)
-> Append (cost=0.00..31.90 rows=71 width=1056)
-> Subquery Scan on "*SELECT* 1" (cost=0.00..11.40 rows=70 width=1056)
-> Seq Scan on animal (cost=0.00..10.70 rows=70 width=1052)
-> Subquery Scan on "*SELECT* 2" (cost=0.14..20.15 rows=1 width=1056)
-> Nested Loop (cost=0.14..20.14 rows=1 width=1052)
-> Seq Scan on examination (cost=0.00..11.75 rows=1 width=4)
Filter: ((purpose)::text = 'nausea'::text)
-> Index Scan using pk_animal on animal (cost=0.14..8.16 rows=1)
Postup SQL optimalizace
- Nalézt problematické (pomalé a/nebo časté) SQL dotazy → pg_stat_statements, pgbadger, logy
- Zkoumat jejich execution plán (
EXPLAIN ANALYZE) - Pochopit plán a rozhodnout, jak ho zlepšit
- Aplikovat změnu (index, rewrite dotazu, VACUUM, ANALYZE, …)
- Ověřit, že se situace zlepšila
- Typicky nutno řešit dotaz po dotazu
Indexy
- PRIMARY KEY a UNIQUE constraint automaticky vytvoří index
CREATE INDEX emp_name_idx ON employee(surname, firstname);– composites indexCREATE INDEX CONCURRENTLY idx ON velka_tab(col);– bez blokování DML- Index zrychluje čtení, ale zpomaluje DML (insert/update/delete musí udržovat index)
- Typy indexů: B-tree (výchozí), Hash, GiST, SP-GiST, GIN (pro pole, JSONB), BRIN (pro velké tabulky s korekcí dle pozice)
- Nalezení chybějících indexů přes
pg_stat_all_tables: tabulky s mnoha seq scany a málo index scany - Nalezení nepoužívaných indexů přes
pg_stat_all_indexes
Statistiky (ANALYZE)
pg_statistic. Optimalizátor tyto statistiky používá pro odhad ceny execution plánů.
- Autovacuum daemon automaticky spouští ANALYZE (parametr
autovacuum_analyze_threshold) - Manuálně:
ANALYZE;(celý cluster) neboANALYZE schema.tabulka; - Statistiky lze spustit i na individuální sloupce:
ANALYZE tabulka (sloupec); - Správné statistiky = správné execution plány = dobrý výkon
Materializované pohledy (Materialized Views)
- Běžný VIEW = pouze uložený SELECT, při každém dotazu se provede znovu
- Materialized VIEW = výsledek uložen fyzicky, může mít indexy
CREATE MATERIALIZED VIEW nazev AS SELECT ...;REFRESH MATERIALIZED VIEW nazev;– aktualizace dat (lze naplánovat cronjem)REFRESH MATERIALIZED VIEW CONCURRENTLY nazev;– bez zamknutí čtení (vyžaduje unique index)- Vhodné pro: složité agregace, reporty, data, která se mění méně častem než jsou dotazována
🔧 Rozšíření PostgreSQL (Extensions)
CREATE EXTENSION. Klíčová vlastnost PostgreSQL pro rozšiřování funkcionality.
- Dostupná rozšíření:
SELECT * FROM pg_available_extensions; - Nainstalovaná rozšíření:
SELECT * FROM pg_extension; - Instalace:
CREATE EXTENSION jmeno_rozsireni;(per databáze!) - Fyzické umístění:
/usr/share/postgresql/<verze>/extension/(Debian/Ubuntu) - Shipped extensions v balíčku postgresql-contrib
- Existuje 1000+ extensions (na webu PostgreSQL)
Klíčová rozšíření
Sleduje statistiky plánování a provádění SQL dotazů (celkový čas, počet volání, řádky). Nutné pro optimalizaci. Musí být uvedeno v shared_preload_libraries v postgresql.conf. Parametr compute_query_id = on. Instalace: CREATE EXTENSION pg_stat_statements;
Procedurální jazyk pro stored procedures a funkce, inspirovaný Oracle PL/SQL. Instalován defaultně na většině platforem. PostgreSQL podporuje i PL/Python, PL/Perl, PL/Java pro stored procedures.
Umožňují přistupovat k externím datovým zdrojům (jiné DB, CSV soubory, HTTP API) jako k lokálním tabulkám. Příklady: file_fdw (soubory), postgres_fdw (jiné PostgreSQL), oracle_fdw, …
- PostGIS – prostorové (geografické) datové typy a funkce
- pg_trgm – trigram podobnostní vyhledávání (fuzzy matching)
- uuid-ossp – generování UUID
- hstore – key-value store uvnitř PostgreSQL sloupce
- db-links – vzdálené databázové spojení
- Různé typy indexů – bloom, rum, …
🔁 Logická replikace (Logical Replication)
Předpoklady
wal_level = logicalv postgresql.conf producenta (výchozí jereplica)- Funkční síťové spojení z consumera na producenta (subscription objekt obsahuje connection string)
- Dostatečná oprávnění role použité pro replikaci (atribut REPLICATION)
- Tabulky musí existovat na obou stranách (DDL se nereplikuje!)
- Pouze DML operace jsou replikovány (INSERT, UPDATE, DELETE) – ne DDL, sekvence, …
Klíčové koncepty
| Pojem | Strana | Popis |
|---|---|---|
| Publication | Producent | Definuje, které tabulky (a případně sloupce/řádky) jsou publikovány. CREATE PUBLICATION pubs FOR TABLE t1, t2; |
| Subscription | Consumer | Definuje odběr – connection string k producentovi + jméno publikace. CREATE SUBSCRIPTION subs CONNECTION '...' PUBLICATION pubs; |
| Replication Slot | Producent | Struktura zajišťující, že producent nemaže WAL segmenty, dokud je consumer nepřijal. Vytváří se automaticky při CREATE SUBSCRIPTION. |
| LSN (Log Sequence Number) | Obě | Ukazatel do WAL – klíčový pro sledování, kam až consumer replikoval. |
| Initial Data Load | Consumer | Při prvním zapnutí subscription se automaticky zkopírují existující data z producenta. |
Procesy logické replikace
- Replication Launcher – periodicky kontroluje pg_subscription, spouští apply workery
- Apply Worker – zpracovává replikační stream per subscription, spouští tablesync workery per tabulku
- WAL Sender – na straně producenta; dekóduje WAL a posílá změny consumerovi; závisí na replication slotu
Rozšířené možnosti
- Row Filters – replikace pouze podmnožiny řádků (WHERE klauzule v CREATE PUBLICATION)
- Column Lists – replikace pouze podmnožiny sloupců (specifikace sloupců v CREATE PUBLICATION)
- Synchronous Commit – producent počká na potvrzení od consumera před potvrzením transakce (silnější garance konzistence, větší latence)
Monitorování
- Strana producenta:
pg_publication,pg_publication_rel,pg_replication_slots - Strana consumera:
pg_subscription,pg_subscription_rel,pg_stat_subscription
Troubleshooting
- Pokud apply worker selže, replication launcher ho restartuje a požádá o replay od posledního potvrzeného LSN
- Přeskočení problematické transakce:
ALTER SUBSCRIPTION sub SKIP (lsn = '0/1562C10'); - Alternativně: drop a recreate subscription (včetně initial data load)
- Pozor: lokální DML změny na consumerovi nejsou propagovány zpět na producenta, ale mohou být přepsány replikačními změnami z producenta!
Fyzická (streaming) replikace = byte-for-byte kopie WAL → exaktní kopie celého clusteru (standby). Logická replikace = selektivní, cross-version kompatibilní, na úrovni SQL změn. Logická replikace nepodporuje DDL – schéma musíme na consumerovi vytvořit ručně!
🛠️ Nástroje DBA a psql
psql – terminálový klient
| Příkaz psql | Funkce |
|---|---|
\h | Nápověda k SQL příkazům |
\? | Nápověda k psql meta-příkazům |
\du | Zobrazí role s atributy |
\db+ | Zobrazí tablespaces |
\dn | Zobrazí schémata |
\dt | Zobrazí tabulky v aktuálním search_path |
\d tabulka | Popis struktury tabulky |
\i soubor | Spustí SQL script ze souboru |
\o soubor | Přesměruje výstup do souboru |
\copy | Import/export dat (klientský FS) |
\c | Zobrazí info o spojení |
\e | Otevře poslední příkaz v editoru |
\a | Přepíná zarovnání výstupu |
Doporučené prostředí pro psql
PSQL_EDITOR=vim # editor pro úpravu bufferu uvnitř psql
PAGER=pspg -F --style=19 # pager pro zobrazení výsledků dotazů
Správa clusteru – základní příkazy (Debian/Ubuntu)
pg_ctlcluster 17 main start|stop|restart|reload|statuspg_lsclusters– seznam všech clusterů na serverupg_createcluster 17 newcluster– vytvoření nového clusterupg_dropcluster 17 oldcluster --stop– smazání clusteru
Připojení k databázi
psql -h localhost -U uzivatel -d databaze– TCP/IP spojení (použije scram-sha-256 z pg_hba.conf)psql -U uzivatel -d databaze– socket spojení (použije peer auth)- Connection string:
psql "host=localhost dbname=mydb user=myuser password=mypass"
🕸️ Grafové databáze – Neo4j a NoSQL přehled
Motivace pro NoSQL
- RDBMS: rigidní schéma, chybí komplexní datové typy, aggregate-ignorant přístup
- NoSQL vznik po CAP teorému (2003, D. Brewer) a BigData requirements (3–5V)
- CAP teorém: Consistency, Availability, Partition tolerance – lze garantovat pouze 2 ze 3
NoSQL datové modely
| Model | Příklady | Vhodné pro |
|---|---|---|
| Key-Value | Redis, DynamoDB | Session store, cache, jednoduché look-up |
| Document | MongoDB, CouchDB | Flexibilní schéma, hierarchická data |
| Wide-Column | Cassandra, HBase | Časové řady, IoT, obrovské objemy dat |
| Graph | Neo4j, Amazon Neptune | Sociální sítě, supply chains, genealogie, geografie |
ACID vs BASE
| ACID (RDBMS) | BASE (NoSQL) |
|---|---|
| Atomicity | Basically Available |
| Consistency | Soft state |
| Isolation | Eventually consistent |
| Durability |
Neo4j – datový model
- Vertex (uzel) – může mít více labelů (např.
:Person:Employee) - Edge (hrana) – orientovaná, může mít právě jeden label; lze dotazovat i v opačném směru
- Property – key-value pár, přiřazený uzlu nebo hraně
- Schema-free databáze (flexibilní struktura)
- Cypher query language – deklarativní, inspirovaný SQL, intuitivní ASCII-art syntaxe
Cypher – základy dotazovacího jazyka
- Základní dotaz:
MATCH ... RETURN ... - Uzel:
(a:AIRPORT)– proměnnáa, labelAIRPORT - Vztah:
(a:AIRPORT)-[:DIRECT]->(b:AIRPORT)– orientovaná hrana s labelem DIRECT - Délka cesty:
-[:DIRECT*1..5]->– cesta délky 1 až 5 hran - JSON vlastnosti:
MATCH (s{code:'sf'})-[:DIRECT]->(d) RETURN s,d; - Smazání všeho:
MATCH(n) DETACH DELETE (n); - Schéma:
CALL db.schema.visualization();
Neo4j architektura a instalace
- Vyžaduje JRE 17+ (Neo4j 5)
- Verze: Community / Enterprise; Cloud / Standalone / Embedded; Desktop aplikace
- Spuštění:
./neo4j start, web klient nahttp://localhost:7474 - Výchozí přihlašovací údaje:
neo4j/neo4j - Lokální instalace: konfigurace adresářů pro data/logy/config – extrémně jednoduché
Grafová DB je optimální pro husté grafy, kde potřebujeme dotazovat cesty mezi uzly, podgrafy nebo vzory. Typické use cases: sociální sítě (přátelé přátel), supply chain, genealogie, geografické sítě, fraud detection (řetězce transakcí), data lineage. RDBMS by zde vyžadoval rekurzivní JOINy s exponenciálním nárůstem složitosti.
📝 Shrnutí okruhu a kontrolní otázky ke státnicím
Stručné shrnutí (5 klíčových bodů)
- Architektura PostgreSQL: Cluster = instance se svým $PGDATA; obsahuje více databází; databáze obsahuje schémata; multi-process model (postmaster + backend per spojení + background procesy)
- Konfigurace: Tři klíčové konfigurační soubory –
postgresql.conf(instance),pg_hba.conf(autentizace),pg_ident.conf(mapování uživatelů) - WAL je fundamentální: Write-Ahead Log je základem pro ACID (durability), PITR, replikaci; checkpoint zajišťuje, že dirty buffery jsou flushovány na disk
- Zálohování: Tři přístupy – logická záloha (pg_dump), fyzická studená záloha (cp/tar se zastavenou DB), fyzická online záloha (pg_basebackup + archivace WAL pro PITR)
- Logická replikace: Publication (producent) + Subscription (consumer); pouze DML (ne DDL); replication slot zajišťuje, že WAL není smazán před doručením; možné row filters a column lists
Kontrolní otázky (co bych měl umět říct u státnic)
Odpověď: V PostgreSQL je cluster = jedna instance PostgreSQL serveru se svým datovým adresářem ($PGDATA) a jedním set background procesů. Na jednom fyzickém serveru může běžet více clusterů (různé verze PG, různé porty). To je odlišné od obecného pojmu cluster (skupina serverů pro HA/škálovatelnost).
Odpověď: Při kopírování souborů za chodu databáze mohou být některé datové bloky zachyceny v nedokončeném stavu (transakce zpísuje část stránek, pak kopírujeme, pak dopíše zbytek). WAL obsahuje záznamy o všech změnách. Při obnově se nejprve rozbalí base backup a pak se přehrají WAL záznamy od posledního checkpointu, čímž se databáze přivede do konzistentního stavu.
Odpověď: PITR (Point-In-Time Recovery) = obnova databáze do libovolného bodu v minulosti. WAL obsahuje pouze change vektory (co se změnilo), nikoli plný obraz dat. Pro přehrání WAL potřebujeme výchozí datový stav (base backup). WAL od bodu base backupu pak aplikujeme postupně (přehráváme), až do požadovaného cílového bodu v čase.
Odpověď: pg_hba.conf (Host-Based Authentication) definuje pravidla přístupu: typ spojení (local socket vs TCP/IP), cílová databáze, uživatel, IP rozsah a metoda autentizace (peer, scram-sha-256, md5, trust, ident). Pravidla se procházejí shora dolů, první shoda platí. Po výchozí instalaci nikdo z venku se nemůže připojit. Pro vzdálená připojení je nutno upravit pg_hba.conf + nastavit listen_addresses + reload/restart.
Odpověď: Fyzická replikace = byte-for-byte kopie WAL → exaktní kopie celého clusteru (streaming replication, standby). Logická replikace = dekódování WAL na úrovni SQL operací (INSERT/UPDATE/DELETE per tabulka) → selektivní replikace (jen určité tabulky, sloupce, řádky), cross-version kompatibilní, ale nepodporuje DDL replikaci.
Odpověď: Replication slot je struktura na straně producenta, která zajišťuje, že producent nevymaže WAL segmenty, dokud je consumer nepřijal a nezpracoval. Bez replication slotu hrozí, že producent přepíše WAL záznamy, které consumer ještě neobdržel, a replikace se ocitne v nekonzistentním stavu. Replication slot se typicky vytváří automaticky při CREATE SUBSCRIPTION.
Odpověď: EXPLAIN zobrazí odhadovaný execution plán (cost, rows). EXPLAIN ANALYZE dotaz skutečně provede a zobrazí reálné vs. odhadované hodnoty. SQL optimalizace probíhá: (1) najít problematické dotazy (pomalé/časté) přes pg_stat_statements/logy; (2) zkoumat execution plán; (3) pochopit a navrhnout zlepšení (index, ANALYZE, přepis dotazu); (4) aplikovat; (5) ověřit výsledek. Řeší se dotaz po dotazu.
Odpověď: Extension = balíček SQL objektů instalovaný do konkrétní databáze příkazem CREATE EXTENSION. Klíčové příklady: pg_stat_statements (statistiky SQL dotazů, nutné pro optimalizaci), PL/pgSQL (stored procedures), PostGIS (geografie), FDW (přístup k externím datovým zdrojům), pg_trgm (fuzzy matching). Musí být uvedeny v shared_preload_libraries pokud jsou potřeba od startu.
Odpověď: Grafová DB je vhodná pro husté grafy s dotazy na cesty, podgrafy a vzory – typicky sociální sítě, supply chains, genealogie, fraud detection. V RDBMS by rekurzivní JOINy (pro hledání cest přes N uzlů) měly exponenciální složitost. Grafová DB toto řeší nativně. Neo4j je schema-free, dotazovací jazyk Cypher používá intuitivní ASCII-art syntaxi pro vzory grafu.
Protokol HTTP a jeho vlastnosti, komunikace klient-server a bezpečnostní aspekty
Principy HTTP protokolu, struktura zpráv, stavové kódy, metody, virtualizace, autentizace a zabezpečení přenosu pomocí SSL/TLS.
📡 Základní vlastnosti protokolu HTTP
Klíčové vlastnosti:
- Textový protokol – zprávy jsou čitelné jako text (na rozdíl od binárních protokolů).
- Bezestavový – každý požadavek je nezávislý; server si nepamatuje předchozí interakce. (Stav se musí řešit cookies, sessions apod.)
- Aplikační vrstva ISO OSI – běží nad TCP/IP.
- Požadavek–odpověď – klient vždy iniciuje, server odpovídá.
| Verze | RFC | Klíčová novinka |
|---|---|---|
| HTTP/1.0 | RFC 1945 | Základní implementace; Host: hlavička nepovinná |
| HTTP/1.1 | RFC 2616, 2068 | Povinná Host:, persistent spojení, chunked encoding, Cache-Control |
| HTTP/2 | RFC 7540 | Binární framing, multiplexing, server push, header compression |
| HTTPS | – | HTTP + SSL/TLS šifrování |
Rozšíření HTTP/1.1 oproti HTTP/1.0
- Hlavička Host: – povinná; umožňuje name-based virtual hosting na jedné IP.
- Persistent (keep-alive) spojení – jedno TCP spojení pro více požadavků (Connection: close pro ukončení).
- Chunked encoding – odpověď rozdělena do bloků (Transfer-Encoding: chunked); vhodné když není předem známa velikost.
- Expect: 100-continue – klient se ptá, zda server přijme data před jejich odesláním.
- Vylepšená Cache-Control.
📨 Struktura HTTP zpráv
Požadavek (Request)
Method Request-URI HTTP-Version CRLF [Header-Name: Header-Value CRLF]* CRLF [body]
Příklad:
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html
Odpověď (Response)
HTTP-Version Status-Code Reason-Phrase CRLF [Header-Name: Header-Value CRLF]* CRLF [body]
Příklad:
HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length: 1234 <!DOCTYPE html>...
Pokud se liší kódování v HTTP hlavičce a v HTML META tagu, platí informace z HTTP hlavičky. HTML meta tag je pouze fallback pro případ, kdy HTTP hlavička chybí.
🔢 Stavové kódy HTTP
Číslice na začátku kódu určuje třídu. Pokud klient nerozumí konkrétnímu kódu, považuje ho za kód x00 (např. 499 → 400).
| Třída | Význam | Příklady |
|---|---|---|
| 1xx | Informational – zpracování pokračuje | 100 Continue |
| 2xx | Success – úspěch | 200 OK |
| 3xx | Redirection – přesměrování | 301 Moved Permanently, 302 Found, 303 See Other, 304 Not Modified |
| 4xx | Client Error – chyba klienta | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 408 Request Timeout |
| 5xx | Server Error – chyba serveru | 500 Internal Server Error, 503 Service Unavailable |
- 301 Moved Permanently – prohlížeč si zapamatuje novou adresu a příště jde přímo tam. SEO přenáší hodnocení.
- 302 Found (dočasné) – prohlížeč příště zkusí původní URL znovu.
- 401 vs 403: 401 = neautentizován (chybí přihlášení), 403 = autentizován ale bez oprávnění.
🛠️ HTTP metody
| Metoda | Bezpečná | Idempotentní | Účel |
|---|---|---|---|
| GET | ✅ | ✅ | Získání zdroje. Bez vedlejších efektů. Vrací výsledek, ne zdrojový kód. |
| HEAD | ✅ | ✅ | Jako GET, ale bez těla odpovědi. Testování existence/metadat. |
| POST | ❌ | ❌ | Odeslání dat ke zpracování (formuláře, vytvoření záznamu). |
| PUT | ❌ | ✅ | Nahrání/nahrazení dat na serveru. Opakování nemění výsledek. |
| DELETE | ❌ | ✅ | Smazání zdroje. Druhé smazání vrátí 404 – idempotentní z pohledu výsledku. |
| OPTIONS | ✅ | ✅ | Informace o podporovaných metodách serveru/zdroje. |
| TRACE | ✅ | ✅ | Echo požadavku – diagnostika průchodu proxy servery. |
| CONNECT | ❌ | ❌ | Vytvoření tunelu (typicky SSL přes proxy). |
Server musí podporovat GET a HEAD. Ostatní metody jsou volitelné. REST API typicky používá GET, POST, PUT, DELETE.
🔗 URL, URI, IRI – identifikace zdrojů
| Zkratka | Název | Popis |
|---|---|---|
| URI | Uniform Resource Identifier | Obecné pojmenování zdrojů; nadmnožina URL |
| URL | Uniform Resource Locator | Specifikuje umístění zdroje; podmnožina URI |
| IRI | Internationalized Resource Identifier | Rozšíření URI o Unicode znaky (místo ASCII) |
Struktura URL
http://user:password@host:port/cesta?param1=val1¶m2=val2#fragment
Znaky v URL
- Bezpečné (bez kódování): alfanumerické +
$-_.+!*'() - Nebezpečné (unsafe) – musí být kódovány:
<>"#%{}[]|\^~` - Vyhrazené (reserved) – speciální význam v URL:
;/?:@=&– pro jiné použití musí být kódovány - Kódování:
%XXkde XX je hexadecimální kód podle ISO 8859-1 #fragmentnení součástí URL podle RFC – server ho nevidí, zpracovává ho klient
🔒 Bezpečnost přenosu dat – SSL/TLS a HTTPS
Verze protokolu
- SSLv2 (1995–2011) – dnes zakázán
- SSLv3 (1996–2015) – dnes zakázán (útok POODLE)
- TLSv1.0 (1999–2020) – deprecated
- TLSv1.1 (2006–2020) – deprecated
- TLSv1.2 (2008–) – aktuálně bezpečný
- TLSv1.3 (2018–) – nejmodernější, nejbezpečnější
TLS Handshake – jak probíhá
- Klient pošle ClientHello (podporované šifry, verze TLS, náhodné číslo).
- Server odešle ServerHello + certifikát + výběr šifry.
- Klient ověří certifikát serveru (podpis CA, platnost, jméno).
- Výměna klíčů (RSA nebo Diffie-Hellman/ECDH).
- Obě strany odvodí session klíče.
- Datový přenos je šifrovaný symetrickými klíči.
Bezpečnostní opatření TLS
- Klient ověřuje serverový certifikát vůči seznamu důvěryhodných CA.
- Porovnává DNS jméno serveru s CN/SAN v certifikátu (ochrana před MitM).
- Pořadová čísla zpráv v MAC (Message Authentication Code) – ochrana proti replay útokům.
- HMAC – ověřovací kód rozšířený o klíč; jen vlastník klíče dokáže ověřit.
- TLS Finished zpráva obsahuje hash všech handshake zpráv – detekce manipulace.
HTTPS zajišťuje šifrování a utajení obsahu komunikace. Samo o sobě nebrání MitM útoku – pouze pokud klient správně ověří certifikát serveru. Použití self-signed certifikátu bez přidání CA do důvěryhodných způsobuje varování v prohlížeči.
📜 PKI, certifikáty a CA
Struktura certifikátu X.509
- Subjekt (Subject) – komu byl vydán (DN: CN, O, OU, L, ST, C)
- Vydavatel (Issuer) – certifikační autorita
- Veřejný klíč subjektu
- Platnost – Not Before / Not After
- Digitální podpis CA – ověřitelný veřejným klíčem CA
Distinguished Name (DN) – pole
| Zkratka | Popis | Příklad |
|---|---|---|
| CN | Common Name – certifikované jméno (doméno) | fit.cvut.cz |
| O | Organization | ČVUT v Praze |
| OU | Organizational Unit | ICT |
| L | Locality (město) | Praha 6 |
| ST | State/Province | Hlavní město Praha |
| C | Country (ISO kód) | CZ |
Formáty uložení certifikátů
- DER – binární formát (Distinguished Encoding Rules). Používá MS Outlook.
- PEM – Base64-kódovaný DER v ASCII. Preferovaný formát pro OpenSSL, Apache, Nginx.
Certifikační autority (CA)
- Root CA – kořenová CA s self-signed certifikátem (nemá nadřazenou CA). Zabudovaná v OS/prohlížečích.
- Intermediate CA – prostřední CA v řetězci.
- Certificate chain – server posílá svůj cert + chain certifikátů intermediátních CA.
Konfigurace SSL v Apache (klíčové direktivy)
SSLEngine on– zapnutí SSL pro VirtualHostSSLProtocol all -SSLv3 -TLSv1 -TLSv1.1– povolené verzeSSLCipherSuite– seznam povolených šiferSSLCertificateFile– soubor s certifikátem (PEM)SSLCertificateKeyFile– soubor s privátním klíčem (PEM)SSLCertificateChainFile– řetězec CA certifikátů
Klientské certifikáty
- Alternativa k heslu – klient prokazuje identitu certifikátem podepsaným důvěryhodnou CA.
SSLVerifyClient require– server vyžaduje certifikát od klienta.SSLCACertificateFile– CA, jejíž certifikáty klientů server akceptuje.
🌍 HTTP autentizace přes proxy a chunked encoding
HTTP Proxy autentizace
- Hlavička
Proxy-Authorization: Basic base64(user:pass) - Stejný mechanismus jako Basic autentizace – base64 kódování, nutno šifrovat přenos.
Chunked Transfer Encoding
- Vhodné pro: dynamicky generovaný obsah, streamování, přidávání trailerů.
- Každá HTTP/1.1 aplikace musí umět přijmout a dekódovat chunked encoding.
- Ukončení: blok s délkou
0+ prázdný řádek. - Proxy server může chunky spojit do jedné odpovědi.
HTTP/1.1 200 OK Transfer-Encoding: chunked 1a abcdefghijklmnopqrstuvwxyz 0
📋 Shrnutí okruhu 2
- HTTP je textový, bezestavový protokol aplikační vrstvy; funguje na principu požadavek–odpověď nad TCP.
- HTTP/1.1 přidalo: povinnou Host: hlavičku, persistent spojení, chunked encoding.
- Stavové kódy: 1xx info, 2xx úspěch, 3xx přesměrování, 4xx chyba klienta, 5xx chyba serveru.
- TLS zajišťuje šifrování přenosu (HTTPS); nutno ověřit certifikát serveru pro ochranu před MitM.
- PKI: certifikáty X.509, CA (Root/Intermediate), formáty DER/PEM; SNI pro HTTPS virtual hosting.
Kontrolní otázky a odpovědi
- Q: Proč je HTTP bezestavový a co z toho plyne?
A: Server nezpracovává každý požadavek v kontextu předchozích. Výhoda: jednoduchost a škálovatelnost. Nevýhoda: stav (přihlášení) musí spravovat aplikace přes cookies/sessions. - Q: Jaký je rozdíl mezi 401 a 403?
A: 401 Unauthorized = klient není autentizován (nemá přihlašovací údaje nebo jsou špatné). 403 Forbidden = klient je autentizován, ale nemá oprávnění k danému zdroji. - Q: Co je chunked encoding a k čemu slouží?
A: Způsob přenosu dat, kde server odesílá data po blocích s hexadecimální délkou každého bloku, bez nutnosti znát celkovou velikost předem. Vhodné pro dynamicky generovaný obsah. - Q: Jak TLS chrání před Man-in-the-Middle útokem?
A: Klient ověřuje certifikát serveru vůči důvěryhodným CA, kontroluje platnost a shodu CN/SAN s DNS jménem. Pokud útočník podstrčí jiný certifikát, klient ho odmítne (není podepsán důvěryhodnou CA). - Q: Proč je Basic autentizace nebezpečná bez HTTPS?
A: Přihlašovací údaje jsou kódovány base64 (reversibilní, ne šifrování). Kdokoli zachytí paket, snadno dekóduje heslo. Řešení: vždy HTTPS.
Zpracování požadavků, poskytování zdrojů, statický a dynamický obsah, paralelní zpracování
Jak webový server zpracovává požadavky, mapování URL na filesystem, statický vs. dynamický obsah (CGI, SSI), přesměrování, rewrite a proxy.
🔄 Životní cyklus zpracování požadavku
Každý příchozí HTTP požadavek prochází v Apache těmito fázemi (v pořadí):
- Překlad URI → jméno souboru (WS → FS mapování) – Apache zjistí, který soubor na filesystému odpovídá URL. Ovlivňuje ho DocumentRoot, Alias, ScriptAlias, RewriteRule.
- Kontrola přístupu – autentizace (kdo jsi?) + autorizace (smíš to?). Kontrola IP adres. Pokud selže → 401 nebo 403.
- Zjištění MIME typu – podle přípony souboru (mod_mime) nebo obsahu (mod_mime_magic).
- Fixups – doplňkové operace (co se nestihlo dříve).
- Generování odpovědi (handler) – buď přímé odeslání souboru (statický obsah), nebo spuštění CGI/SSI/filtru (dynamický).
- Zalogování – zápis záznamu do access logu.
DocumentRoot /var/www/html→ URL/mapuje na/var/www/html/Alias /manual /usr/share/doc/apache2/manual→ URL/manual/mapuje jinam na FSScriptAlias /cgi-bin/ /var/www/cgi-bin/→ jako Alias, ale obsah se spouští jako CGI
📄 Statický obsah
Apache pro statický obsah:
- Nalezne soubor na FS podle DocumentRoot/Alias.
- Zjistí MIME typ (mod_mime – podle přípony; mod_mime_magic – podle obsahu).
- Nastaví hlavičky (
Content-Type,Content-Length,Last-Modified,ETag). - Odešle obsah souboru jako tělo odpovědi.
Výchozí stránka adresáře
DirectoryIndex index.html index.htm index.php– hledá tyto soubory v adresáři.Options +Indexes– pokud index neexistuje, vygeneruje seznam obsahu adresáře (mod_autoindex). Nebezpečné ponechat na produkci!
MIME typy – konfigurace
TypesConfig /etc/mime.types– globální databáze přípon→MIMEAddType image/gif .gif– přidání vazbyForceType text/plain– vynucení MIME pro adresářDefaultType– od Apache 2.4 ignorováno- Změna MIME typu nezmění
Last-Modified– je třebatouchsouboru pro reload cache.
⚡ Dynamický obsah – CGI
Jak CGI funguje
- Klient požádá o URL, která je mapována na CGI skript (ScriptAlias nebo handler).
- Server spustí skript jako nový proces.
- Data od klienta (GET parametry, POST tělo) jsou předána přes proměnné prostředí a stdin.
- Skript vygeneruje HTTP hlavičky + prázdný řádek + tělo a vypíše na stdout.
- Server přepošle výstup klientovi.
Klíčové proměnné prostředí CGI
| Proměnná | Obsah |
|---|---|
REQUEST_METHOD | GET, POST, PUT, … |
QUERY_STRING | Část URL za ? (u GET) |
CONTENT_LENGTH | Délka stdin v bajtech (POST) |
CONTENT_TYPE | MIME typ těla požadavku |
SCRIPT_FILENAME | Cesta ke skriptu na FS |
SERVER_NAME | Jméno serveru |
REMOTE_ADDR | IP klienta |
HTTP_* | HTTP hlavičky (HTTP_HOST, HTTP_USER_AGENT, …) |
mod_cgi vs mod_cgid
mod_cgi– procesové zpracování (prefork MPM). Interní mechanismus fork.mod_cgid– vláknové zpracování (worker/event MPM). Používá externího daemona přes socket (ScriptSock) pro fork nových procesů – replikace procesů s vlákny je nákladná.
- Zobrazuje se zdrojový kód → chybná konfigurace handleru/ScriptAlias.
- Chyba 403 Forbidden → nedostatečná práva na spuštění skriptu (chmod +x).
- Chyba 500 Internal Server Error + "Premature end of script headers" → skript negeneruje správnou HTTP hlavičku oddělenou prázdným řádkem.
🔀 Dynamický obsah – SSI (Server Side Includes)
Principy SSI
- Server prochází HTML soubor a hledá SSI direktivy ve formátu
<!--#element attr=value -->. - Mezi
<!--a#elementnesmí být mezera! - Zpracovává výstupní filtr
INCLUDES(modulmod_include).
Klíčové SSI elementy
<!--#include file="header.html" -->– vložení souboru<!--#include virtual="/cgi-bin/script.cgi" -->– vložení výstupu URL<!--#echo var="LAST_MODIFIED" -->– výpis proměnné<!--#exec cmd="/bin/date" -->– spuštění příkazu (vyžaduje Options +Includes, ne jen IncludesNoExec)<!--#config timefmt="%D" -->– nastavení formátu<!--#if expr --> ... <!--#endif -->– podmíněný obsah
Povolení SSI v konfiguraci
Options +IncludesNoExec– SSI bez spouštění příkazůOptions +Includes– SSI včetně exec- Typicky s příponou .shtml:
AddType text/html .shtml+AddOutputFilter INCLUDES .shtml
↩️ Přesměrování a přepisování URL
Přepisování (Rewrite) = server interně přepíše URL (nebo přesměruje), aniž by klient musel vědět.
mod_alias – jednoduché přesměrování
Redirect [status] /stara-url http://nova-urlRedirectMatch (.*)\.htm$ http://example.com$1.html– s regulárním výrazem- Stavové kódy: permanent (301), temp (302), seeother (303), gone (410)
- Výchozí: 302 (dočasné)
- Direktivy Redirect mají přednost před Alias a ScriptAlias.
mod_rewrite – podmíněné přepisování
- Libovolný počet pravidel a podmínek; řetězení pravidel.
- Přepisování: interní (URL → FS) nebo vnější (URL → URL).
- Pravidla se nedědí do podsekcí – nutno explicitně povolit.
RewriteEngine On
# Podmínka: spojení není HTTPS
RewriteCond %{HTTPS} !=on
# Pravidlo: přesměrovat /secure/* na HTTPS
RewriteRule ^/?secure/(.*) https://%{SERVER_NAME}/secure/$1 [R,L]
Přepisovací příznaky (flags)
[R]/[R=301]– vnější přesměrování (redirect)[L]– poslední pravidlo (dál nezpracovávat)[NC]– case-insensitive porovnání[P]– přes proxy (implikuje [L])[F]– vrátí 403 Forbidden[C]– zřetězení s dalším pravidlem[QSA]– připojí původní query string
🔁 Proxy server v Apache
Forward proxy
- Klient posílá požadavky proxy serveru, ten je přeposílá dál.
- Použití: přístup z lokální sítě, anonymizace, filtrování, caching.
- Konfigurace:
ProxyRequests On, zabezpečení<Proxy *> Require ip … </Proxy> - Pozor: otevřený proxy server je bezpečnostní riziko!
Reverse proxy
- Klient si myslí, že komunikuje přímo se serverem, ale proxy přeposílá požadavky na backend.
- Použití: load balancing, SSL offloading, cache, skrytí backendů.
ProxyPass /app http://backend.local:8080/– mapování URL na backendProxyPassReverse /app http://backend.local:8080/– oprava Location hlaviček v odpovědích- Pozor: ProxyPassReverse mění pouze hlavičky (Location, URI), ne obsah HTML stránek.
Load Balancing (mod_proxy_balancer)
- Rozložení zátěže mezi více backendových serverů.
- Algoritmy: byrequests (počet požadavků), bytraffic (objem dat), bybusyness (počet čekajících).
- Podpora sticky sessions (přiřazení klienta vždy ke stejnému backend).
<Proxy balancer://mycluster> BalancerMember http://web1.local loadfactor=1 BalancerMember http://web2.local loadfactor=2 ProxySet lbmethod=bytraffic </Proxy> ProxyPass / balancer://mycluster/
🚦 Paralelní zpracování požadavků – principy
Webový server musí obsluhovat mnoho klientů souběžně. Apache to řeší volbou MPM:
Prefork – izolace procesů
- Master proces dopředu fork-uje spare workers (zásobník čekajících procesů).
- Každý příchozí požadavek obslouží jeden z připravených procesů.
- Počet procesů řízen direktivami:
StartServers,MinSpareServers,MaxSpareServers,MaxClients. - Výhoda: úplná izolace (chyba v jednom požadavku neovlivní ostatní).
Worker/Event – vlákna
- Procesy spravují vlákna; každé vlákno obsluhuje jeden požadavek.
- Výrazně nižší paměťová náročnost (vlákna sdílí paměť procesu).
- Event MPM navíc: separátní listener vlákno pro accept() a keep-alive správu.
- Konfigurace:
ThreadsPerChild,MaxRequestWorkers,MaxConnectionsPerChild.
Keep-alive spojení (HTTP/1.1) drží TCP spojení otevřené i po odpovědi. V modelu worker by vlákno čekalo nečinně na další požadavek po celou dobu keep-alive timeoutu. Event MPM předá keep-alive spojení dedikovanému listener vláknu a worker vlákno se uvolní pro jiný požadavek.
Caching (mod_cache)
- Ukládá odpovědi do paměti nebo na disk pro opakované požadavky.
mod_cache_disk– uložení na disk (CacheRoot,CacheEnable disk /).- Snižuje zátěž backendu, zkracuje dobu odpovědi.
- Respektuje HTTP cache hlavičky (Cache-Control, Expires, ETag, Last-Modified).
Dojednávání obsahu (Content Negotiation)
- Hlavičky:
Accept,Accept-Language,Accept-Encoding,Accept-Charset - Modul
mod_negotiation, metody: Multiviews (volba dle přípon) nebo Type-map (.var soubor) - Pokud žádná varianta nevyhovuje → 406 Not Acceptable
- Komprese:
mod_deflate,AddOutputFilterByType DEFLATE text/html text/plain
📊 Logování a monitoring
Error log
ErrorLog /var/log/apache2/error.logLogLevel error|warn|info|debug|trace1–8- Obsahuje i ladící výstup CGI skriptů (stderr).
Access log (mod_log_config)
LogFormat "%h %l %u %t \"%r\" %>s %b" common CustomLog /var/log/apache2/access.log common
| Direktiva | Význam |
|---|---|
%h | Remote hostname/IP |
%r | První řádek požadavku (metoda + URL + verze) |
%s | HTTP stavový kód |
%b | Velikost odpovědi v bytech (bez hlaviček) |
%t | Čas požadavku |
%u | Autentizovaný uživatel |
%T | Čas zpracování (sekundy) |
mod_status – monitoring serveru
- Zobrazuje: počet worker vláken (working/idle), statistiky, aktuálně obsluhované požadavky, uptime, CPU.
- URL:
/server-status,/server-status?refresh=5(autorefresh),/server-status?auto(strojový výstup) - Důležité: omezit přístup pouze z localhost/admin sítě!
📋 Shrnutí okruhu 3
- Požadavek prochází fázemi: URI→FS mapování → kontrola přístupu → MIME → fixups → handler → logování.
- Statický obsah: server odesílá soubor přímo; dynamický: CGI (fork nového procesu), SSI (direktivy v HTML), filtry.
- CGI = standardní rozhraní; data přes env. proměnné + stdin; výstup musí začít HTTP hlavičkou + prázdný řádek.
- Paralelní zpracování: prefork (procesy), worker/event (vlákna); event nejefektivnější pro keep-alive spojení.
- Proxy: forward (za klienta) vs reverse (před serverem); reverse proxy pro load balancing, SSL offloading, caching.
Kontrolní otázky a odpovědi
- Q: Jaký je rozdíl mezi statickým a dynamickým obsahem z pohledu webového serveru?
A: Statický obsah = server soubor pouze najde, přidá HTTP hlavičky a odešle. Dynamický obsah = server spustí program/skript (CGI) nebo zpracuje direktivy v souboru (SSI) a výsledek odešle. Dynamický je pomalejší, ale reaguje na data požadavku. - Q: Jak CGI předává data od klienta skriptu?
A: GET parametry přes env. proměnnou QUERY_STRING, POST data přes stdin (délka v CONTENT_LENGTH), HTTP hlavičky jako HTTP_* proměnné. Vstup je URL-encoded, skript musí dekódovat. - Q: Jaký je rozdíl mezi Redirect a RewriteRule?
A: Redirect (mod_alias) je jednoduché statické přesměrování klienta na novou URL. RewriteRule (mod_rewrite) umožňuje podmíněné a komplexní přepisy s regulárními výrazy, podmínkami, zachyceními skupin; může přepisovat interně (URL→soubor) nebo externě (redirect). - Q: Proč je event MPM lepší než worker pro keep-alive spojení?
A: Worker vlákno drží keep-alive spojení nečinně po celou dobu timeoutu. Event MPM předá otevřené spojení listener vláknu, worker se uvolní pro jiný požadavek – server tak obslouží více klientů se stejným počtem vláken. - Q: Co je reverse proxy a k čemu se používá?
A: Proxy server přijímající požadavky místo backendu. Klient neví o existenci backendů. Použití: load balancing (distribuce zátěže), SSL offloading (dekóduje HTTPS před backendami), caching (snižuje zátěž backendu), zabezpečení (backend schován za proxy).