# CGI un FastCGI: pamati

> CGI un FastCGI ar PHP izskaidroti: process katram pieprasījumam vai pastāvīgi darbprocesi, php-cgi un PHP-FPM loma, cgi iestatījumi un drošības noteikumi.

Avots: https://phpsos.de/lv/php/cgi-und-fastcgi/  
Aktuāls uz: 25.10.2026  
Pakalpojuma sniedzējs: PHP SOS, PHP ārkārtas palīdzība un serveru drošība. Tūlītēja palīdzība pa WhatsApp: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20nepiecie%C5%A1ama%20pal%C4%ABdz%C4%ABba%20ar%20m%C5%ABsu%20PHP%20serveri.%20Uz%C5%86%C4%93mums%3A%20%E2%80%A6%20Vietne%3A%20%E2%80%A6

**Īsi:** CGI (Common Gateway Interface) ir sena saskarne, kurā tīmekļa serveris katram pieprasījumam startē jaunu programmu, PHP gadījumā programmu `php-cgi`. FastCGI ir tālākā attīstība: PHP procesi darbojas pastāvīgi un pieņem daudzus pieprasījumus caur socket. PHP-FPM ir svarīgākā FastCGI realizācija PHP. Drošībai svarīgi galvenokārt ir `cgi.*` iestatījumi un noteikums, ka FastCGI piekļuve nekad nedrīkst būt publiski sasniedzama.

## Kas ir CGI?

CGI ir viena no vecākajām metodēm, ar kuru tīmekļa serveri ģenerē dinamisku saturu. PHP rokasgrāmata pie iestatījuma `cgi.rfc2616_headers` atsaucas uz RFC 3875, Common Gateway Interface specifikāciju. Arī PHP pirmsākumi bija CGI programmas: Rasmus Lerdorf 1994. gadā uzrakstīja pirmos „Personal Home Page Tools“ kā CGI bināros failus C valodā.

Princips: katram pieprasījumam tīmekļa serveris startē jaunu procesu, nodod pieprasījuma datus caur vides mainīgajiem un standarta ievadi un nolasa atbildi no standarta izvades. Pēc tam process beidzas. Saskaņā ar PHP rokasgrāmatu PHP CGI un CLI gadījumā savu php.ini nolasa no jauna katrā izsaukumā, servera moduļu gadījumā tikai startējot.

Tas padara CGI noturīgu, jo katrs pieprasījums sākas ar svaigu procesu. Taču tas padara CGI arī lēnu: procesa startēšana, konfigurācijas ielāde un paplašinājumu inicializēšana katrā pieprasījumā prasa laiku.

## Kas ir FastCGI?

FastCGI veiktspējas problēmu risina, uzturot procesus dzīvus. Tīmekļa serveris caur Unix socket vai TCP portu savienojas ar darbojošos procesu un nosūta tam pieprasījumu FastCGI protokolā. Process to apstrādā un gaida nākamo.

| Pazīme | CGI | FastCGI ar php-cgi | FastCGI ar PHP-FPM |
|---|---|---|---|
| Process katram pieprasījumam | jā | nē | nē |
| SAPI nosaukums | `cgi-fcgi` | `cgi-fcgi` | `fpm-fcgi` |
| Pūli ar savu lietotāju | nē | nē | jā |
| Procesu vadība | tīmekļa serveris | tīmekļa servera modulis, piem., mod_fcgid | savs master process |
| `.user.ini` tiek nolasīts | jā | jā | jā |

PHP-FPM saskaņā ar rokasgrāmatu ir PHP primārā FastCGI implementācija. Tas protokolu papildina ar procesu pārvaldību, pūliem, statusa lapām un slowlog. Detaļas skatiet sadaļā [PHP-FPM izskaidrots](https://phpsos.de/lv/php/php-fpm-erklaert/).

## cgi iestatījumi php.ini

CGI darbībai PHP ir savi iestatījumi. Turpmākās vērtības un apraksti ņemti no PHP rokasgrāmatas:

1. **`cgi.force_redirect`** (noklusējums 1, `INI_SYSTEM`): saskaņā ar rokasgrāmatu nepieciešams, lai PHP kā CGI pie lielākās daļas tīmekļa serveru darbotos droši. Izslēgt tikai „uz paša risku“; IIS tam jābūt izslēgtam.
2. **`cgi.fix_pathinfo`** (noklusējums 1, `INI_SYSTEM`): nodrošina pareizas `PATH_INFO` un `PATH_TRANSLATED` vērtības. Skriptiem jāizmanto `SCRIPT_FILENAME`, nevis `PATH_TRANSLATED`.
3. **`cgi.discard_path`** (noklusējums 0, `INI_SYSTEM`): ļauj CGI bināro failu droši novietot ārpus tīmekļa direktorija, neapejot `.htaccess` aizsardzību.
4. **`fastcgi.impersonate`** (noklusējums 0, `INI_SYSTEM`): svarīgs tikai IIS sistēmā Windows.
5. **`user_ini.filename`** un **`user_ini.cache_ttl`** (noklusējums `.user.ini` un 300 sekundes): nosaka, vai un cik bieži PHP nolasa `.user.ini` failus.

Nginx gadījumā tam pieder arī tīra skripta ceļa nodošana. Lasāms pamatparaugs, bez garantijas katrai videi:

```nginx
location ~ \.php$ {
    try_files $uri =404;               # PHP nodot tikai esošus failus
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
```

Rinda `try_files $uri =404;` neļauj pieprasījumus uz neesošiem `.php` ceļiem nodot tālāk PHP.

## Kāpēc atklāta FastCGI piekļuve ir bīstama

PHP rokasgrāmata skaidri brīdina: kas var atvērt FastCGI savienojumu ar PHP, kontrolē pieprasījuma konfigurāciju, piemēram, `auto_prepend_file`, un tādējādi var izpildīt jebkuru kodu. Iemesls ir tas, ka tīmekļa serveri PHP iestatījumus drīkst līdzi nosūtīt ar FastCGI parametriem, piemēram, `PHP_VALUE` un `PHP_ADMIN_VALUE`.

No tā izriet skaidri noteikumi:

- PHP-FPM vai php-cgi FastCGI režīmā pieslēgt tikai caur Unix socket, ja tīmekļa serveris darbojas tajā pašā resursdatorā.
- TCP gadījumā iestatīt `listen.allowed_clients` un portu bloķēt ugunsmūrī; norādes skatiet rakstā [Ugunsmūris tīmekļa serverim](https://phpsos.de/lv/blog/firewall-fuer-webserver/).
- Socket tiesības ar `listen.owner`, `listen.group` un `listen.mode` turēt šauras.

> **Svarīgi:**
> Ar `ss -lntp | grep -i php` pārbaudiet, vai kāds PHP process klausās TCP adresē. Piesaiste pie `0.0.0.0` vai publiskas adreses ir steidzams rīcības gadījums.

## CGI, FastCGI un PHP2Shell

PHP2Shell skar gan php-cgi, gan PHP-FPM. Abiem ir spēkā: atjauninājums uz 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 vai apstiprināts backport, pēc tam visi darbojošies PHP procesi jāpabeidz un jāpārstartē. FastCGI risinājumos ar php-cgi procesi bieži turpina darboties nemanāmi, jo tos nepārvalda neviens atsevišķs pakalpojums. Kā šo mantojumu atrast un aizstāt, skatiet sadaļā [php-cgi: mantojums ar risku](https://phpsos.de/lv/server/php-cgi/). Plesk šie varianti saucas citādi; palīdzību sniedz [Plesk: PHP apstrādātāju izpratne](https://phpsos.de/lv/blog/plesk-php-handler/).

## Kā PHP SOS palīdz konkrēti?

- **Apzināt apstrādātājus:** Mēs noskaidrojam, vai jūsu vietnes darbojas caur CGI, FastCGI ar php-cgi vai PHP-FPM.
- **Aizvērt piekļuves:** Mēs pārbaudām sockets, portus un ugunsmūra noteikumus, lai neviena FastCGI piekļuve nebūtu sasniedzama no ārpuses.
- **Ielāpot un sakopt:** Mēs atjauninām PHP un pabeidzam visus vecos procesus, arī pamestās php-cgi instances.
- **Aizstāt:** [Servera nostiprināšanas](https://phpsos.de/lv/leistungen/server-haertung/) ietvaros mēs CGI mantojumu aizstājam ar PHP-FPM ar atsevišķiem pūliem.


## Biežāk uzdotie jautājumi

**Vai FastCGI ir tas pats, kas PHP-FPM?**  
Nē. FastCGI ir protokols, caur kuru tīmekļa serveris sazinās ar lietojumprogrammas procesu. PHP-FPM ir programma, kas šo protokolu realizē PHP un pārvalda procesus. Arī php-cgi var runāt FastCGI, taču tam nav pūlu.

**Kāpēc tīrs CGI tiek uzskatīts par novecojušu?**  
CGI gadījumā tīmekļa serveris katram pieprasījumam startē jaunu procesu, un PHP katru reizi nolasa savu konfigurāciju. Tas prasa laiku un resursus. FastCGI un PHP-FPM uztur procesus pastāvīgi gatavībā un tāpēc ir ievērojami efektīvāki.

**Kas ir .user.ini?**  
Fails .user.ini ir neliels konfigurācijas fails tīmekļa direktorijā. Saskaņā ar PHP rokasgrāmatu to nolasa tikai CGI un FastCGI SAPI, tātad arī PHP-FPM. Tajā drīkst būt tikai iestatījumi ar režīmiem INI_PERDIR, INI_USER vai INI_ALL.

**Kā noteikt, vai manā serverī darbojas php-cgi?**  
Ar tikai lasošām komandām, piemēram, ps vai pgrep, meklējiet procesus ar nosaukumu php-cgi, un tīmekļa servera konfigurācijā skatieties ierakstus, piemēram, mod_fcgid, Action vai ScriptAlias ar php-cgi. Hostinga paneļos darbības režīmu bieži sauc par CGI vai FastCGI lietojumprogrammu.

## Avoti

- [PHP rokasgrāmata: kodola iestatījumi (cgi.*)](https://www.php.net/manual/en/ini.core.php)
- [PHP rokasgrāmata: .user.ini faili](https://www.php.net/manual/en/configuration.file.per-user.php)
- [PHP rokasgrāmata: FPM konfigurācija](https://www.php.net/manual/en/install.fpm.configuration.php)
- [Nginx dokumentācija](https://nginx.org/en/docs/)
