# CGI és FastCGI: az alapok

> CGI és FastCGI PHP-val: folyamat kérésenként vagy tartós workerek, a php-cgi és a PHP-FPM szerepe, a cgi-beállítások és a biztonsági szabályok.

Forrás: https://phpsos.de/hu/php/cgi-und-fastcgi/  
Állapot: 2026. 10. 25.  
Szolgáltató: PHP SOS, PHP-vészhelyzeti segítség és szerverbiztonság. Azonnali segítség WhatsAppon: https://wa.me/491736494914?text=%C3%9Cdv%C3%B6zl%C3%B6m%2C%20PHP%20SOS%21%20Seg%C3%ADts%C3%A9gre%20van%20sz%C3%BCks%C3%A9g%C3%BCnk%20a%20PHP-szerver%C3%BCnkkel.%20C%C3%A9g%3A%20%E2%80%A6%20Weboldal%3A%20%E2%80%A6

**Röviden:** A CGI (Common Gateway Interface) egy régi felület, amelynél a webszerver minden kéréshez új programot indít, a PHP esetében a `php-cgi` programot. A FastCGI a továbbfejlesztése: a PHP-folyamatok tartósan futnak, és sok kérést fogadnak egy socketen keresztül. A PHP-FPM a PHP legfontosabb FastCGI-megvalósítása. Biztonság szempontjából főként a `cgi.*` beállítások számítanak, és az a szabály, hogy egy FastCGI-hozzáférés soha nem lehet nyilvánosan elérhető.

## Mi a CGI?

A CGI az egyik legrégebbi módszer, amellyel a webszerverek dinamikus tartalmat állítanak elő. A PHP-kézikönyv a `cgi.rfc2616_headers` beállításnál az RFC 3875-re utal, a Common Gateway Interface specifikációjára. A PHP kezdetei is CGI-programok voltak: Rasmus Lerdorf 1994-ben az első „Personal Home Page Tools” eszközöket C nyelvű CGI-bináris fájlokként írta meg.

Az elv: minden kéréshez a webszerver új folyamatot indít, a kérés adatait környezeti változókon és a standard bemeneten adja át, és a választ a standard kimenetről olvassa. Utána a folyamat véget ér. A PHP-kézikönyv szerint a PHP CGI és CLI esetén minden híváskor újra beolvassa a php.ini-jét, szervermodulok esetén csak induláskor.

Ez robusztussá teszi a CGI-t, mert minden kérés friss folyamattal kezdődik. Lassúvá is teszi: a folyamat indítása, a konfiguráció betöltése és a bővítmények inicializálása minden kérésnél időt vesz igénybe.

## Mi a FastCGI?

A FastCGI a teljesítményproblémát úgy oldja meg, hogy a folyamatok életben maradnak. A webszerver Unix-socketen vagy TCP-porton keresztül csatlakozik egy futó folyamathoz, és a FastCGI protokollban elküldi neki a kérést. A folyamat feldolgozza, és várja a következőt.

| Jellemző | CGI | FastCGI php-cgi-vel | FastCGI PHP-FPM-mel |
|---|---|---|---|
| Folyamat kérésenként | igen | nem | nem |
| SAPI-név | `cgi-fcgi` | `cgi-fcgi` | `fpm-fcgi` |
| Poolok saját felhasználóval | nem | nem | igen |
| Folyamatvezérlés | webszerver | webszerver-modul, pl. mod_fcgid | saját master folyamat |
| A `.user.ini` olvasása | igen | igen | igen |

A PHP-FPM a kézikönyv szerint a PHP elsődleges FastCGI-megvalósítása. A protokollt folyamatkezeléssel, poolokkal, állapotoldalakkal és slowloggal egészíti ki. A részleteket a [PHP-FPM elmagyarázva](https://phpsos.de/hu/php/php-fpm-erklaert/) oldal tartalmazza.

## A cgi-beállítások a php.ini-ben

CGI-üzemhez a PHP saját beállításokat ismer. A következő értékek és leírások a PHP-kézikönyvből származnak:

1. **`cgi.force_redirect`** (alapérték 1, `INI_SYSTEM`): a kézikönyv szerint szükséges ahhoz, hogy a PHP-t CGI-ként a legtöbb webszerver alatt biztonságosan lehessen üzemeltetni. Kikapcsolni csak „saját felelősségre”; IIS alatt ki kell kapcsolni.
2. **`cgi.fix_pathinfo`** (alapérték 1, `INI_SYSTEM`): gondoskodik a helyes `PATH_INFO` és `PATH_TRANSLATED` értékekről. A szkripteknek a `PATH_TRANSLATED` helyett a `SCRIPT_FILENAME` értéket kell használniuk.
3. **`cgi.discard_path`** (alapérték 0, `INI_SYSTEM`): lehetővé teszi, hogy a CGI-bináris fájlt biztonságosan a webkönyvtáron kívül helyezzék el úgy, hogy a `.htaccess`-védelem ne kerülhető meg.
4. **`fastcgi.impersonate`** (alapérték 0, `INI_SYSTEM`): csak Windows alatt, IIS esetén releváns.
5. **`user_ini.filename`** és **`user_ini.cache_ttl`** (alapérték `.user.ini` és 300 másodperc): azt szabályozzák, hogy a PHP olvassa-e a `.user.ini` fájlokat, és milyen gyakran.

Nginx esetén ide tartozik a szkript útvonalának tiszta átadása. Egy olvasható alapminta, nem minden környezetre szóló garanciával:

```nginx
location ~ \.php$ {
    try_files $uri =404;               # csak létező fájlokat adjon át a PHP-nek
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
```

A `try_files $uri =404;` sor megakadályozza, hogy a nem létező `.php` útvonalakra érkező kéréseket továbbadják a PHP-nek.

## Miért veszélyes egy nyitott FastCGI-hozzáférés

A PHP-kézikönyv kifejezetten figyelmeztet: aki meg tud nyitni egy FastCGI-kapcsolatot a PHP-hoz, az irányítja a kérés konfigurációját, például az `auto_prepend_file` beállítást, és ezzel tetszőleges kódot hajthat végre. Az ok az, hogy a webszerverek a PHP-beállításokat FastCGI-paraméterekkel, például a `PHP_VALUE` és a `PHP_ADMIN_VALUE` útján is elküldhetik.

Ebből egyértelmű szabályok következnek:

- A PHP-FPM-et vagy a FastCGI módú php-cgi-t csak Unix-socketen keresztül kell csatlakoztatni, ha a webszerver ugyanazon a gépen fut.
- TCP esetén be kell állítani a `listen.allowed_clients` értékét, és a portot le kell tiltani a tűzfalban; ehhez útmutatás a [Tűzfal webszerverekhez](https://phpsos.de/hu/blog/firewall-fuer-webserver/) cikkben található.
- A socket jogait a `listen.owner`, `listen.group` és `listen.mode` beállításokkal szűken kell tartani.

> **Fontos:**
> Az `ss -lntp | grep -i php` paranccsal ellenőrizze, hogy egy PHP-folyamat figyel-e TCP-címen. A `0.0.0.0`-hoz vagy nyilvános címhez való kötés sürgős cselekvést igénylő eset.

## CGI, FastCGI és PHP2Shell

A PHP2Shell a php-cgi-t és a PHP-FPM-et egyaránt érinti. Mindkettőre érvényes: frissítés a 8.5.12, 8.4.27, 8.3.36 vagy 8.2.35 verzióra, illetve egy megerősített backportra, majd az összes futó PHP-folyamat leállítása és újraindítása. A php-cgi-t használó FastCGI-beállításoknál a folyamatok gyakran észrevétlenül tovább futnak, mert nincs önálló szolgáltatás, amely kezelné őket. Hogyan találhatja meg és válthatja le ezt az örökölt terhet, azt a [php-cgi: örökölt teher kockázattal](https://phpsos.de/hu/server/php-cgi/) oldal írja le. A Pleskben a változatok más néven szerepelnek; segít a [Plesk: a PHP-kezelők megértése](https://phpsos.de/hu/blog/plesk-php-handler/).

## Hogyan segít konkrétan a PHP SOS?

- **Kezelők felmérése:** Megállapítjuk, hogy a weboldalai CGI-n, php-cgi-vel működő FastCGI-n vagy PHP-FPM-en futnak-e.
- **Hozzáférések lezárása:** Ellenőrizzük a socketeket, a portokat és a tűzfalszabályokat, hogy semmilyen FastCGI-hozzáférés ne legyen kívülről elérhető.
- **Javítás és takarítás:** Frissítjük a PHP-t, és leállítjuk az összes régi folyamatot, az elárvult php-cgi példányokat is.
- **Leváltás:** A [szerver-megerősítés](https://phpsos.de/hu/leistungen/server-haertung/) keretében a CGI-örökségeket PHP-FPM-mel váltjuk le, saját poolokkal.


## Gyakori kérdések

**A FastCGI ugyanaz, mint a PHP-FPM?**  
Nem. A FastCGI egy protokoll, amelyen a webszerver egy alkalmazásfolyamattal beszél. A PHP-FPM egy program, amely ezt a protokollt valósítja meg a PHP-hoz, és kezeli a folyamatokat. A php-cgi is tud FastCGI-t beszélni, de poolokat nem kínál.

**Miért számít a tiszta CGI elavultnak?**  
CGI esetén a webszerver minden kéréshez új folyamatot indít, és a PHP minden alkalommal újra beolvassa a konfigurációját. Ez időt és erőforrást emészt. A FastCGI és a PHP-FPM tartósan készenlétben tartja a folyamatokat, ezért jóval hatékonyabbak.

**Mi az a .user.ini?**  
A .user.ini egy kis konfigurációs fájl egy webkönyvtárban. A PHP-kézikönyv szerint csak a CGI és a FastCGI SAPI-k olvassák, tehát a PHP-FPM is. Csak INI_PERDIR, INI_USER vagy INI_ALL módú beállításokat tartalmazhat.

**Honnan tudom, hogy a szerveremen php-cgi fut?**  
Olvasó parancsokkal, például a ps-sel vagy a pgrep-pel keressen php-cgi nevű folyamatokat, és nézze meg a webszerver-konfigurációban az olyan bejegyzéseket, mint a mod_fcgid, az Action vagy a ScriptAlias php-cgi-vel. A tárhelyvezérlő paneleken az üzemmód neve gyakran CGI vagy FastCGI-alkalmazás.

## Források

- [PHP-kézikönyv: Alapbeállítások (cgi.*)](https://www.php.net/manual/en/ini.core.php)
- [PHP-kézikönyv: .user.ini fájlok](https://www.php.net/manual/en/configuration.file.per-user.php)
- [PHP-kézikönyv: az FPM konfigurációja](https://www.php.net/manual/en/install.fpm.configuration.php)
- [Nginx-dokumentáció](https://nginx.org/en/docs/)
