Konfiguriranje Nginxa kao obrnutog proxyja za pozadinske aplikacije
Uvod
U modernim postavkama servera, aplikacije rijetko komuniciraju direktno s internetom. Umjesto toga, obrnuti proxy se nalazi ispred njih i obrađuje dolazne zahtjeve klijenata. Nginx je jedan od najpopularnijih alata za ovaj posao jer je brz, pouzdan i jednostavan za konfiguriranje. U ovom vodiču naučit ćete kako konfigurirati Nginx kao obrnuti proxy za aplikaciju na pozadinskom serveru koja radi na istom serveru.
Što je obrnuti proxy?
Obrnuti proxy je server koji:
- Prihvaća zahtjeve od klijenata (preglednici, API-ji, itd.)
- Prosljeđuje te zahtjeve aplikaciji na pozadinskom serveru
- Šalje odgovor pozadinskog servera natrag klijentu
Klijent nikada ne komunicira direktno s aplikacijom na pozadinskom serveru.
Obrnuti proxy vs direktni pristup
Bez obrnutog proxyja:
Klijent ---> Aplikacija na pozadinskom serveru (port 3000)
S obrnutim proxyjem:
Klijent ---> Nginx (port 80, 443) ---> Aplikacija na pozadinskom serveru (port 3000)
Zašto koristiti Nginx kao obrnuti proxy?
Korištenje Nginxa ispred vaše aplikacije omogućuje vam:
- Izlaganje samo portova 80/443 internetu
- Skrivanje pozadinskih servisa od direktnog pristupa
- Prekidanje HTTPS (TLS) na jednom mjestu
- Dodavanje zapisivanja, kontrole pristupa i ograničavanja brzine
- Pokretanje više aplikacija na jednom serveru
Za sistemske administratore, to znači bolju sigurnost i lakše upravljanje.
Scenarij korišten u ovom vodiču
Kako bismo stvari pojednostavili, koristit ćemo sljedeću postavku:
- Nginx sluša na portu
80 - Aplikacija na pozadinskom serveru sluša na
127.0.0.1:3000 - Zahtjevi na
http://example.comprosljeđuju se na pozadinski server
Dijagram toka prometa
[ Preglednik ] | v [ Nginx example.com:80,443 ] | v [ Aplikacija na pozadinskom serveru 127.0.0.1:3000 ]
Preduvjeti
Prije početka, provjerite imate li:
- Linux server s najnovijim Debian stable
- Root ili sudo pristup
- Aplikaciju na pozadinskom serveru koja već radi (na primjer, Node.js, Python ili Java aplikacija)
- Osnovno poznavanje Linux terminala
Instalirajte Nginx
Ažurirajte popise paketa i instalirajte Nginx i curl (za testiranje postavki):
sudo apt update
sudo apt install nginx curl
Provjerite radi li Nginx:
systemctl status nginx
Trebali biste vidjeti "active (running)" u izlazu.
Testirajte Nginx lokalno:
curl http://localhost
Ako Nginx radi, primit ćete zadanu stranicu dobrodošlice.
Razumijevanje strukture konfiguracije Nginxa
Konfiguracijske datoteke Nginxa obično se pohranjuju u /etc/nginx/. Važne direktorije:
/etc/nginx/nginx.conf— glavna konfiguracijska datoteka/etc/nginx/sites-available/— konfiguracijske datoteke stranica (nisu aktivne)/etc/nginx/sites-enabled/— omogućene konfiguracije stranica (simboličke poveznice)
Nginx čita konfiguracijske datoteke iz mape sites-enabled, a ne direktno iz sites-available. Preporučuje se kreirati konfiguracijske datoteke stranica u sites-available, a zatim kreirati simboličke poveznice na njih u sites-enabled.
Kreirajte konfiguraciju obrnutog proxyja
Kreirajte novu datoteku stranice
sudo nano /etc/nginx/sites-available/reverse-proxy.conf
Dodajte konfiguraciju obrnutog proxyja
server { listen 80; server_name 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; } }
Razumijevanje konfiguracije
Blok servera
server { listen 80; server_name example.com; }
listen 80;— Nginx sluša HTTP promet na portu 80server_name example.com;— naziv domene na koji ovaj blok servera odgovara
Blok lokacije
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; }
location /— odgovara svim dolaznim URL-ovimaproxy_pass— prosljeđuje zahtjeve aplikaciji na pozadinskom serveru
Proxy zaglavlja
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;
Ova zaglavlja osiguravaju da pozadinski server zna:
- Izvorni naziv domene
- Stvarnu IP adresu klijenta
- Je li zahtjev bio HTTP ili HTTPS
Bez ovih zaglavlja, aplikacije na pozadinskom serveru mogu bilježiti netočne informacije o klijentima.
Omogućite konfiguraciju
Onemogućite zadanu Nginx stranicu kako biste izbjegli sukobe na portu 80:
sudo rm /etc/nginx/sites-enabled/default
Kreirajte simboličku poveznicu za omogućavanje stranice:
sudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/
Testirajte konfiguraciju na sintaktičke greške:
sudo nginx -t
Ako je test uspješan, ponovno učitajte Nginx:
sudo systemctl reload nginx
Testirajte obrnuti proxy
Testirajte sa servera:
curl http://example.com
Otvorite http://example.com u pregledniku za testiranje. Trebali biste primiti odgovor od vaše aplikacije na pozadinskom serveru, a ne zadanu stranicu Nginxa. Ako je sve ispravno konfigurirano, aplikacija na pozadinskom serveru će se učitati.
Kako se zahtjev obrađuje
- Klijent šalje zahtjev na example.com
- Nginx prima zahtjev na portu 80
- Nginx prosljeđuje zahtjev na 127.0.0.1:3000
- Pozadinski server obrađuje zahtjev
- Odgovor se vraća kroz Nginx
- Klijent prima odgovor
Uobičajene greške i rješavanje problema
Pozadinski server ne radi
- Provjerite radi li aplikacija
- Potvrdite ispravnost porta
ss -tuln | grep 3000
Pogrešna adresa proxy_pass
- Uvijek uključite
http:// - Provjerite ispravnost IP adrese i porta
Zaboravljanje ponovnog učitavanja Nginxa
Nakon svake promjene konfiguracije:
sudo systemctl reload nginx
Vatrozid blokira pristup
Provjerite je li port 80 otvoren:
sudo ufw allow 80
Opcionalna poboljšanja
Kada obrnuti proxy radi, razmislite o:
- Omogućavanju HTTPS-a s Let's Encrypt
- Pokretanju više aplikacija na pozadinskom serveru
- Dodavanju zapisnika pristupa i grešaka
- Konfiguriranju balansiranja opterećenja
- Podršci za WebSocket veze
Konfiguracija HTTPS-a
U produkcijskim okruženjima uvijek biste trebali koristiti HTTPS umjesto HTTP-a. HTTPS šifrira promet između klijenta i vašeg servera, štiteći lozinke, API tokene, kolačiće i druge osjetljive podatke. Nginx podržava HTTPS koristeći SSL/TLS certifikate. U ovom dijelu naučit ćete:
- Što je Certbot
- Kako instalirati Certbot
- Kako Certbot automatski mijenja konfiguraciju Nginxa
- Kako ručno konfigurirati Nginx koristeći kupljeni certifikat
Što je Certbot?
Certbot je alat koji automatski dobiva i instalira besplatne SSL/TLS certifikate od Let's Encrypt. Može:
- Zatražiti besplatni certifikat
- Provjeriti vlasništvo nad domenom
- Automatski konfigurirati Nginx
- Postaviti automatsko obnavljanje certifikata
Za početnike i većinu produkcijskih okruženja, Certbot je najlakši i najsigurniji način za omogućavanje HTTPS-a.
Instaliranje Certbota
Ažurirajte popise paketa:
sudo apt update
Instalirajte Certbot i Nginx dodatak:
sudo apt install certbot python3-certbot-nginx
Paket python3-certbot-nginx omogućuje Certbotu automatsko mijenjanje vaše Nginx konfiguracije.
Dobivanje i instaliranje certifikata
Prije pokretanja Certbota, provjerite:
- Vaše ime domene pokazuje na javnu IP adresu vašeg servera
- Nginx radi
- Portovi 80 i 443 su otvoreni u vatrozidu
Pokrenite:
sudo certbot --nginx
Certbot će:
- Pitati koju domenu želite osigurati
- Provjeriti vlasništvo nad domenom
- Automatski ažurirati vašu Nginx konfiguraciju
- Ponovno učitati Nginx
Certbot automatski mijenja vašu Nginx konfiguraciju. Obično dodaje novi blok servera za port 443 (HTTPS), dodaje putanje SSL certifikata, konfigurira preusmjeravanje s HTTP-a na HTTPS ako odaberete tu opciju i dodaje preporučene SSL postavke.
Primjer konfiguracije dodane od strane Certbota:
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 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; } }
Certbot također može izmijeniti HTTP blok za preusmjeravanje prometa:
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
Budući da Certbot automatski uređuje konfiguracijske datoteke, preporučuje se:
- Čuvati sigurnosne kopije vaše konfiguracije
- Razumjeti koje su promjene napravljene
- Uvijek testirati konfiguraciju nakon promjena
Testirajte konfiguraciju:
sudo nginx -t
Automatsko obnavljanje certifikata
Let's Encrypt certifikati vrijede 90 dana. Certbot automatski instalira timer za obnavljanje. Možete testirati obnavljanje s:
sudo certbot renew --dry-run
Ako je ispravno konfigurirano, obnavljanje će se dogoditi automatski bez prekida rada.
Korištenje kupljenog SSL certifikata
Ako kupite SSL certifikat od autoriteta za certifikate (CA), morate ručno konfigurirati Nginx. Nakon kupnje, obično dobijete:
- Datoteku certifikata (npr.
example.com.crt) - Privatni ključ (
example.com.key) - Datoteku CA paketa (
ca_bundle.crt)
Kreirajte sigurni direktorij:
sudo mkdir -p /etc/nginx/ssl
sudo chmod 700 /etc/nginx/ssl
Kopirajte svoje datoteke certifikata u ovaj direktorij.
Primjer HTTPS konfiguracije s kupljenim certifikatom:
server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_trusted_certificate /etc/nginx/ssl/ca_bundle.crt; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; 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; } }
Dodajte preusmjeravanje s HTTP-a na HTTPS:
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }
Ponovno učitajte Nginx nakon ručne konfiguracije:
sudo nginx -t
sudo systemctl reload nginx
Za početnike sistemske administratore, Certbot se snažno preporučuje osim ako vaša organizacija ne zahtijeva komercijalne certifikate.
Sažetak
U ovom vodiču naučili ste:
- Što je obrnuti proxy i zašto je koristan
- Kako Nginx prosljeđuje zahtjeve aplikacijama na pozadinskom serveru
- Kako kreirati i omogućiti konfiguraciju obrnutog proxyja
- Kako testirati i rješavati uobičajene probleme
- Kako konfigurirati HTTPS
Nginx obrnuto proxyiranje je temeljna vještina za sistemske administratore i široko se koristi u produkcijskim okruženjima.