# Nginx PHP jaoks turvaliselt seadistamine

> Nginx PHP jaoks turvaliselt seadistada: PHP-FPM-ile anda vaid tegelikud skriptid, vabastada Front-Controller, blokeerida punktfailid ja seada suuruspiirid.

Allikas: https://phpsos.de/et/blog/nginx-fuer-php-absichern/  
Seis: 25.10.2026  
Pakkuja: PHP SOS, PHP hädaabi ja serveri turvalisus. Kohene abi WhatsAppis: https://wa.me/491736494914?text=Tere%2C%20PHP%20SOS%2C%20vajame%20abi%20oma%20PHP-serveriga.%20Ettev%C3%B5te%3A%20%E2%80%A6%20Veebisait%3A%20%E2%80%A6

**Lühidalt:** Nginxi turvaliseks seadistamiseks PHP jaoks annate PHP-FPM-ile edasi ainult skriptid, mis tegelikult olemas on, Front-Controller-rakenduste puhul isegi ainult `index.php`. Lisaks tulevad blokeeritud punktfailid nagu `.git` ja `.env`, vaikeserver tundmatute hostinimede jaoks, sobivad suuruspiirid ja `security.limit_extensions = .php` poolis. See ei kaitse aukude eest PHP-s endas, kuid piirab, mis on pärast viga käivitatav.

## Kõige ohtlikumad read asuvad PHP-location'is

Alates PHP2Shellist kontrollivad paljud meeskonnad oma PHP-FPM-i versioone ja poole, nagu kirjeldab leht [Nginxi ja PHP-FPM-i turvamine](https://phpsos.de/et/server/nginx-php-fpm/), ning taaskäivitavad pärast uuendust [kõik töölised](https://phpsos.de/et/php2shell/php-fpm-neustart/). Teine pilk kehtib Nginxi konfiguratsioonile endale. Seal otsustatakse, millised failid üldse PHP-na käivitatakse.

Paljudes konfiguratsioonides on plokk, mis annab iga päringu laiendile `.php` PHP-FPM-ile edasi, olenemata sellest, kus fail asub. Kui sissetoodud PHP-fail satub üleslaadimiskausta, käivitab server selle. Failiveast saab nii tagauks.

See artikkel keskendub Nginxi poolele: millised direktiivid loevad, kuidas location-plokkide järjekord mõjub ja kuidas tulemust testida.

## Kuidas Nginx otsustab, milline plokk rakendub

Kes tahab Nginxi PHP jaoks turvaliselt seadistada, peab teadma location-plokkide valikut. Nginxi dokumentatsiooni järgi kulgeb see nii:

1. Täpne vaste `location =` lõpetab otsingu kohe.
2. Prefiks-location'ite seast jäetakse meelde pikim sobiv. Kui sellel on `^~`, regulaaravaldisi enam ei kontrollita.
3. Muidu kontrollitakse regulaaravaldisi (`~`, `~*`) konfiguratsioonifaili järjekorras; esimene vaste võidab.
4. Kui ükski regulaaravaldis ei sobi, kehtib meeldejäetud prefiks-location.

Sellest tulenevad kaks praktilist reeglit. PHP blokeering üleslaadimiskaustades peab olema kas `^~`-prefiksina või regulaaravaldisena üldise PHP-ploki ees. Ja tavaline prefiks-location nagu `location /uploads/` ei kaitse, sest `.php` regulaaravaldis kirjutab selle üle.

## Turvaline põhikonfiguratsioon

Järgmine näide näitab server-plokki Front-Controlleriga rakenduse jaoks, nagu see on tavaline Laraveli, Symfony, Shopware 6 või paljude omaarenduste puhul. Teed, sokli ja sertifikaadid kohandate ise.

```nginx
server {
    listen 443 ssl;
    server_name www.example.de;
    root /var/www/seite1/public;
    index index.php;

    ssl_certificate     /etc/ssl/seite1/fullchain.pem;
    ssl_certificate_key /etc/ssl/seite1/privkey.pem;

    server_tokens off;
    client_max_body_size 32m;

    # Lubage Let's Encrypt ja teised tuntud teed
    location ^~ /.well-known/ {
        try_files $uri =404;
    }

    # Blokeerige peidetud failid ja kaustad (.git, .env, .htaccess)
    location ~ /\. {
        deny all;
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # PHP-FPM-ile antakse üle ainult Front-Controller
    location = /index.php {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_hide_header X-Powered-By;
        fastcgi_pass unix:/run/php/seite1.sock;
    }

    # Ühtegi teist PHP-faili ei käivitata
    location ~ \.php$ {
        return 404;
    }
}
```

`$realpath_root` lahendab sümbolilingid. See on oluline juurutuste puhul, kus sümbolilink osutab vahelduvalt praegusele väljalasele, et PHP-FPM ja OPcache näeksid õiget teed. Arvestage lisaks: Nginxi dokumentatsiooni järgi päritakse `fastcgi_param`-direktiive kõrgematelt tasanditelt ainult siis, kui praegusel tasandil oma direktiive ei ole. Seetõttu kuulub `include fastcgi_params;` samasse plokki.

Klassikalistel CMS-idel nagu WordPress, TYPO3 või Contao on mitu sisenemispunkti. Seal asendate Front-Controller-ploki üldise PHP-location'iga, mis annab edasi ainult olemasolevad failid (`try_files $uri =404;`), ning blokeerite käivitamise kõigis kirjutatavates kaustades. Kuidas see õnnestub, on kirjas artiklis [PHP käivitamise keelamine üleslaadimiskaustades](https://phpsos.de/et/blog/php-in-uploads-verbieten/).

## Teine kaitsekiht PHP-FPM-is

Nginx otsustab, mis edasi antakse, PHP-FPM otsustab, mida ta käivitab. PHP käsiraamatu järgi käivitab PHP-FPM vaikimisi faile laienditega `.php` ja `.phar` ning soovitab ise selle laiendile `.php` piirata. See püüab kinni veebiserveri konfiguratsioonivead.

```ini
; poolis, nt /etc/php/8.3/fpm/pool.d/seite1.conf
security.limit_extensions = .php
listen = /run/php/seite1.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
```

Sokkel peaks olema kättesaadav ainult Nginxile. FPM-i pordid võrgus, näiteks `9000`, ei kuulu väljapoole avada. Kuidas server tervikuna näitab ainult vajalikke porte, kirjeldab [Veebiserveri tulemüür: avage ainult vajalikud pordid](https://phpsos.de/et/blog/firewall-fuer-webserver/).

## Tundmatud hostinimed ja muud häälestusnupud

Ilma oma vaikeserverita vastab Nginx tundmatute hostinimede päringutele esimese sobiva server-plokiga. Automatiseeritud skannimised, mis pöörduvad ainult IP-aadressi poole, satuvad siis otse teie rakendusse. Oma vaikeserver lõpetab sellised päringud vastuseta.

```nginx
server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_reject_handshake on;
    return 444;
}
```

Muud end õigustanud punktid:

| Häälestusnupp | Soovitus | Eesmärk |
|---|---|---|
| `server_tokens` | `off` | versiooninumbrit ei ole päises ega vealehtedel |
| `client_max_body_size` | vastavalt `post_max_size`-ile | suured päringud varakult tagasi lükata |
| `autoindex` | välja (vaikimisi) | katalooginimekirju ei ole |
| `fastcgi_hide_header` | `X-Powered-By` | PHP versiooni ei näidata väljapoole |
| Olekulehed | `pm.status_path` ainult sisemiselt | tööandmeid ei ole avalikult |
| Varukoopiafailid | `.sql`, `.zip`, `.bak` veebijuurkataloogis blokeerida või eemaldada | andmebaase alla laadida ei saa |

Rohkem versiooniandmete kohta on artiklis [expose_php ja Server-päised](https://phpsos.de/et/blog/expose-php-versionsangaben/).

Üks häälestusnupp puudutab lubatud HTTP-meetodeid. Enamik veebisaite vajab ainult GET, HEAD ja POST. Käsuga `limit_except` saab muud meetodid location'is tagasi lükata; Nginxi dokumentatsiooni järgi lubab GET vabastamine automaatselt ka HEAD. Kontrollige enne, kas teie rakenduse liidesed kasutavad näiteks PUT või DELETE, sest REST-API-d teevad seda sageli.

## Testimine enne uuesti laadimist

Iga muudatuse kontrollite esmalt käsuga `nginx -t` ja laadite Nginxi uuesti alles seejärel. Seejärel testite käitumist väljastpoolt tavaliste päringutega oma domeenile:

```bash
sudo nginx -t && sudo systemctl reload nginx
# Oodatav: 403 või 404
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.git/HEAD
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.env
# Oodatav: 404, sest käivitatakse ainult Front-Controller
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/info.php
# Millised plokid annavad PHP-FPM-ile üle?
sudo nginx -T 2>/dev/null | grep -nE "location|fastcgi_pass"
```

Kindlustage enne iga suuremat muudatust käsu `nginx -T` täielik väljund kuupäevaga. See sisaldab kogu kehtivat konfiguratsiooni, kõik ühendatud failid kaasa arvatud. Kui pärast muudatust läheb midagi viltu, näitab võrdlus kohe, mis erineb. Järgmise kriitilise augu korral on teil sellega lisaks usaldusväärne alus inventuuriks, ilma et peaksite kõigepealt faile kokku otsima.

> **Näpunäide:**
> Muutke konfiguratsiooni esmalt testkeskkonnas või server-ploki koopial. Unustatud sisenemispunkt, näiteks maksete tagasikutse, jääb muidu märkamata, kuni tellimused jäävad ära.

## Kuidas PHP SOS konkreetselt aitab?

- **Konfiguratsiooni lugeda:** analüüsime kogu Nginxi konfiguratsiooni käsuga `nginx -T` ja seome iga PHP üleandmise selle veebisaidi ja pooliga.
- **Sisenemispunktid määrata:** koos teie arendajatega määrame, millised skriptid peavad käivitatavad olema, ja blokeerime ülejäänud.
- **Rakendada ja testida:** kohandame server-plokke ja poole, kontrollime käsuga `nginx -t` ning testime vorme, maksetee ja üleslaadimisi.
- **Püsivalt kindlustada:** konfiguratsioonist saab osa meie [serveri karastamisest](https://phpsos.de/et/leistungen/server-haertung/) ja teie serveri dokumentatsioonist.


## Korduma kippuvad küsimused

**Kas Nginx tuleb pärast PHP uuendust taaskäivitada?**  
PHP paiga jaoks mitte, sest Nginx ei sisalda PHP-d. Taaskäivitada tuleb kõik PHP-FPM-teenused. Kui muudate seejuures ka Nginxi konfiguratsiooni, kontrollige seda enne käsuga nginx -t ja laadige Nginx seejärel uuesti.

**Miks anda PHP-le edasi ainult index.php?**  
Paljudel kaasaegsetel rakendustel on üks ainus sisenemispunkt, Front-Controller. Kui PHP-FPM-ile antakse üle ainult see fail, ei saa mujal asuvat sissetoodud PHP-faili brauseri kaudu käivitada. Paljude sisenemispunktidega süsteemide puhul see muster võimalik ei ole.

**Mida annab PHP-FPM-is security.limit_extensions?**  
Säte määrab, milliseid faililaiendeid PHP-FPM skriptina käivitab. PHP käsiraamatu järgi on vaikeväärtus .php .phar; soovitatav on piirduda laiendiga .php. See püüab kinni veebiserveri konfiguratsiooni vead, kuid ei asenda seda.

**Kas Nginxi reeglid kaitsevad PHP2Shelli vastu?**  
Ei. PHP2Shell asub PHP interpretaatoris ja suletakse ainult uuendusega parandatud versioonile ning kõigi töölisprotsesside taaskäivitamisega. Turvaline Nginxi konfiguratsioon vähendab ründepinda ja piirab kahju pärast sissemurdmist.

## Allikad

- [Nginx: ngx_http_core_module](https://nginx.org/en/docs/http/ngx_http_core_module.html)
- [Nginx: ngx_http_fastcgi_module](https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html)
- [PHP käsiraamat: FPM-i konfiguratsioon](https://www.php.net/manual/en/install.fpm.configuration.php)
- [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/)
