# CGI a FastCGI: základy

> CGI a FastCGI s PHP vysvetlené: proces na požiadavku alebo trvalé workery, úloha php-cgi a PHP-FPM, nastavenia cgi a bezpečnostné pravidlá.

Zdroj: https://phpsos.de/sk/php/cgi-und-fastcgi/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručne:** CGI (Common Gateway Interface) je staré rozhranie, pri ktorom webový server pre každú požiadavku spúšťa nový program, pri PHP program `php-cgi`. FastCGI je jeho ďalší vývoj: procesy PHP bežia trvalo a prijímajú mnoho požiadaviek cez socket. PHP-FPM je najdôležitejšia implementácia FastCGI pre PHP. Z hľadiska bezpečnosti sú dôležité predovšetkým nastavenia `cgi.*` a pravidlo, že prístup FastCGI nesmie byť nikdy verejne dostupný.

## Čo je CGI?

CGI je jedna z najstarších metód, ktorými webové servery vytvárajú dynamický obsah. Príručka PHP pri nastavení `cgi.rfc2616_headers` odkazuje na RFC 3875, špecifikáciu Common Gateway Interface. Aj začiatky PHP boli programy CGI: Rasmus Lerdorf napísal v roku 1994 prvé „Personal Home Page Tools“ ako binárne súbory CGI v jazyku C.

Princíp: pre každú požiadavku spustí webový server nový proces, odovzdá údaje požiadavky cez premenné prostredia a štandardný vstup a odpoveď číta zo štandardného výstupu. Potom proces skončí. Podľa príručky PHP číta PHP pri CGI a CLI svoj php.ini pri každom volaní znova, pri serverových moduloch iba pri štarte.

To robí CGI robustným, pretože každá požiadavka začína s čerstvým procesom. Robí ho to však aj pomalým: spustenie procesu, načítanie konfigurácie a inicializácia rozšírení stoja pri každej požiadavke čas.

## Čo je FastCGI?

FastCGI rieši problém výkonu tým, že procesy zostávajú nažive. Webový server sa pripojí cez socket Unix alebo port TCP k bežiacemu procesu a pošle mu požiadavku v protokole FastCGI. Proces ju spracuje a čaká na ďalšiu.

| Vlastnosť | CGI | FastCGI s php-cgi | FastCGI s PHP-FPM |
|---|---|---|---|
| Proces na požiadavku | áno | nie | nie |
| Názov SAPI | `cgi-fcgi` | `cgi-fcgi` | `fpm-fcgi` |
| Pooly s vlastným používateľom | nie | nie | áno |
| Riadenie procesov | webový server | modul webového servera, napr. mod_fcgid | vlastný hlavný proces (master) |
| `.user.ini` sa číta | áno | áno | áno |

PHP-FPM je podľa príručky primárna implementácia FastCGI pre PHP. Dopĺňa protokol o správu procesov, pooly, stavové stránky a slowlog. Podrobnosti sú v časti [PHP-FPM vysvetlené](https://phpsos.de/sk/php/php-fpm-erklaert/).

## Nastavenia cgi v php.ini

Pre prevádzku CGI pozná PHP vlastné nastavenia. Nasledujúce hodnoty a opisy pochádzajú z príručky PHP:

1. **`cgi.force_redirect`** (štandard 1, `INI_SYSTEM`): podľa príručky nutné na bezpečnú prevádzku PHP ako CGI pod väčšinou webových serverov. Vypnúť len „na vlastné riziko“; pod IIS musí byť vypnuté.
2. **`cgi.fix_pathinfo`** (štandard 1, `INI_SYSTEM`): zabezpečuje správne hodnoty `PATH_INFO` a `PATH_TRANSLATED`. Skripty majú používať `SCRIPT_FILENAME` namiesto `PATH_TRANSLATED`.
3. **`cgi.discard_path`** (štandard 0, `INI_SYSTEM`): umožňuje uložiť binárny súbor CGI bezpečne mimo webového adresára bez toho, aby sa dala obísť ochrana `.htaccess`.
4. **`fastcgi.impersonate`** (štandard 0, `INI_SYSTEM`): relevantné len pre IIS vo Windows.
5. **`user_ini.filename`** a **`user_ini.cache_ttl`** (štandard `.user.ini` a 300 sekúnd): riadia, či a ako často PHP číta súbory `.user.ini`.

Pri Nginx k tomu patrí čisté odovzdanie cesty ku skriptu. Čitateľný základný vzor, bez záruky pre každé prostredie:

```nginx
location ~ \.php$ {
    try_files $uri =404;               # odovzdať PHP len existujúce súbory
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
```

Riadok `try_files $uri =404;` bráni tomu, aby sa požiadavky na neexistujúce cesty `.php` odovzdávali ďalej PHP.

## Prečo je otvorený prístup FastCGI nebezpečný

Príručka PHP výslovne varuje: kto môže otvoriť spojenie FastCGI s PHP, kontroluje konfiguráciu požiadavky, napríklad `auto_prepend_file`, a môže tak vykonať ľubovoľný kód. Dôvodom je, že webové servery smú posielať nastavenia PHP spolu s parametrami FastCGI ako `PHP_VALUE` a `PHP_ADMIN_VALUE`.

Z toho vyplývajú jasné pravidlá:

- PHP-FPM alebo php-cgi v režime FastCGI zapájať iba cez socket Unix, ak webový server beží na tom istom hostiteľovi.
- Pri TCP nastaviť `listen.allowed_clients` a port zablokovať vo firewalle; upozornenia k tomu sú v príspevku [Firewall pre webové servery](https://phpsos.de/sk/blog/firewall-fuer-webserver/).
- Práva socketu držať úzke pomocou `listen.owner`, `listen.group` a `listen.mode`.

> **Dôležité:**
> Pomocou `ss -lntp | grep -i php` skontrolujte, či proces PHP nepočúva na adrese TCP. Väzba na `0.0.0.0` alebo verejnú adresu je naliehavý prípad na konanie.

## CGI, FastCGI a PHP2Shell

PHP2Shell sa týka php-cgi aj PHP-FPM. Pre obe platí: aktualizácia na 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35, resp. potvrdený backport, potom ukončiť a znova spustiť všetky bežiace procesy PHP. Pri nastaveniach FastCGI s php-cgi často procesy nepozorovane bežia ďalej, pretože ich nespravuje žiadna samostatná služba. Ako túto záťaž z minulosti nájdete a nahradíte, je v časti [php-cgi: záťaž z minulosti s rizikom](https://phpsos.de/sk/server/php-cgi/). V Plesk sa varianty volajú inak; pomôže [Plesk: porozumieť obslužným programom PHP](https://phpsos.de/sk/blog/plesk-php-handler/).

## Ako konkrétne pomáha PHP SOS?

- **Zmapovať handlery:** Zisťujeme, či vaše weby bežia cez CGI, FastCGI s php-cgi alebo PHP-FPM.
- **Uzavrieť prístupy:** Kontrolujeme sockety, porty a pravidlá firewallu, aby nebol žiadny prístup FastCGI dostupný zvonka.
- **Záplatovať a upratať:** Aktualizujeme PHP a ukončíme všetky staré procesy, aj osirelé inštancie php-cgi.
- **Nahradiť:** V rámci [zabezpečenia servera (hardening)](https://phpsos.de/sk/leistungen/server-haertung/) nahrádzame pozostatky CGI za PHP-FPM s vlastnými poolmi.


## Časté otázky

**Je FastCGI to isté ako PHP-FPM?**  
Nie. FastCGI je protokol, cez ktorý webový server komunikuje s aplikačným procesom. PHP-FPM je program, ktorý tento protokol pre PHP implementuje a spravuje procesy. Aj php-cgi vie hovoriť FastCGI, ale neponúka pooly.

**Prečo sa čisté CGI považuje za zastarané?**  
Pri CGI spúšťa webový server pre každú požiadavku nový proces a PHP pritom zakaždým načítava svoju konfiguráciu. To stojí čas a zdroje. FastCGI a PHP-FPM držia procesy trvalo pripravené, a sú preto výrazne efektívnejšie.

**Čo je .user.ini?**  
Súbor .user.ini je malý konfiguračný súbor vo webovom adresári. Podľa príručky PHP ho čítajú len SAPI CGI a FastCGI, teda aj PHP-FPM. Smie obsahovať iba nastavenia s režimami INI_PERDIR, INI_USER alebo INI_ALL.

**Ako poznám, že na mojom serveri beží php-cgi?**  
Pomocou príkazov na čítanie, ako ps alebo pgrep, hľadajte procesy s názvom php-cgi a v konfigurácii webového servera hľadajte záznamy ako mod_fcgid, Action alebo ScriptAlias s php-cgi. V hostingových paneloch sa režim prevádzky často volá CGI alebo aplikácia FastCGI.

## Zdroje

- [Príručka PHP: Základné nastavenia (cgi.*)](https://www.php.net/manual/en/ini.core.php)
- [Príručka PHP: Súbory .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
- [Príručka PHP: Konfigurácia FPM](https://www.php.net/manual/en/install.fpm.configuration.php)
- [Dokumentácia Nginx](https://nginx.org/en/docs/)
