Visas sistēmas darbojas Tavs IP: 216.73.217.36 info@cloudhosting.lv +371 66 66 29 69 Klientu zona

← Visi jautājumi

Kā iestatīt nginx kā reverso proxy ar bezmaksas SSL

Šī pamācība parāda, kā novietot nginx priekšā vienai vai vairākām tīmekļa lietotnēm uz viena Linux servera, terminēt TLS ar bezmaksas Let's Encrypt sertifikātu un atstāt atjaunošanu automātikai. Tā domāta tev, ja darbini Node.js, Python, Go vai līdzīgas lietotnes uz VPS vai dedicētā servera un gribi vienu tīru HTTPS ieejas punktu. Komandas ir Debian un Ubuntu videi; citās distribūcijās atšķiras tikai pakotņu pārvaldnieka izsaukumi.

Kāpēc vispār vajadzīgs reversais proxy

Reversais proxy ir viens process, kam pieder porti 80 un 443 un kas pārsūta pieprasījumus aizmugures lietotnēm, kuras klausās uz lokāliem portiem. Trīs praktiski iemesli to darbināt:

  • Viens ieejas punkts. Internetam atvērts ir tikai nginx. Tavas lietotnes piesaistās pie 127.0.0.1:3000, 127.0.0.1:8080 un tā tālāk, un tieši tām piekļūt nevar.
  • TLS terminācija. Sertifikāti glabājas vienā vietā. Aizmugures lietotnes runā parastu HTTP uz localhost, un to TLS kodam tev nekad nav jāpieskaras.
  • Vairākas lietotnes uz viena servera. nginx maršrutē pēc resursdatora vārda, tāpēc app.example.com un api.example.com var būt dažādi procesi uz vienas mašīnas ar vienu IP adresi.

Pa ceļam tu iegūsti arī piekļuves žurnālus, gzip, pieprasījumu ierobežošanu un statisko failu apkalpošanu, bet galvenais iemesls ir trīs punkti augstāk.

Uzstādi nginx

sudo apt update
sudo apt install nginx
sudo systemctl enable --now nginx

Pārbaudi, vai tas atbild:

curl -I http://127.0.0.1

Tev jāredz HTTP/1.1 200 OK un galvene Server: nginx. Ja lieto ugunsmūri, atver abus tīmekļa portus, piemēram sudo ufw allow "Nginx Full". Pirms turpini, pārliecinies, ka domēna DNS A ieraksts norāda uz serveri: bez tā certbot vēlāk beigsies ar kļūdu.

Tīrs proxy_pass servera bloks

Pieņemsim, ka lietotne klausās uz porta 3000. Izveido /etc/nginx/sites-available/app.example.com:

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

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        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;
    }
}

Galvenes ir tikpat svarīgas kā proxy_pass rinda:

  • Host pasaka aizmugurei, kurš domēns tika pieprasīts. Bez tās lietotne redz 127.0.0.1:3000 un veido nepareizus absolūtos URL un pāradresācijas.
  • X-Forwarded-For nes īsto klienta IP adresi. Bez tās katrs apmeklētājs lietotnes žurnālos izskatās kā 127.0.0.1, un ierobežošana vai bloķēšana pēc IP kļūst bezjēdzīga.
  • X-Forwarded-Proto pasaka lietotnei, vai sākotnējais pieprasījums bija HTTP vai HTTPS, un tas novērš pāradresācijas cilpas pēc TLS ieslēgšanas.

Aktivizē vietni un pārlādē:

sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Palaid nginx -t katru reizi pirms pārlādes; tas noķer sintakses kļūdas, kamēr vecā konfigurācija turpina strādāt. Otrai lietotnei nokopē bloku, nomaini server_name un portu proxy_pass rindā, gatavs.

Bezmaksas SSL ar certbot un nginx spraudni

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d app.example.com

nginx spraudnis pierāda domēna piederību caur portu 80, saņem Let's Encrypt sertifikātu un rediģē tavu servera bloku: pievieno listen 443 ssl sadaļu ar sertifikāta ceļiem un, ja piekrīti uzvednei, arī HTTP uz HTTPS pāradresāciju. Piekrīti. Rezultāta pāradresācija izskatās šādi, un to vari uzrakstīt arī ar roku:

server {
    listen 80;
    listen [::]:80;
    server_name app.example.com;
    return 301 https://$host$request_uri;
}

Darbojas arī vairāki domēni vienā komandā: -d app.example.com -d www.app.example.com.

Pārbaudi, vai automātiskā atjaunošana tiešām strādā

Let's Encrypt sertifikāti ir derīgi 90 dienas. certbot pakotne uzstāda systemd taimeri, kas nostrādā divreiz dienā un atjauno visu, kam palicis mazāk par 30 dienām. Uzticies tam tikai pēc pārbaudes:

sudo certbot renew --dry-run
systemctl list-timers | grep certbot
sudo certbot certificates

Izmēģinājuma palaišana simulē pilnu atjaunošanu, neaiztiekot īsto sertifikātu. Ja tā izdodas, atjaunošana strādās. Spraudnis pēc katras atjaunošanas pārlādē nginx, tāpēc jaunais sertifikāts tiek lietots bez dīkstāves. Tik un tā ieliec kalendārā atgādinājumu pēc 60 dienām un vienreiz pārbaudi certbot certificates; klusas atjaunošanas kļūmes ir retas, bet dārgas.

Biežākās kļūdas

  • Trūkst pārsūtīto galveņu. Visbiežākā kļūda. Simptomi: nepareizi URL pāradresācijās, visi klienti žurnālos kā 127.0.0.1, pieteikšanās cilpa pēc HTTPS ieslēgšanas. Četras proxy_set_header rindas augstāk novērš visas trīs problēmas.
  • WebSocket savienojumi neizveidojas. nginx pēc noklusējuma nepārsūta protokola jaunināšanu. WebSocket ceļam pievieno:
    location /ws/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 3600s;
        proxy_buffering off;
    }
    Bez proxy_read_timeout nginx pārtrauc dīkstāvē esošus savienojumus pēc 60 sekundēm.
  • Buferizācija sabojā straumēšanu. Server-sent events un long-polling atbildes pienāk vienā vēlā gabalā, jo nginx buferizē atbildi. Šīm location sadaļām iestati proxy_buffering off;.
  • Augšupielādes krīt ar 413. Noklusējuma client_max_body_size ir 1m. Palielini to servera blokā, piemēram client_max_body_size 50m;.
  • Pārlāde bez testa. Viena drukas kļūda nogāž visas vietnes, ko nginx apkalpo. Padari nginx -t par refleksu.

Kur to darbināt

Viss aprakstītais ērti ietilpst mazā virtuālajā serverī; pašam nginx pietiek ar dažiem megabaitiem RAM. Ja tev vajag mašīnu, uz kuras trenēties vai turēt īsto projektu, mūsu VPS plāni darbojas mūsu pašu Tier 3+ datu centrā Rīgā mūsu pašu tīklā. Un ja projekts izaug no domēna validācijas Let's Encrypt, piemēram, kad interneta veikalam vajadzīga organizācijas validācija vai sertifikāts ar garantiju, apskati mūsu komerciālos SSL sertifikātus. nginx konfigurācija paliek tieši tāda pati, mainās tikai sertifikāta faili.

Gribi, lai to darām mēs?
VPS. NVMe virtuālie serveri, gatavi minūtes laikā.
Uzzināt vairāk

Gatavs sākt?

Palaid dažās minūtēs vai aprunājies ar inženieri par piemērotāko risinājumu.