Ugrás a tartalomhoz

Sütibeállítások

Típusonként válassza ki, mely sütiket engedélyezi. Választását bármikor módosíthatja a Sütibeállítások linken, amely minden oldal alján megtalálható. Adatvédelmi nyilatkozat

Szükséges

Mindig bekapcsolva

A bejelentkezéshez, a kosár megőrzéséhez és a választásai megjegyzéséhez szükségesek. Ezek mindig be vannak kapcsolva.

Milyen sütik?
  • weboke_sessie, weboke_klant, weboke_remember: a munkamenet és a bejelentkezve maradás
  • weboke_basket: a kosár
  • wkBtwIncl: az árak megjelenítése ÁFÁ-val vagy anélkül
  • wok_cookies: a sütiválasztás, 12 hónap

Méri, melyik hirdetés vezet látogatáshoz vagy rendeléshez, hogy ne fizessünk hatástalan hirdetésekért.

Milyen sütik?
  • Google Ads a Google Tag Manageren keresztül (_gcl_au, _gcl_aw), legfeljebb 90 napig
  • OpenAI Ads, hirdetések a ChatGPT-ben
  • wok_aff: melyik partnerünk ajánlására érkezett (partnerprogram), 60 nap

4,6

Ország és nyelv

Minden országnak saját oldala van, az adott ország áraival és ÁFA-jával.

Megtekintés

Webszerver nginx-szel

Modul 7: Domain, webszerver és https · Olvasási idő: 12 perc

Tanulási cél: A lecke után Ön képes lesz telepíteni az nginx-et, webhelyet és reverse proxyt beállítani egy server block segítségével, biztonságosan tesztelni és újratölteni egy konfigurációt, valamint helyesen beállítani a webroot jogosultságait.

Kulcsfogalmak: nginx, server block, sites-available és sites-enabled, conf.d, listen, server_name, root, index, try_files, default server, nginx -t, reload, reverse proxy, proxy_pass, Host, X-Forwarded-For, X-Forwarded-Proto, webroot, PHP-FPM

Mit csinál egy webszerver?

A webszerver a 80-as (http) és a 443-as (https) porton figyel, fogadja a böngészők kéréseit, és visszaküld valamit: egy fájlt a lemezről (statikus webhely), vagy egy mögötte futó program válaszát (PHP, Node.js-alkalmazás, konténer). Ez utóbbi esetben a webszervert reverse proxynak nevezzük: ő áll elöl, ő intézi a https-t, és továbbadja a kérést az alkalmazásnak, amely csak a 127.0.0.1 címen figyel.

Linuxon az nginx és az Apache a legismertebb webszerverek, a Caddy (7.4. lecke) pedig egy modern alternatíva, amely maga gondoskodik a tanúsítványokról. Ez a lecke az nginx-et használja: minden disztribúcióban megtalálható, takarékosan bánik a memóriával, és sok útmutatóban ez az alapértelmezés.

Telepítés és az első pillantás

anna@web1:~$ sudo apt install nginx
anna@web1:~$ systemctl status nginx
anna@web1:~$ curl -I http://localhost
HTTP/1.1 200 OK
Server: nginx/1.26.3
Content-Type: text/html

(A verziószám csak példa.) Ne feledkezzen meg a tűzfalról: a 80-as és a 443-as portnak nyitva kell lennie (5.2. lecke). Ha most megnyitja a http://192.0.2.10 címet, az nginx üdvözlőoldalát látja.

A konfiguráció a /etc/nginx/ könyvtárban található:

ÚtvonalMi ez?
nginx.conffőfájl; általában nem kell hozzányúlni
sites-available/webhelyenként egy fájl (Debian és Ubuntu)
sites-enabled/hivatkozások (symlinkek) a bekapcsolt webhelyekre
conf.d/*.confkülönálló beállítások, amelyek mindig betöltődnek
snippets/részletek, amelyeket több webhelyen is újrahasznosít

A sites-available és a sites-enabled a Debian és az Ubuntu szokása: így egy webhelyet egy hivatkozás létrehozásával vagy eltávolításával kapcsolhat be vagy ki, a fájl törlése nélkül.

Az első webhely

Hozzon létre egy könyvtárat a webhelynek és egy tesztoldalt:

anna@web1:~$ sudo mkdir -p /var/www/example.com
anna@web1:~$ echo '<h1>Het werkt</h1>' | sudo tee /var/www/example.com/index.html

Ezután hozzon létre egy server blockot: ez egyetlen webhely leírása.

# /etc/nginx/sites-available/example.com
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;
}

Így értelmezze:

  • A listen 80; és a listen [::]:80; hatására az nginx IPv4-en és IPv6-on is figyel. Ha a második sort elfelejti, az AAAA-rekordja nem fog működni (7.1. lecke).
  • A server_name megadja, mely nevekre vonatkozik ez a blokk. Az nginx minden kérésnél megnézi, milyen nevet kér a böngésző (a Host fejléc), és kiválasztja az illeszkedő blokkot.
  • A root a fájlokat tartalmazó könyvtár, a index pedig az a fájl, amely egy könyvtár kérésekor megjelenik.
  • A try_files előbb a kért fájlt próbálja, aztán egy könyvtárat, egyébként 404-et ad. Ilyen sor nélkül egy hibás konfiguráció többet mutathat meg, mint szeretné.
  • A webhelyenkénti saját naplófájlok sokkal könnyebbé teszik a keresést (6.2. lecke).

Kapcsolja be a webhelyet, távolítsa el az alapértelmezett webhelyet, teszteljen, majd töltse újra:

anna@web1:~$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
anna@web1:~$ sudo rm /etc/nginx/sites-enabled/default
anna@web1:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
anna@web1:~$ sudo systemctl reload nginx
anna@web1:~$ curl -I http://example.com
HTTP/1.1 200 OK

Tegye állandó szokásává a nginx -t futtatását minden reload előtt. Hiba esetén megmondja, melyik fájlban és melyik sorban van a gond, a futó webhelye pedig érintetlen marad. Ha tesztelés nélkül indít újra, az nginx hibás konfigurációval már nem indul el, és az összes webhelye leáll (6.1. lecke).

A default server: mit kap egy ismeretlen név?

Mi történik, ha valaki olyan névvel kéri le a szerverét, amely egyetlen server_name sorban sem szerepel, vagy egyszerűen az IP-címmel? Ilyenkor az nginx a default servert választja: azt a blokkot, amelyben a listen után default_server áll, vagy ennek hiányában az elsőt, amellyel találkozott. Ha nem gondol rá, ez tehát az egyik valódi webhelye lesz.

Rendezettebb megoldás egy külön blokk, amely elutasítja az ilyen kéréseket:

# /etc/nginx/sites-available/000-default
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}

A 444 az nginx egy különleges kódja: a kapcsolat válasz nélkül záródik le. Az IP-címeket végigpásztázó szkennerek így semmit sem látnak. A https (443-as port) esetén a default server kicsit másképp működik, mert tanúsítvány tartozik hozzá; erre a 7.3. leckében térünk vissza.

Az nginx mint reverse proxy

Ha egy alkalmazás fut a 127.0.0.1:3000 címen (6.3. lecke) vagy egy konténer a 127.0.0.1:3001 címen (9.3. lecke), az nginx teszi elérhetővé kifelé:

server {
    listen 80;
    listen [::]:80;
    server_name app.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

A négy proxy_set_header sor fontos. Host nélkül az alkalmazás nem tudja, milyen néven látogatják. X-Forwarded-For nélkül az alkalmazás minden látogatást a 127.0.0.1 címről (a proxytól) érkezőnek lát a látogató valódi címe helyett. X-Forwarded-Proto nélkül az alkalmazás azt hiszi, hogy minden http-n keresztül megy, és néha http-s linkeket vagy sütiket készít, miközben a webhelye https-en fut. Sok alkalmazásnak van beállítása ezeknek a fejléceknek a megbízhatóként kezelésére („trusted proxy”); ide csak a 127.0.0.1 címet írja be, különben bármely látogató hamis címet küldhet.

A websocketeket használó alkalmazásoknak (élő frissítések, például az Uptime Kuma) még két sorra van szükségük: proxy_http_version 1.1;, valamint a Upgrade és a Connection továbbadása. Az alkalmazás dokumentációja általában pontosan megadja, melyekre.

A webroot jogosultságai

Debianon és Ubuntun az nginx a munkafolyamatait a www-data felhasználóként futtatja. Ennek olvasnia kell tudnia a fájljait, de írnia nem szabad tudnia azokat. Egy jó felosztás (3.1. lecke):

anna@web1:~$ sudo chown -R anna:www-data /var/www/example.com
anna@web1:~$ sudo find /var/www/example.com -type d -exec chmod 750 {} \;
anna@web1:~$ sudo find /var/www/example.com -type f -exec chmod 640 {} \;

Ön (anna) kezeli a fájlokat, a www-data csoport olvashat, a többiek semmit. Ha a webhelynek valahol írnia kell, például egy feltöltési könyvtárban, akkor csak annak a könyvtárnak adjon írási jogot a www-data számára. Soha ne chmod 777 (10.2. lecke). Ha 403 Forbidden hibát kap, nézze meg a webhely hibanaplóját: ott a permission denied üzenet szerepel az útvonallal.

Néhány további jó szokás:

  • Ne legyenek titkok a webrootban. Biztonsági mentések (site.zip), .env fájlok és .git könyvtárak nem valók ide; ha mégis véletlenül ide kerülnek, lekérhetők. Egy további biztonsági háló: a location ~ /\. { deny all; } letilt minden ponttal kezdődő fájlt (kivéve azt, amit kifejezetten engedélyez, például a /.well-known/ könyvtárat, lásd a 7.3. és 7.4. leckét).
  • A verzió elrejtése. A server_tokens off; a nginx.conf fájlban eltávolítja a verziószámot a Server fejlécből és a hibaoldalakról. Ez nem valódi védelem, de kevesebb információt ad a szkennereknek.

Röviden a PHP-ról

PHP-s webhelyeknél (például WordPress) az nginx a PHP-FPM nevű különálló szolgáltatással kommunikál. Debianon telepítse a php-fpm csomagot, és a server blockban hozzon létre egy location ~ \.php$ blokkot include snippets/fastcgi-php.conf; és fastcgi_pass unix:/run/php/php8.4-fpm.sock; sorokkal (a verziószám kiadásonként eltér). A WordPress-tanfolyam ezt részletesebben tárgyalja.

AlmaLinuxon és Rocky Linuxon

Ott nincs sites-available: minden webhelyet külön fájlként helyez el a /etc/nginx/conf.d/<naam>.conf könyvtárban. Az nginx a nginx felhasználóként fut a www-data helyett, az alapértelmezett webroot pedig a /usr/share/nginx/html. Az SELinux alapértelmezés szerint nem engedi, hogy az nginx kapcsolódjon egy proxy_pass mögötti alkalmazáshoz; ezt a setsebool -P httpd_can_network_connect 1 paranccsal kapcsolhatja be. A szokásos könyvtárakon kívüli fájloknak SELinux-címkére van szükségük (semanage fcontext és restorecon).

Összefoglalás

  • Az nginx fájlokat szolgál ki, vagy reverse proxyként továbbadja a kéréseket egy 127.0.0.1 címen futó alkalmazásnak.
  • Webhelyenként egy server block a sites-available könyvtárban, bekapcsolás egy hivatkozással a sites-enabled könyvtárban; figyeljen a 80 és a [::]:80 címen is.
  • Mindig nginx -t a systemctl reload nginx előtt.
  • Egy saját default server return 444 használatával megakadályozza, hogy egy ismeretlen név vagy a puszta IP-cím valamelyik webhelyét mutassa.
  • Reverse proxyként adja tovább a Host, X-Forwarded-For és X-Forwarded-Proto fejlécet; a webroot olvasható a www-data számára, de nem írható, és nincsenek benne titkok.

Kvíz

1. Módosított egy server blockot. Mi a biztonságos sorrend?



2. A webhelye IPv4-en működik, IPv6-on viszont nem, pedig az AAAA-rekord helyes, és a tűzfal engedi az IPv6-ot. Mi hiányzik valószínűleg a server blockból?



3. Valaki megnyitja a http://192.0.2.10 címet (a puszta IP-címet), és az egyik ügyfele webhelyét látja. Hogyan előzheti meg ezt?



4. A proxy_pass mögötti alkalmazása minden látogatásnál a 127.0.0.1 címet látja. Mi hiányzik?



5. Milyen jogosultságok illenek egy statikus webhely fájljaihoz a /var/www/example.com könyvtárban?



Feladat

Feladat O7.2: Az első webhelye. Telepítse az nginx-et (vagy használja a 7.4. lecke Caddy-jét), hozzon létre egy server blockot egy olyan (al)domainhez, amely a szerverére mutat, listen sorokkal IPv4-hez és IPv6-hoz, saját naplófájlokkal és saját default serverrel. Teszteljen a nginx -t paranccsal, töltse újra, és ellenőrizze a curl -I segítségével IPv4-en és IPv6-on keresztül. Állítsa be a webroot jogosultságait a lecke szerint. Töltse ki az ellenőrzőlistát, és illessze be a server blockját.

O7.2. feladat: Az első webhelye

Ezt a feladatot saját maga végzi el, senki nem ellenőrzi. Pipálja ki, amit elvégzett, és jelölje meg a feladatot elvégzettként.




A pipái és jegyzetei csak ebben a böngészőben maradnak meg, sehova nem küldjük el őket. Ha bejelentkezett, a Fiókomban csak azt tároljuk, hogy elvégezte a feladatot.

További olvasnivaló

Egy pillanat…

Domainek beállítása

Állítsa be domainenként a névszervereket, a tárhelyhez való kapcsolást és azt, hogy ki legyen a tulajdonos.

Domainek betöltése…