Obsah
FastCGI
FastCGI (Fast Common Gateway Interface) je protokol a rozhraní pro komunikaci mezi webovým serverem (např. Nginx, Apache) a externími aplikacemi (např. PHP, Python, Perl). Je to vylepšená a výkonnější náhrada za původní CGI (Common Gateway Interface).
Na rozdíl od CGI, kde se pro každý požadavek spouští nový proces aplikace, FastCGI udržuje procesy v běhu, což výrazně snižuje režii a zvyšuje výkon – zejména u dynamických webových aplikací.
Proč FastCGI?
- Výkonnost: Procesy aplikací běží trvale, nejsou spouštěny pro každý požadavek.
- Oddělení zodpovědností: Webový server řeší statický obsah a HTTP komunikaci, aplikace řeší logiku.
- Škálovatelnost: Aplikace mohou běžet na jiném serveru (distribuované prostředí).
- Bezpečnost: Možnost spouštět aplikace pod různými uživateli a v izolovaných prostředích.
Jak to funguje?
1. Webový server (např. Nginx) obdrží požadavek na dynamický obsah (např. `.php` soubor). 2. Namísto spuštění skriptu přímo server předá požadavek FastCGI procesu (např. PHP-FPM). 3. FastCGI proces zpracuje požadavek a vrátí výsledek zpět webovému serveru. 4. Webový server odešle odpověď klientovi.
Komunikace probíhá buď:
- přes Unix socket (např. `/run/php/php8.3-fpm.sock`) – rychlejší, lokální
- nebo přes TCP socket (např. `127.0.0.1:9000`) – vhodné pro vzdálené servery
FastCGI vs CGI
| Vlastnost | CGI | FastCGI |
|---|---|---|
| Procesy | Nový proces pro každý požadavek | Trvalé procesy (fond) |
| Výkon | Nízký (vysoká režie) | Vysoký |
| Použití dnes | Téměř zastaralé | Standard pro moderní servery |
| Příklad použití | Staré CGI skripty | PHP-FPM, uWSGI, Gunicorn |
FastCGI a PHP
PHP nejčastěji běží jako FastCGI proces přes PHP-FPM (PHP FastCGI Process Manager):
- PHP-FPM spravuje fond pracovních procesů.
- Každý proces zpracovává požadavky přes FastCGI protokol.
- Nginx (nebo jiný web server) komunikuje s PHP-FPM pomocí FastCGI direktiv.
Konfigurace v Nginx
Příklad předání PHP požadavku FastCGI procesu (PHP-FPM):
location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/run/php/php8.3-fpm.sock; fastcgi_index index.php; }
Důležité direktivy:
- `fastcgi_pass` – cíl FastCGI procesu (socket nebo IP:port)
- `fastcgi_param` – předání proměnných prostředí (např. `SCRIPT_FILENAME`)
- `include fastcgi_params` – načtení standardních FastCGI parametrů
FastCGI parametry (důležité proměnné)
| Proměnná | Popis |
| ————————– | ——- |
| `SCRIPT_FILENAME` | Absolutní cesta ke skriptu na disku (nejdůležitější!) |
| `QUERY_STRING` | Část URL za `?` |
| `REQUEST_METHOD` | HTTP metoda (`GET`, `POST`, atd.) |
| `CONTENT_TYPE` | MIME typ těla požadavku |
| `HTTP_HOST` | Hodnota hlavičky `Host` |
| `REMOTE_ADDR` | IP adresa klienta |
Bez správného nastavení `SCRIPT_FILENAME` bude PHP vracet chybu nebo prázdnou odpověď.
Další FastCGI implementace
FastCGI není jen pro PHP. Používá se i pro:
- Python: pomocí adaptéru jako `flup` nebo spuštění přes `uWSGI` v FastCGI módu
- Perl: `FCGI` modul
- Ruby: `fcgi` gem
- Go: knihovny jako `net/http/fcgi`
I když v současnosti jsou populárnější jiné protokoly (např. HTTP pro mikroslužby, WSGI pro Python), FastCGI stále dominuje v PHP ekosystému.
Běžné chyby
- 502 Bad Gateway – webový server nemůže kontaktovat FastCGI proces (není spuštěn, špatný socket).
- File not found – chybí `SCRIPT_FILENAME` nebo je nastaven špatně.
- Přístup zamítnut k socketu – nesoulad v uživatelích mezi webovým serverem a FastCGI procesem.
Bezpečnostní doporučení
- Spouštěj FastCGI procesy pod neprivilegovanými uživateli.
- Používej Unix sockety místo TCP, pokud je aplikace lokální.
- Omez přístup k `.fcgi` nebo `.php` souborům v konfiguraci serveru.
- Nepovoluj `PATH_INFO` v neověřených aplikacích (riziko RCE v některých frameworkách).
Viz také
Externí zdroje
- Oficiální specifikace FastCGI: FastCGI Specification
- Nginx FastCGI dokumentace: Nginx FastCGI Module
- PHP a FastCGI: PHP.net: CGI and FastCGI
*Poslední aktualizace: 2026-01-05*
