# CGI i FastCGI: osnove

> CGI i FastCGI s PHP-om objašnjeni: proces po zahtjevu ili trajni workeri, uloga php-cgi i PHP-FPM, cgi postavke i sigurnosna pravila.

Izvor: https://phpsos.de/hr/php/cgi-und-fastcgi/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** CGI (Common Gateway Interface) staro je sučelje kod kojeg web-poslužitelj za svaki zahtjev pokreće novi program, kod PHP-a program `php-cgi`. FastCGI je daljnji razvoj: PHP procesi rade trajno i putem socketa primaju mnogo zahtjeva. PHP-FPM najvažnija je FastCGI izvedba za PHP. Sigurnosno su važne ponajprije postavke `cgi.*` i pravilo da FastCGI pristup nikad ne smije biti javno dostupan.

## Što je CGI?

CGI je jedna od najstarijih metoda kojom web-poslužitelji stvaraju dinamične sadržaje. PHP priručnik kod postavke `cgi.rfc2616_headers` upućuje na RFC 3875, specifikaciju Common Gateway Interfacea. I počeci PHP-a bili su CGI programi: Rasmus Lerdorf 1994. napisao je prve „Personal Home Page Tools“ kao CGI binarne datoteke u jeziku C.

Načelo: za svaki zahtjev web-poslužitelj pokreće novi proces, podatke zahtjeva predaje putem varijabli okoline i standardnog ulaza, a odgovor čita sa standardnog izlaza. Nakon toga proces završava. Prema PHP priručniku PHP kod CGI-ja i CLI-ja svoj php.ini pri svakom pozivu čita iznova, a kod modula poslužitelja samo pri pokretanju.

To CGI čini robusnim jer svaki zahtjev počinje sa svježim procesom. Ali ga čini i sporim: pokretanje procesa, učitavanje konfiguracije i inicijalizacija ekstenzija troše vrijeme pri svakom zahtjevu.

## Što je FastCGI?

FastCGI rješava problem učinkovitosti tako što procesi ostaju na životu. Web-poslužitelj se putem Unix socketa ili TCP porta povezuje s pokrenutim procesom i šalje mu zahtjev u FastCGI protokolu. Proces ga obrađuje i čeka sljedeći.

| Obilježje | CGI | FastCGI s php-cgi | FastCGI s PHP-FPM |
|---|---|---|---|
| Proces po zahtjevu | da | ne | ne |
| Naziv SAPI-ja | `cgi-fcgi` | `cgi-fcgi` | `fpm-fcgi` |
| Poolovi s vlastitim korisnikom | ne | ne | da |
| Upravljanje procesima | web-poslužitelj | modul web-poslužitelja, npr. mod_fcgid | vlastiti master proces |
| `.user.ini` se čita | da | da | da |

PHP-FPM je prema priručniku primarna FastCGI implementacija PHP-a. Protokol nadopunjuje upravljanjem procesima, poolovima, stranicama statusa i slowlogom. Pojedinosti su u članku [PHP-FPM objašnjen](https://phpsos.de/hr/php/php-fpm-erklaert/).

## cgi postavke u php.ini

Za CGI rad PHP poznaje vlastite postavke. Sljedeće vrijednosti i opisi potječu iz PHP priručnika:

1. **`cgi.force_redirect`** (zadano 1, `INI_SYSTEM`): prema priručniku potrebno za siguran rad PHP-a kao CGI-ja pod većinom web-poslužitelja. Isključiti samo „na vlastiti rizik“; pod IIS-om mora biti isključeno.
2. **`cgi.fix_pathinfo`** (zadano 1, `INI_SYSTEM`): osigurava ispravne vrijednosti `PATH_INFO` i `PATH_TRANSLATED`. Skripte trebaju koristiti `SCRIPT_FILENAME` umjesto `PATH_TRANSLATED`.
3. **`cgi.discard_path`** (zadano 0, `INI_SYSTEM`): omogućuje da se CGI binarna datoteka sigurno pohrani izvan web-direktorija, bez mogućnosti zaobilaženja zaštite putem `.htaccess`.
4. **`fastcgi.impersonate`** (zadano 0, `INI_SYSTEM`): važno samo za IIS pod Windowsom.
5. **`user_ini.filename`** i **`user_ini.cache_ttl`** (zadano `.user.ini` i 300 sekundi): određuju čita li PHP datoteke `.user.ini` i koliko često.

Kod Nginxa tome pripada uredno prosljeđivanje putanje skripte. Čitljiv osnovni uzorak, bez jamstva za svako okruženje:

```nginx
location ~ \.php$ {
    try_files $uri =404;               # PHP-u predavati samo postojeće datoteke
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
```

Redak `try_files $uri =404;` sprječava da se zahtjevi za nepostojećim `.php` putanjama prosljeđuju PHP-u.

## Zašto je otvoren FastCGI pristup opasan

PHP priručnik izričito upozorava: tko može otvoriti FastCGI vezu prema PHP-u, kontrolira konfiguraciju zahtjeva, na primjer `auto_prepend_file`, i time može izvršiti proizvoljan kod. Razlog je što web-poslužitelji putem FastCGI parametara poput `PHP_VALUE` i `PHP_ADMIN_VALUE` smiju slati i PHP postavke.

Iz toga slijede jasna pravila:

- PHP-FPM ili php-cgi u FastCGI načinu povezivati samo putem Unix socketa ako web-poslužitelj radi na istom hostu.
- Kod TCP-a postaviti `listen.allowed_clients` i port blokirati vatrozidom; napomene u članku [Vatrozid za web-poslužitelje](https://phpsos.de/hr/blog/firewall-fuer-webserver/).
- Prava socketa držati uskima putem `listen.owner`, `listen.group` i `listen.mode`.

> **Važno:**
> Pomoću `ss -lntp | grep -i php` provjerite sluša li neki PHP proces na TCP adresi. Vezanje na `0.0.0.0` ili javnu adresu hitan je slučaj za djelovanje.

## CGI, FastCGI i PHP2Shell

PHP2Shellom su pogođeni i php-cgi i PHP-FPM. Za oba vrijedi: ažuriranje na 8.5.12, 8.4.27, 8.3.36 ili 8.2.35 odnosno potvrđeni backport, zatim završiti i ponovno pokrenuti sve pokrenute PHP procese. Kod FastCGI postavki s php-cgi procesi često neprimijećeno nastavljaju raditi jer ih ne vodi nijedna zasebna usluga. Kako pronaći i ukloniti to naslijeđe, piše na stranici [php-cgi: naslijeđe s rizikom](https://phpsos.de/hr/server/php-cgi/). U Pleskovima se izvedbe zovu drukčije; pomoć nudi članak [Plesk: razumjeti PHP rukovatelje](https://phpsos.de/hr/blog/plesk-php-handler/).

## Kako PHP SOS konkretno pomaže?

- **Evidentirati rukovatelje:** Utvrđujemo rade li Vaše web-stranice putem CGI-ja, FastCGI-ja s php-cgi ili PHP-FPM-a.
- **Zatvoriti pristupe:** Provjeravamo socketove, portove i pravila vatrozida kako nijedan FastCGI pristup ne bi bio dostupan izvana.
- **Zakrpati i pospremiti:** Ažuriramo PHP i završavamo sve stare procese, uključujući zaostale php-cgi instance.
- **Ukloniti:** U okviru [ojačavanja poslužitelja](https://phpsos.de/hr/leistungen/server-haertung/) CGI naslijeđe zamjenjujemo PHP-FPM-om s vlastitim poolovima.


## Česta pitanja

**Je li FastCGI isto što i PHP-FPM?**  
Ne. FastCGI je protokol putem kojeg web-poslužitelj razgovara s procesom aplikacije. PHP-FPM je program koji taj protokol provodi za PHP i upravlja procesima. I php-cgi može govoriti FastCGI, ali ne nudi poolove.

**Zašto se čisti CGI smatra zastarjelim?**  
Kod CGI-ja web-poslužitelj za svaki zahtjev pokreće novi proces, a PHP pritom svaki put čita svoju konfiguraciju. To košta vrijeme i resurse. FastCGI i PHP-FPM trajno drže procese spremnima i zato su znatno učinkovitiji.

**Što je .user.ini?**  
Datoteka .user.ini mala je konfiguracijska datoteka u web-direktoriju. Prema PHP priručniku čitaju je samo CGI i FastCGI SAPI-ji, dakle i PHP-FPM. Smije sadržavati samo postavke s načinima INI_PERDIR, INI_USER ili INI_ALL.

**Kako prepoznati radi li na mom poslužitelju php-cgi?**  
Naredbama samo za čitanje poput ps ili pgrep tražite procese naziva php-cgi i u konfiguraciji web-poslužitelja pogledajte unose poput mod_fcgid, Action ili ScriptAlias s php-cgi. U hosting panelima način rada često se zove CGI ili FastCGI aplikacija.

## Izvori

- [PHP priručnik: Osnovne postavke (cgi.*)](https://www.php.net/manual/en/ini.core.php)
- [PHP priručnik: Datoteke .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
- [PHP priručnik: FPM konfiguracija](https://www.php.net/manual/en/install.fpm.configuration.php)
- [Nginx dokumentacija](https://nginx.org/en/docs/)
