7. modulis · 7.2
Tīmekļa serveris ar nginx
7. modulis: Domēns, tīmekļa serveris un https · Lasīšanas laiks: 12 min.
Mācīšanās mērķis: Pēc šīs nodarbības Jūs varēsiet instalēt nginx, iestatīt vietni un reverse proxy ar server block, droši pārbaudīt un pārlādēt konfigurāciju, kā arī pareizi iestatīt sava webroot tiesības.
Pamatjēdzieni: nginx, server block, sites-available un 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
Ko dara tīmekļa serveris
Tīmekļa serveris klausās portā 80 (http) un 443 (https), pieņem pārlūku pieprasījumus un nosūta atpakaļ atbildi: failu no diska (statiska vietne) vai atbildi no programmas, kas darbojas aiz tā (PHP, Node.js lietotne, konteiners). Otrajā gadījumā tīmekļa serveri sauc par reverse proxy: tas stāv priekšā, nodrošina https un nodod pieprasījumu lietotnei, kas klausās tikai uz 127.0.0.1.
Linux vidē pazīstamākie tīmekļa serveri ir nginx un Apache, bet Caddy (nodarbība 7.4) ir moderna alternatīva, kas pati rūpējas par sertifikātiem. Šajā nodarbībā izmantojam nginx: tas ir pieejams katrā distribūcijā, taupīgi izmanto atmiņu un ir standarts daudzās pamācībās.
Instalēšana un pirmais ieskats
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(Versijas numurs ir piemērs.) Neaizmirstiet ugunsmūri: portiem 80 un 443 jābūt atvērtiem (nodarbība 5.2). Ja tagad atverat http://192.0.2.10, Jūs redzēsiet nginx sveiciena lapu.
Konfigurācija atrodas mapē /etc/nginx/:
| Ceļš | Kas tas ir |
|---|---|
nginx.conf | galvenais fails; parasti to nemaina |
sites-available/ | viens fails katrai vietnei (Debian un Ubuntu) |
sites-enabled/ | saites (symlinks) uz ieslēgtajām vietnēm |
conf.d/*.conf | atsevišķi iestatījumi, kas tiek ielādēti vienmēr |
snippets/ | fragmenti, ko atkārtoti izmantojat vairākās vietnēs |
sites-available un sites-enabled ir Debian un Ubuntu ieradums: tā Jūs ieslēdzat vai izslēdzat vietni, izveidojot vai noņemot saiti, nedzēšot pašu failu.
Pirmā vietne
Izveidojiet mapi vietnei un testa lapu:
anna@web1:~$ sudo mkdir -p /var/www/example.com
anna@web1:~$ echo '<h1>Het werkt</h1>' | sudo tee /var/www/example.com/index.htmlPēc tam izveidojiet server block: vienas vietnes aprakstu.
# /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;
}Lasiet to šādi:
listen 80;unlisten [::]:80;liek nginx klausīties gan IPv4, gan IPv6. Ja aizmirsīsiet otro rindu, Jūsu AAAA ieraksts nedarbosies (nodarbība 7.1).server_namenorāda, kuriem nosaukumiem šis bloks ir paredzēts. Katram pieprasījumam nginx skatās nosaukumu, ko pieprasa pārlūks (Host galveni), un izvēlas atbilstošo bloku.rootir mape ar failiem,indexir fails, kas tiek parādīts, ja pieprasīta mape.try_filesmēģina atrast pieprasīto failu, tad mapi, un citādi atgriež 404. Bez šādas rindas kļūdaina konfigurācija var parādīt vairāk, nekā vēlaties.- Atsevišķi žurnālfaili katrai vietnei ievērojami atvieglo meklēšanu (nodarbība 6.2).
Ieslēdziet vietni, noņemiet noklusējuma vietni, pārbaudiet un pārlādējiet:
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 OKPadariet nginx -t pirms katras pārlādes par pastāvīgu ieradumu. Kļūdas gadījumā tas norāda failu un rindu, un Jūsu strādājošā vietne paliek neskarta. Ja restartējat bez pārbaudes, nginx ar kļūdu vairs nestartējas un visas Jūsu vietnes ir nepieejamas (nodarbība 6.1).
Default server: ko saņem nezināms nosaukums?
Kas notiek, ja kāds pieprasa Jūsu serveri ar nosaukumu, kas nav norādīts nevienā server_name, vai vienkārši ar IP adresi? Tad nginx izvēlas default server: bloku ar default_server aiz listen vai citādi pirmo bloku, ko tas atrada. Ja par to nepadomājat, tā būs kāda no Jūsu īstajām vietnēm.
Labāk ir izveidot atsevišķu bloku, kas šādus pieprasījumus noraida:
# /etc/nginx/sites-available/000-default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}444 ir īpašs nginx kods: savienojums tiek aizvērts bez atbildes. Skeneri, kas pārbauda IP adreses pēc kārtas, tā neko neredz. Https (portam 443) default server darbojas nedaudz citādi, jo tam nepieciešams sertifikāts; pie tā atgriezīsimies nodarbībā 7.3.
nginx kā reverse proxy
Ja uz 127.0.0.1:3000 darbojas lietotne (nodarbība 6.3) vai uz 127.0.0.1:3001 konteiners (nodarbība 9.3), nginx padara to pieejamu no ārpuses:
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;
}
}Četras proxy_set_header rindas ir svarīgas. Bez Host lietotne nezina, ar kādu nosaukumu tā tiek apmeklēta. Bez X-Forwarded-For lietotne redz katru apmeklējumu kā nākošu no 127.0.0.1 (proxy), nevis no apmeklētāja īstās adreses. Bez X-Forwarded-Proto lietotne domā, ka viss notiek caur http, un dažkārt veido saites vai sīkdatnes priekš http, lai gan Jūsu vietne darbojas caur https. Daudzām lietotnēm ir iestatījums, lai uzticētos šīm galvenēm ("trusted proxy"); norādiet tur tikai 127.0.0.1, citādi jebkurš apmeklētājs var nosūtīt viltotu adresi.
Lietotnēm, kas izmanto websockets (tiešraides atjauninājumi, piemēram, Uptime Kuma), vajag vēl divas rindas: proxy_http_version 1.1; un Upgrade un Connection nodošanu. Lietotnes dokumentācijā parasti precīzi norādīts, kuras.
Webroot tiesības
Debian un Ubuntu vidē nginx savus darba procesus palaiž kā lietotājs www-data. Tam jāspēj Jūsu failus lasīt, bet nav jāspēj tos rakstīt. Labs sadalījums (nodarbība 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) pārvaldāt failus, grupa www-data drīkst lasīt, pārējie neko. Ja vietnei kaut kur jāraksta, piemēram, augšupielāžu mapē, piešķiriet www-data rakstīšanas tiesības tikai šai mapei. Nekad chmod 777 (nodarbība 10.2). Ja saņemat 403 Forbidden, apskatiet vietnes kļūdu žurnālu: tur būs permission denied ar ceļu.
Daži citi ieradumi:
- Nekādu noslēpumu webroot mapē. Rezerves kopijām (
site.zip),.envfailiem un.gitmapēm tur nav vietas; ja tās tomēr nejauši tur nonāk, tās var pieprasīt. Papildu drošības tīkls:location ~ /\. { deny all; }bloķē visus failus, kuru nosaukums sākas ar punktu (izņemot to, ko Jūs skaidri atļaujat, piemēram,/.well-known/, skatiet nodarbību 7.3 un 7.4). - Versijas slēpšana.
server_tokens off;failānginx.confnoņem versijas numuru noServergalvenes un kļūdu lapām. Tā nav īsta aizsardzība, taču skeneri saņem mazāk informācijas.
Īsi par PHP
PHP vietnēm (piemēram, WordPress) nginx sazinās ar PHP-FPM, atsevišķu pakalpojumu. Debian vidē Jūs instalējat php-fpm un server block ievietojat location ~ \.php$ bloku ar include snippets/fastcgi-php.conf; un fastcgi_pass unix:/run/php/php8.4-fpm.sock; (versijas numurs atšķiras atkarībā no laidiena). WordPress kursā tas aplūkots sīkāk.
AlmaLinux un Rocky Linux vidē
Tur nav sites-available: katru vietni Jūs ievietojat kā atsevišķu failu mapē /etc/nginx/conf.d/<naam>.conf. nginx darbojas kā lietotājs nginx, nevis www-data, un noklusējuma webroot ir /usr/share/nginx/html. SELinux pēc noklusējuma neļauj nginx izveidot savienojumu ar lietotni aiz proxy_pass; ieslēdziet to ar setsebool -P httpd_can_network_connect 1. Failiem ārpus ierastajām mapēm nepieciešama SELinux etiķete (semanage fcontext un restorecon).
Kopsavilkums
- nginx pasniedz failus vai kā reverse proxy nodod pieprasījumus lietotnei uz
127.0.0.1. - Viens server block katrai vietnei mapē
sites-available, ieslēgšana ar saiti mapēsites-enabled; klausieties gan uz80, gan uz[::]:80. - Vienmēr
nginx -tpirmssystemctl reload nginx. - Savs default server ar
return 444novērš to, ka nezināms nosaukums vai tukša IP adrese parāda kādu no Jūsu vietnēm. - Kā reverse proxy Jūs nododat
Host,X-Forwarded-ForunX-Forwarded-Proto; webroot ir lasāms lietotājamwww-data, bet nav rakstāms, un tajā nav noslēpumu.
Tests (quiz)
Uzdevums
Uzdevums O7.2: Jūsu pirmā vietne. Instalējiet nginx (vai izmantojiet Caddy no nodarbības 7.4), izveidojiet server block (apakš)domēnam, kas norāda uz Jūsu serveri, ar listen priekš IPv4 un IPv6, atsevišķiem žurnālfailiem un savu default server. Pārbaudiet ar nginx -t, pārlādējiet un pārbaudiet ar curl -I caur IPv4 un IPv6. Iestatiet webroot tiesības, kā aprakstīts nodarbībā. Aizpildiet kontrolsarakstu un ielīmējiet savu server block.
Uzdevums O7.2: Jūsu pirmā vietne
Šo uzdevumu veicat paši; neviens to nepārbauda. Atzīmējiet, ko esat izdarījuši, un atzīmējiet uzdevumu kā paveiktu.
Pēc tīrās IP adreses nekas (savienojums slēgts) vai neitrāla lapa, nekad klienta vietne. Tikai augšupielādes mape ir rakstāma www-data, pārējais tikai lasāms. Aiz starpniekservera: Host, X-Real-IP, X-Forwarded-For un X-Forwarded-Proto.
Jūsu atzīmes un piezīmes paliek tikai šajā pārlūkprogrammā; mēs tās nekur nesūtām. Ja esat pieteikušies, sadaļā Mani kursi saglabājam tikai to, ka uzdevums ir paveikts.
Vairāk lasīt
- Aizliegts (403): Jums nav atļaujas piekļūt /, izmantojot šo serveri.
- nginx dokumentācija, How nginx processes a request (server_name un default server): https://nginx.org/en/docs/http/request_processing.html
- nginx dokumentācija, Beginner's Guide: https://nginx.org/en/docs/beginners_guide.html
- nginx dokumentācija,
ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
