7 modulis · 7.2
Žiniatinklio serveris su nginx
7 modulis: Domenas, žiniatinklio serveris ir https · Skaitymo laikas: 12 min.
Mokymosi tikslas: Po šios pamokos galėsite įdiegti nginx, server block pagalba sukonfigūruoti svetainę ir reverse proxy, saugiai patikrinti ir perkrauti konfigūraciją bei teisingai nustatyti savo webroot teises.
Pagrindinės sąvokos: nginx, server block, sites-available ir 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
Ką daro žiniatinklio serveris
Žiniatinklio serveris klauso 80 (http) ir 443 (https) prievaduose, priima naršyklių užklausas ir grąžina atsakymą: failą iš disko (statinę svetainę) arba už jo veikiančios programos atsakymą (PHP, Node.js programos, konteinerio). Antruoju atveju žiniatinklio serveris vadinamas reverse proxy: jis stovi priekyje, tvarko https ir perduoda užklausą programai, kuri klauso tik 127.0.0.1.
Linux sistemoje žinomiausi žiniatinklio serveriai yra nginx ir Apache, o Caddy (pamoka 7.4) yra moderni alternatyva, kuri sertifikatus tvarko pati. Šioje pamokoje naudojamas nginx: jis yra kiekvienoje distribucijoje, taupiai naudoja atmintį ir yra standartas daugelyje vadovų.
Įdiegimas ir pirmas žvilgsnis
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(Versijos numeris yra tik pavyzdys.) Nepamirškite užkardos: 80 ir 443 prievadai turi būti atidaryti (pamoka 5.2). Jei dabar atidarysite http://192.0.2.10, pamatysite nginx pasveikinimo puslapį.
Konfigūracija yra /etc/nginx/:
| Kelias | Kas |
|---|---|
nginx.conf | pagrindinis failas; dažniausiai jo neliečiate |
sites-available/ | po vieną failą kiekvienai svetainei (Debian ir Ubuntu) |
sites-enabled/ | nuorodos (symlinks) į įjungtas svetaines |
conf.d/*.conf | atskiri nustatymai, kurie įkeliami visada |
snippets/ | fragmentai, kuriuos pakartotinai naudojate keliose svetainėse |
sites-available ir sites-enabled yra Debian ir Ubuntu įprotis: taip svetainę įjungiate ar išjungiate sukurdami arba pašalindami nuorodą, neištrindami paties failo.
Pirmoji svetainė
Sukurkite svetainei katalogą ir bandomąjį puslapį:
anna@web1:~$ sudo mkdir -p /var/www/example.com
anna@web1:~$ echo '<h1>Het werkt</h1>' | sudo tee /var/www/example.com/index.htmlTada sukurkite server block: vienos svetainės aprašą.
# /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;
}Skaitykite jį taip:
listen 80;irlisten [::]:80;nurodo nginx klausyti per IPv4 ir per IPv6. Jei pamiršite antrą eilutę, Jūsų AAAA įrašas neveiks (pamoka 7.1).server_namenurodo, kokiems pavadinimams šis blokas galioja. Kiekvienai užklausai nginx žiūri, kokio pavadinimo prašo naršyklė (Host antraštė), ir pasirenka tinkantį bloką.rootyra katalogas su failais,indexyra failas, rodomas atidarius katalogą.try_filesbando rasti prašomą failą, tada katalogą, o kitaip grąžina 404. Be tokios eilutės klaidinga konfigūracija gali parodyti daugiau, nei norite.- Atskiri kiekvienos svetainės žurnalų failai gerokai palengvina paiešką (pamoka 6.2).
Įjunkite svetainę, pašalinkite numatytąją svetainę, patikrinkite ir perkraukite:
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 OKPaverskite nginx -t prieš kiekvieną reload nuolatiniu įpročiu. Radęs klaidą, jis nurodo failą ir eilutę, o Jūsų veikianti svetainė lieka nepaliesta. Jei perkrausite netikrinę, nginx su klaida nebepasileis ir visos Jūsų svetainės nustos veikti (pamoka 6.1).
Default server: ką gauna nežinomas pavadinimas?
Kas nutinka, kai kas nors kreipiasi į Jūsų serverį pavadinimu, kurio nėra jokiame server_name, arba tiesiog IP adresu? Tada nginx pasirenka default server: bloką su default_server po listen, o jei tokio nėra, pirmą rastą bloką. Jei apie tai negalvojote, tai bus viena iš Jūsų tikrų svetainių.
Tvarkingiau yra turėti atskirą bloką, kuris tokias užklausas atmeta:
# /etc/nginx/sites-available/000-default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}444 yra ypatingas nginx kodas: ryšys uždaromas be jokio atsakymo. Taip IP adresus skenuojančios programos nieko nepamato. https (443 prievadui) default server veikia šiek tiek kitaip, nes jam reikia sertifikato; prie to grįšite pamokoje 7.3.
nginx kaip reverse proxy
Jei programa veikia 127.0.0.1:3000 (pamoka 6.3) arba konteineris 127.0.0.1:3001 (pamoka 9.3), nginx padaro ją pasiekiamą iš išorės:
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;
}
}Keturios proxy_set_header eilutės yra svarbios. Be Host programa nežino, kokiu pavadinimu ji lankoma. Be X-Forwarded-For programa mato, kad kiekvienas apsilankymas ateina iš 127.0.0.1 (proxy), o ne iš tikrojo lankytojo adreso. Be X-Forwarded-Proto programa mano, kad viskas vyksta per http, ir kartais kuria nuorodas ar slapukus http, nors Jūsų svetainė veikia per https. Daugelis programų turi nustatymą, leidžiantį pasitikėti šiomis antraštėmis („trusted proxy“); įrašykite ten tik 127.0.0.1, kitaip bet kuris lankytojas galės atsiųsti netikrą adresą.
Programoms, naudojančioms websockets (tiesioginiai atnaujinimai, pvz., Uptime Kuma), reikia dar dviejų eilučių: proxy_http_version 1.1; ir Upgrade bei Connection perdavimo. Programos dokumentacijoje paprastai tiksliai nurodyta, kokių.
Webroot teisės
Debian ir Ubuntu sistemose nginx savo darbinius procesus vykdo kaip naudotojas www-data. Jis turi galėti Jūsų failus skaityti, bet neturėtų galėti į juos rašyti. Geras išdėstymas (pamoka 3.1):
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 {} \;Jūs (anna) tvarkote failus, grupė www-data gali skaityti, kiti neturi jokių teisių. Jei svetainei kur nors reikia rašyti, pavyzdžiui, į įkėlimų katalogą, suteikite www-data rašymo teises tik tam katalogui. Niekada chmod 777 (pamoka 10.2). Jei gaunate 403 Forbidden, peržiūrėkite svetainės klaidų žurnalą: ten bus permission denied su keliu.
Dar keli įpročiai:
- Jokių paslapčių webroot kataloge. Atsarginės kopijos (
site.zip),.envfailai ir.gitkatalogai ten nepriklauso; jei jie vis dėlto netyčia ten atsiduria, juos galima atsisiųsti. Papildoma apsauga:location ~ /\. { deny all; }blokuoja visus failus, kurių pavadinimas prasideda tašku (išskyrus tai, ką aiškiai leidžiate, pvz.,/.well-known/, žr. pamokas 7.3 ir 7.4). - Paslėpkite versiją.
server_tokens off;failenginx.confpašalina versijos numerį išServerantraštės ir klaidų puslapių. Tai nėra tikra apsauga, tačiau skenuojančioms programoms suteikiama mažiau informacijos.
Trumpai apie PHP
PHP svetainėms (pvz., WordPress) nginx bendrauja su PHP-FPM, atskira paslauga. Debian sistemoje įdiegiate php-fpm ir server block įrašote location ~ \.php$ bloką su include snippets/fastcgi-php.conf; ir fastcgi_pass unix:/run/php/php8.4-fpm.sock; (versijos numeris skiriasi priklausomai nuo leidimo). WordPress kursas tai aptaria išsamiau.
AlmaLinux ir Rocky Linux sistemose
Ten nėra sites-available: kiekvieną svetainę įrašote kaip atskirą failą į /etc/nginx/conf.d/<naam>.conf. nginx veikia kaip naudotojas nginx, o ne www-data, o numatytasis webroot yra /usr/share/nginx/html. SELinux pagal numatytuosius nustatymus neleidžia nginx jungtis prie programos už proxy_pass; tai įjunkite su setsebool -P httpd_can_network_connect 1. Failams už įprastų katalogų ribų reikia SELinux žymos (semanage fcontext ir restorecon).
Santrauka
- nginx pateikia failus arba kaip reverse proxy perduoda užklausas programai, veikiančiai
127.0.0.1. - Po vieną server block kiekvienai svetainei
sites-available, įjungiama nuorodasites-enabled; klausykite per80ir[::]:80. - Visada
nginx -tpriešsystemctl reload nginx. - Nuosavas default server su
return 444neleidžia, kad nežinomas pavadinimas ar plikas IP adresas parodytų kurią nors Jūsų svetainę. - Kaip reverse proxy perduodate
Host,X-Forwarded-ForirX-Forwarded-Proto; webroot yra skaitomaswww-data, bet ne rašomas, ir jame nėra paslapčių.
Testas (quiz)
Užduotis
Užduotis O7.2: Jūsų pirmoji svetainė. Įdiekite nginx (arba naudokite Caddy iš pamokos 7.4), sukurkite server block (sub)domenui, kuris nukreiptas į Jūsų serverį, su listen IPv4 ir IPv6, atskirais žurnalų failais ir nuosavu default server. Patikrinkite su nginx -t, perkraukite ir patikrinkite su curl -I per IPv4 ir IPv6. Nustatykite webroot teises, kaip aprašyta pamokoje. Užpildykite kontrolinį sąrašą ir įklijuokite savo server block.
Užduotis O7.2: Jūsų pirmoji svetainė
Šią užduotį atliekate patys; niekas jos netikrina. Pažymėkite, ką atlikote, ir pažymėkite užduotį kaip atliktą.
Atidarius tik IP adresą, nerodoma nieko (ryšys uždaromas) arba rodomas neutralus puslapis, niekada ne kliento svetainė. Tik įkėlimų katalogas yra rašomas www-data naudotojui, visa kita tik skaitoma. Už tarpinio serverio: Host, X-Real-IP, X-Forwarded-For ir X-Forwarded-Proto.
Jūsų pažymėti varneliai ir pastabos lieka tik šioje naršyklėje; niekur jų nesiunčiame. Jei esate prisijungę, skiltyje Mano kursai išsaugome tik tai, kad užduotį atlikote.
Skaitykite daugiau
- Draudžiama (403): Neturite leidimo pasiekti / šiame serveryje
- nginx dokumentacija, How nginx processes a request (server_name ir default server): https://nginx.org/en/docs/http/request_processing.html
- nginx dokumentacija, Beginner's Guide: https://nginx.org/en/docs/beginners_guide.html
- nginx dokumentacija,
ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
