# CGI i FastCGI: podstawy

> CGI i FastCGI w PHP wyjaśnione: proces na żądanie lub stałe workery, rola php-cgi i PHP-FPM, ustawienia cgi oraz zasady bezpieczeństwa.

Źródło: https://phpsos.de/pl/php/cgi-und-fastcgi/  
Stan: 25.10.2026  
Dostawca: PHP SOS, Pomoc awaryjna PHP i bezpieczeństwo serwerów. Natychmiastowa pomoc przez WhatsApp: https://wa.me/491736494914?text=Dzie%C5%84%20dobry%2C%20PHP%20SOS%2C%20potrzebujemy%20pomocy%20z%20naszym%20serwerem%20PHP.%20Firma%3A%20%E2%80%A6%20Strona%20internetowa%3A%20%E2%80%A6

**Krótko:** CGI (Common Gateway Interface) to stary interfejs, w którym serwer WWW dla każdego żądania uruchamia nowy program, w przypadku PHP program `php-cgi`. FastCGI jest jego rozwinięciem: procesy PHP działają nieprzerwanie i przyjmują wiele żądań przez gniazdo. PHP-FPM to najważniejsza implementacja FastCGI dla PHP. Dla bezpieczeństwa istotne są przede wszystkim ustawienia `cgi.*` oraz zasada, że dostęp FastCGI nigdy nie może być publicznie osiągalny.

## Czym jest CGI?

CGI to jedna z najstarszych metod, za pomocą których serwery WWW tworzą treści dynamiczne. Podręcznik PHP odsyła przy ustawieniu `cgi.rfc2616_headers` do RFC 3875, specyfikacji Common Gateway Interface. Także początki PHP to programy CGI: Rasmus Lerdorf napisał w 1994 roku pierwsze „Personal Home Page Tools” jako binarne pliki CGI w C.

Zasada: dla każdego żądania serwer WWW uruchamia nowy proces, przekazuje dane żądania przez zmienne środowiskowe i standardowe wejście, a odpowiedź odczytuje ze standardowego wyjścia. Potem proces się kończy. Według podręcznika PHP w CGI i CLI czyta swój php.ini od nowa przy każdym wywołaniu, w modułach serwera tylko przy starcie.

To czyni CGI odpornym, bo każde żądanie zaczyna się od świeżego procesu. Czyni je jednak także wolnym: uruchomienie procesu, wczytanie konfiguracji i inicjalizacja rozszerzeń kosztują czas przy każdym żądaniu.

## Czym jest FastCGI?

FastCGI rozwiązuje problem wydajności, utrzymując procesy przy życiu. Serwer WWW łączy się przez gniazdo Unix lub port TCP z działającym procesem i wysyła mu żądanie w protokole FastCGI. Proces je obsługuje i czeka na następne.

| Cecha | CGI | FastCGI z php-cgi | FastCGI z PHP-FPM |
|---|---|---|---|
| Proces na żądanie | tak | nie | nie |
| Nazwa SAPI | `cgi-fcgi` | `cgi-fcgi` | `fpm-fcgi` |
| Pule z własnym użytkownikiem | nie | nie | tak |
| Sterowanie procesami | serwer WWW | moduł serwera WWW, np. mod_fcgid | własny proces master |
| `.user.ini` jest czytany | tak | tak | tak |

Według podręcznika PHP-FPM jest podstawową implementacją FastCGI w PHP. Uzupełnia protokół o zarządzanie procesami, pule, strony statusu i slowlog. Szczegóły podajemy na stronie [PHP-FPM wyjaśniony](https://phpsos.de/pl/php/php-fpm-erklaert/).

## Ustawienia cgi w php.ini

Dla pracy w trybie CGI PHP zna własne ustawienia. Poniższe wartości i opisy pochodzą z podręcznika PHP:

1. **`cgi.force_redirect`** (domyślnie 1, `INI_SYSTEM`): według podręcznika konieczne, aby bezpiecznie prowadzić PHP jako CGI pod większością serwerów WWW. Wyłączać tylko „na własne ryzyko”; pod IIS musi być wyłączone.
2. **`cgi.fix_pathinfo`** (domyślnie 1, `INI_SYSTEM`): zapewnia prawidłowe wartości `PATH_INFO` i `PATH_TRANSLATED`. Skrypty powinny używać `SCRIPT_FILENAME` zamiast `PATH_TRANSLATED`.
3. **`cgi.discard_path`** (domyślnie 0, `INI_SYSTEM`): pozwala bezpiecznie umieścić plik binarny CGI poza katalogiem WWW, bez możliwości obejścia ochrony `.htaccess`.
4. **`fastcgi.impersonate`** (domyślnie 0, `INI_SYSTEM`): istotne tylko dla IIS w systemie Windows.
5. **`user_ini.filename`** i **`user_ini.cache_ttl`** (domyślnie `.user.ini` i 300 sekund): sterują tym, czy i jak często PHP czyta pliki `.user.ini`.

W Nginx do tego należy prawidłowe przekazanie ścieżki skryptu. Czytelny wzorzec podstawowy, bez gwarancji dla każdego środowiska:

```nginx
location ~ \.php$ {
    try_files $uri =404;               # przekazywać do PHP tylko istniejące pliki
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
```

Wiersz `try_files $uri =404;` zapobiega przekazywaniu do PHP żądań o nieistniejące ścieżki `.php`.

## Dlaczego otwarty dostęp FastCGI jest niebezpieczny

Podręcznik PHP wyraźnie ostrzega: kto może otworzyć połączenie FastCGI z PHP, kontroluje konfigurację żądania, na przykład `auto_prepend_file`, i może przez to wykonać dowolny kod. Powód jest taki, że serwery WWW mogą przesyłać ustawienia PHP przez parametry FastCGI, takie jak `PHP_VALUE` i `PHP_ADMIN_VALUE`.

Wynikają z tego jasne zasady:

- PHP-FPM lub php-cgi w trybie FastCGI podłączać tylko przez gniazdo Unix, jeśli serwer WWW działa na tym samym hoście.
- Przy TCP ustawić `listen.allowed_clients` i zablokować port w zaporze; wskazówki w artykule [Zapora dla serwera WWW](https://phpsos.de/pl/blog/firewall-fuer-webserver/).
- Uprawnienia gniazda utrzymywać wąskie przez `listen.owner`, `listen.group` i `listen.mode`.

> **Ważne:**
> Proszę sprawdzić poleceniem `ss -lntp | grep -i php`, czy jakiś proces PHP nasłuchuje na adresie TCP. Powiązanie z `0.0.0.0` lub z adresem publicznym wymaga pilnego działania.

## CGI, FastCGI i PHP2Shell

PHP2Shell dotyczy zarówno php-cgi, jak i PHP-FPM. Dla obu obowiązuje: aktualizacja do 8.5.12, 8.4.27, 8.3.36 lub 8.2.35 albo do potwierdzonego backportu, a następnie zakończenie i ponowne uruchomienie wszystkich działających procesów PHP. W konfiguracjach FastCGI z php-cgi procesy często działają dalej niezauważone, ponieważ żadna osobna usługa ich nie zarządza. Jak znaleźć i wycofać ten stary balast, opisujemy na stronie [php-cgi: stary balast z ryzykiem](https://phpsos.de/pl/server/php-cgi/). W Plesk warianty nazywają się inaczej; pomoc daje artykuł [Plesk: zrozumieć programy obsługi PHP](https://phpsos.de/pl/blog/plesk-php-handler/).

## Jak konkretnie pomaga PHP SOS?

- **Inwentaryzacja programów obsługi:** Ustalamy, czy Państwa strony działają przez CGI, FastCGI z php-cgi czy PHP-FPM.
- **Zamykanie dostępów:** Sprawdzamy gniazda, porty i reguły zapory, aby żaden dostęp FastCGI nie był osiągalny z zewnątrz.
- **Aktualizacja i porządkowanie:** Aktualizujemy PHP i kończymy wszystkie stare procesy, także osierocone instancje php-cgi.
- **Wycofanie:** W ramach [utwardzania serwera](https://phpsos.de/pl/leistungen/server-haertung/) zastępujemy stare rozwiązania CGI przez PHP-FPM z własnymi pulami.


## Częste pytania

**Czy FastCGI to to samo co PHP-FPM?**  
Nie. FastCGI to protokół, którym serwer WWW rozmawia z procesem aplikacji. PHP-FPM to program, który realizuje ten protokół dla PHP i zarządza procesami. Także php-cgi potrafi mówić po FastCGI, ale nie oferuje pul.

**Dlaczego zwykłe CGI uchodzi za przestarzałe?**  
W CGI serwer WWW uruchamia dla każdego żądania nowy proces, a PHP za każdym razem czyta swoją konfigurację. Kosztuje to czas i zasoby. FastCGI i PHP-FPM utrzymują procesy w gotowości, więc są wyraźnie wydajniejsze.

**Czym jest .user.ini?**  
Plik .user.ini to mały plik konfiguracyjny w katalogu strony. Według podręcznika PHP czytają go tylko SAPI CGI i FastCGI, a więc także PHP-FPM. Może zawierać tylko ustawienia w trybach INI_PERDIR, INI_USER lub INI_ALL.

**Jak rozpoznać, że na moim serwerze działa php-cgi?**  
Poleceniami tylko odczytowymi, takimi jak ps czy pgrep, szukać procesów o nazwie php-cgi, a w konfiguracji serwera WWW sprawdzić wpisy takie jak mod_fcgid, Action lub ScriptAlias z php-cgi. W panelach hostingowych tryb pracy często nazywa się CGI lub aplikacja FastCGI.

## Źródła

- [Podręcznik PHP: ustawienia rdzenia (cgi.*)](https://www.php.net/manual/en/ini.core.php)
- [Podręcznik PHP: pliki .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
- [Podręcznik PHP: konfiguracja FPM](https://www.php.net/manual/en/install.fpm.configuration.php)
- [Dokumentacja Nginx](https://nginx.org/en/docs/)
