====== 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é ===== * [[PHP-FPM]] * [[Nginx]] * [[CGI]] * [[Web server]] * [[uWSGI]] ===== Externí zdroje ===== * Oficiální specifikace FastCGI: [[https://fastcgi-archives.github.io/|FastCGI Specification]] * Nginx FastCGI dokumentace: [[https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html|Nginx FastCGI Module]] * PHP a FastCGI: [[https://www.php.net/manual/en/security.cgi-bin.php|PHP.net: CGI and FastCGI]] ---- *Poslední aktualizace: 2026-01-05*