# CGI și FastCGI: bazele

> CGI și FastCGI cu PHP explicate: proces pentru fiecare cerere sau workeri permanenți, rolul php-cgi și PHP-FPM, setările cgi și regulile de securitate.

Sursa: https://phpsos.de/ro/php/cgi-und-fastcgi/  
Stadiu: 25.10.2026  
Furnizor: PHP SOS, Asistență de urgență PHP și securitatea serverelor. Ajutor imediat pe WhatsApp: https://wa.me/491736494914?text=Bun%C4%83%20ziua%2C%20PHP%20SOS%2C%20avem%20nevoie%20de%20ajutor%20cu%20serverul%20nostru%20PHP.%20Firma%3A%20%E2%80%A6%20Site%3A%20%E2%80%A6

**Pe scurt:** CGI (Common Gateway Interface) este o interfață veche, în care serverul web pornește un program nou pentru fiecare cerere, la PHP programul `php-cgi`. FastCGI este evoluția: procesele PHP rulează permanent și primesc multe cereri printr-un socket. PHP-FPM este cea mai importantă implementare FastCGI pentru PHP. Relevante pentru securitate sunt mai ales setările `cgi.*` și regula că un acces FastCGI nu trebuie să fie niciodată accesibil public.

## Ce este CGI?

CGI este una dintre cele mai vechi metode prin care serverele web generează conținut dinamic. Manualul PHP trimite, la setarea `cgi.rfc2616_headers`, la RFC 3875, specificația Common Gateway Interface. Și începuturile PHP au fost programe CGI: Rasmus Lerdorf a scris în 1994 primele „Personal Home Page Tools” ca fișiere binare CGI în C.

Principiul: pentru fiecare cerere, serverul web pornește un proces nou, transmite datele cererii prin variabile de mediu și intrarea standard și citește răspunsul din ieșirea standard. Apoi procesul se încheie. Potrivit manualului PHP, la CGI și CLI, PHP își citește php.ini din nou la fiecare apel, la modulele de server doar la pornire.

Asta face CGI robust, pentru că fiecare cerere începe cu un proces proaspăt. Dar îl face și lent: pornirea procesului, încărcarea configurației și inițializarea extensiilor costă timp la fiecare cerere.

## Ce este FastCGI?

FastCGI rezolvă problema de performanță ținând procesele în viață. Serverul web se conectează printr-un socket Unix sau un port TCP la un proces care rulează și îi trimite cererea în protocolul FastCGI. Procesul o prelucrează și așteaptă următoarea.

| Caracteristică | CGI | FastCGI cu php-cgi | FastCGI cu PHP-FPM |
|---|---|---|---|
| Proces pentru fiecare cerere | da | nu | nu |
| Nume SAPI | `cgi-fcgi` | `cgi-fcgi` | `fpm-fcgi` |
| Pool-uri cu utilizator propriu | nu | nu | da |
| Controlul proceselor | serverul web | modul al serverului web, de ex. mod_fcgid | proces master propriu |
| `.user.ini` este citit | da | da | da |

PHP-FPM este, potrivit manualului, implementarea FastCGI principală a PHP. Completează protocolul cu administrarea proceselor, pool-uri, pagini de stare și un slowlog. Detaliile se află la [PHP-FPM explicat](https://phpsos.de/ro/php/php-fpm-erklaert/).

## Setările cgi din php.ini

Pentru funcționarea CGI, PHP are setări proprii. Valorile și descrierile următoare provin din manualul PHP:

1. **`cgi.force_redirect`** (implicit 1, `INI_SYSTEM`): necesară, potrivit manualului, pentru a opera PHP ca CGI în siguranță sub majoritatea serverelor web. Dezactivați doar „pe propriul risc”; sub IIS trebuie să fie oprită.
2. **`cgi.fix_pathinfo`** (implicit 1, `INI_SYSTEM`): asigură valori corecte pentru `PATH_INFO` și `PATH_TRANSLATED`. Scripturile ar trebui să folosească `SCRIPT_FILENAME` în loc de `PATH_TRANSLATED`.
3. **`cgi.discard_path`** (implicit 0, `INI_SYSTEM`): permite depunerea în siguranță a fișierului binar CGI în afara directorului web, fără ca protecția `.htaccess` să poată fi ocolită.
4. **`fastcgi.impersonate`** (implicit 0, `INI_SYSTEM`): relevantă doar pentru IIS sub Windows.
5. **`user_ini.filename`** și **`user_ini.cache_ttl`** (implicit `.user.ini` și 300 de secunde): controlează dacă și cât de des citește PHP fișierele `.user.ini`.

La Nginx face parte din asta o transmitere curată a căii scriptului. Un model de bază ușor de citit, fără garanție pentru orice mediu:

```nginx
location ~ \.php$ {
    try_files $uri =404;               # transmite lui PHP doar fișierele existente
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
```

Linia `try_files $uri =404;` împiedică transmiterea către PHP a cererilor pentru căi `.php` inexistente.

## De ce este periculos un acces FastCGI deschis

Manualul PHP avertizează explicit: cine poate deschide o conexiune FastCGI către PHP controlează configurația cererii, de exemplu `auto_prepend_file`, și poate astfel executa orice cod. Motivul este că serverele web pot trimite setări PHP prin parametri FastCGI precum `PHP_VALUE` și `PHP_ADMIN_VALUE`.

De aici rezultă reguli clare:

- Conectați PHP-FPM sau php-cgi în modul FastCGI doar printr-un socket Unix, dacă serverul web rulează pe aceeași gazdă.
- La TCP setați `listen.allowed_clients` și blocați portul în firewall; indicații în articolul [Firewall pentru serverul web](https://phpsos.de/ro/blog/firewall-fuer-webserver/).
- Țineți strânse drepturile socket-ului cu `listen.owner`, `listen.group` și `listen.mode`.

> **Important:**
> Verificați cu `ss -lntp | grep -i php` dacă un proces PHP ascultă pe o adresă TCP. O legare la `0.0.0.0` sau la o adresă publică este un caz de acțiune urgentă.

## CGI, FastCGI și PHP2Shell

PHP2Shell afectează atât php-cgi, cât și PHP-FPM. Pentru amândouă se aplică: actualizare la 8.5.12, 8.4.27, 8.3.36 sau 8.2.35, respectiv la un backport confirmat, apoi oprirea și repornirea tuturor proceselor PHP care rulează. La configurațiile FastCGI cu php-cgi, procesele continuă adesea neobservate, pentru că niciun serviciu propriu nu le administrează. Cum găsiți și înlocuiți această moștenire veche descrie [php-cgi: moștenire veche cu risc](https://phpsos.de/ro/server/php-cgi/). În Plesk, variantele se numesc altfel; ajutor oferă [Plesk: înțelegerea handlerelor PHP](https://phpsos.de/ro/blog/plesk-php-handler/).

## Cum ajută PHP SOS concret?

- **Inventarierea handlerelor:** Stabilim dacă site-urile dumneavoastră rulează prin CGI, FastCGI cu php-cgi sau PHP-FPM.
- **Închiderea accesurilor:** Verificăm socket-urile, porturile și regulile de firewall, pentru ca niciun acces FastCGI să nu fie accesibil din exterior.
- **Patch și curățenie:** Actualizăm PHP și oprim toate procesele vechi, inclusiv instanțele php-cgi orfane.
- **Înlocuirea:** În cadrul [întăririi serverului](https://phpsos.de/ro/leistungen/server-haertung/) înlocuim moștenirile CGI cu PHP-FPM cu pool-uri proprii.


## Întrebări frecvente

**Este FastCGI același lucru cu PHP-FPM?**  
Nu. FastCGI este un protocol prin care un server web comunică cu un proces de aplicație. PHP-FPM este un program care implementează acest protocol pentru PHP și administrează procesele. Și php-cgi poate vorbi FastCGI, dar nu oferă pool-uri.

**De ce este considerat CGI-ul simplu depășit?**  
La CGI, serverul web pornește un proces nou pentru fiecare cerere, iar PHP își citește de fiecare dată configurația. Aceasta costă timp și resurse. FastCGI și PHP-FPM țin procesele permanent pregătite și sunt de aceea mult mai eficiente.

**Ce este un .user.ini?**  
Un .user.ini este un mic fișier de configurare dintr-un director web. Potrivit manualului PHP, este citit doar de SAPI-urile CGI și FastCGI, deci și de PHP-FPM. Poate conține doar setări cu modurile INI_PERDIR, INI_USER sau INI_ALL.

**Cum îmi dau seama dacă pe serverul meu rulează php-cgi?**  
Căutați cu comenzi de citire precum ps sau pgrep procese numite php-cgi și uitați-vă în configurația serverului web după intrări precum mod_fcgid, Action sau ScriptAlias cu php-cgi. În panourile de hosting, modul de operare se numește adesea CGI sau aplicație FastCGI.

## Surse

- [Manualul PHP: setările de bază (cgi.*)](https://www.php.net/manual/en/ini.core.php)
- [Manualul PHP: fișierele .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
- [Manualul PHP: configurarea FPM](https://www.php.net/manual/en/install.fpm.configuration.php)
- [Documentația Nginx](https://nginx.org/en/docs/)
