Modul 7 · 7.2
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ó:
| Útvonal | Mi ez? |
|---|---|
nginx.conf | fő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/*.conf | kü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.htmlEzutá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 alisten [::]: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_namemegadja, 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
roota fájlokat tartalmazó könyvtár, aindexpedig az a fájl, amely egy könyvtár kérésekor megjelenik. - A
try_fileselő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 OKTegye á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),.envfájlok és.gitkö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ó: alocation ~ /\. { 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;anginx.conffájlban eltávolítja a verziószámot aServerfejlé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.1címen futó alkalmazásnak. - Webhelyenként egy server block a
sites-availablekönyvtárban, bekapcsolás egy hivatkozással asites-enabledkönyvtárban; figyeljen a80és a[::]:80címen is. - Mindig
nginx -tasystemctl reload nginxelőtt. - Egy saját default server
return 444haszná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ésX-Forwarded-Protofejlécet; a webroot olvasható awww-dataszámára, de nem írható, és nincsenek benne titkok.
Kvíz
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 puszta IP-címen semmi (a kapcsolat lezárul) vagy egy semleges oldal, soha nem ügyfélwebhely. Csak egy feltöltési mappa írható a www-data számára, a többi csak olvasható. Proxy mögött: Host, X-Real-IP, X-Forwarded-For és X-Forwarded-Proto.
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ó
- Tiltott (403): Önnek nincs jogosultsága a / elérésére ezen a szerveren
- nginx-dokumentáció, How nginx processes a request (server_name és default server): https://nginx.org/en/docs/http/request_processing.html
- nginx-dokumentáció, Beginner's Guide: https://nginx.org/en/docs/beginners_guide.html
- nginx-dokumentáció,
ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html - VPS: az első bejelentkezéstől a biztonságos szerverig 5.2: nginx Let's Encrypt-tanúsítvánnyal
