Konfigurišite obrnuti proxy sa Nginx-om korak po korak

  • Korištenje Nginxa kao obrnutog proxyja za poboljšanje sigurnosti, performansi i skalabilnosti.
  • Praktična konfiguracija s više servera, uravnoteženjem opterećenja i prilagođenim zaglavljima.
  • Integracija sa WordPressom i drugim stekovima putem poddirektorija i uzvodnih tokova.
  • Napredne opcije: keširanje, SSL, kontrola vremenskog ograničenja i čista struktura konfiguracije.

Konfigurišite obrnuti proxy sa nginx-om

Postavljanje obrnutog proxyja s Nginxom postalo je gotovo de facto standard kada želimo poboljšati performanse, sigurnost i fleksibilnost naših web aplikacija. Bez obzira da li postavljate jednostavan lični projekat, server za vježbu za nastavu ili infrastrukturu kompanije, prije ili kasnije ćete morati postaviti obrnuti proxy ispred svojih aplikacijskih servera.

U ovom članku ćemo tačno vidjeti šta je obrnuti proxy, kako se razlikuje od proxyja za prosljeđivanje, koje prednosti nudi, kako se uklapa u WordPress i druge platforme (Apache, Gunicorn, Kubernetes, itd.) i, prije svega, kako savršeno konfigurirati Nginx kao obrnuti proxy, uključujući balansiranje opterećenja, prilagođene zaglavlja, keširanje, SSL i praktične laboratorijske primjere s dvije Debian mašine.

Šta je proxy i po čemu se razlikuje od reverznog proxyja?

Prije nego što se dotaknemo jedne konfiguracijske datoteke, važno je imati jasno razumijevanje uloge koju proxy igra u modernoj mrežnoj arhitekturi , jer je u suprotnom vrlo lako doći u zabunu s terminima poput forward proxy, reverse proxy, CDN, load balancer, API gateway itd.

  • "Normalni" proxy (forward proxy) Proxy server se postavlja ispred grupe klijenata (na primjer, računara u kancelariji, učionici ili kućnoj mreži) i djeluje kao posrednik kada ti računari pristupaju internetu. U tipičnoj komunikaciji bez proxyja, računar A (klijent) se direktno povezuje sa serverom C (izvorni server). Sa proxyjem za prosljeđivanje, računar A komunicira sa serverom B (proxy), a server B zatim komunicira sa serverom C, prima odgovor i šalje ga nazad serveru A.
  • Obrnuti proxy predstavlja suprotan scenarioUmjesto zaštite anonimnosti klijenta, on štiti i apstrahuje jedan ili više izvornih servera. Postavljamo ga "ispred" web servera ili grupe servera koji hostiraju aplikaciju (Apache, Nginx kao web server, LiteSpeed, Gunicorn, Node.js, PHP-FPM, itd.), a sav dolazni korisnički promet prvo stiže do ovog obrnutog proxyja.

Ako imenujemo mašine, razlika postaje jasna : D bi bili korisnički računari, E obrnuti proxy, a F jedan ili više izvornih servera. Bez obrnutog proxyja, D bi direktno komunicirao sa F. Sa obrnutim proxyjem, D vidi samo E, a E odlučuje kako i kojem F da pošalje svaki zahtjev i kako da vrati odgovor D. Cilj je spriječiti bilo kojeg klijenta da se direktno poveže sa izvornim serverima.

nginx

Zašto se isplati koristiti obrnuti proxy sa Nginx-om

Korištenje Nginxa kao obrnutog proxyja nije hir. To je ključna komponenta za skaliranje web stranice, poboljšanje njene sigurnosti i pojednostavljenje njene arhitekture, posebno kada se kombiniraju različite tehnologije ili se želi jedna domena za više usluga.

Jedna od najmoćnijih prednosti je uravnoteženje opterećenja. Ako imate web stranicu s velikim prometom, jedan backend server možda neće biti dovoljan. Pomoću obrnutog proxyja možete distribuirati zahtjeve na više izvornih servera koji opslužuju isti sadržaj. Ako jedan padne ili postane preopterećen, ostali nastavljaju opsluživati ​​web stranicu, smanjujući pojedinačne tačke kvara.

Obrnuti proxy je također vrlo učinkovit sigurnosni štit jer skriva stvarnu IP adresu i druge detalje backend servera. Korisnici (i napadači) vide samo proxy. To znatno otežava pokretanje ciljanih napada. Nadalje, proxy možete ojačati pravilima zaštitnog zida (firewall), osnovnom HTTP autentifikacijom, naprednim filtriranjem prometa ili integracijom s WAF-om.

Još jedan ključni aspekt je keširanje i ubrzanje weba. Nginx, Varnish i druga rješenja za reverzni proxy mogu keširati statički i dio dinamičkog sadržaja, štedeći resurse na izvornim serverima i poslužujući odgovore sa samog proxyja, često s geografske lokacije bliže korisniku. Ovo smanjuje latenciju i dramatično poboljšava vrijeme učitavanja.

Konačno, obrnuti proxy pojednostavljuje SSL/TLS enkripciju i terminaciju. Izvorni server ne mora da se bavi enkripcijom i dešifriranjem svih HTTPS veza, jer obrnuti proxy može da djeluje kao SSL terminator, rasterećujući opterećenje CPU-a i centralizirajući upravljanje certifikatima, čak i koristeći specijalizirani hardver za SSL ubrzanje ako je potrebno.

NGINX kao obrnuti proxy: karakteristike i uloga u modernim arhitekturama

Nginx je jedan od najčešće korištenih web servera i reverznih proxyja na svijetu , kako u svojoj verziji otvorenog koda, tako i u NGINX Plus (komercijalno izdanje s naprednim funkcijama praćenja, API upravljanjem i podrškom za preduzeća). Koristi se kao statički web server, reverzni proxy, load balancer, SSL terminator, Kubernetes ingress kontroler i API gateway.

Kao obrnuti proxy, Nginx se nalazi između klijenata i backend servera (Apache, LiteSpeed, Gunicorn, PHP-FPM, Node.js, itd.) i analizira svaki dolazni zahtjev kako bi odlučio šta s njim učiniti: poslužiti ga direktno iz keša ako je statičan, proslijediti ga odgovarajućem backendu ako je dinamičan ili vratiti kontroliranu grešku ako nešto pođe po zlu.

Da bi distribuirao promet između nekoliko back-end servera, Nginx implementira različite algoritme za balansiranje opterećenja , kao što su kružni postupak (round-robin), "manje konekcija" (slanje svakog novog zahtjeva serveru s najmanje aktivnih konekcija) ili IP hashiranje (što pomaže u održavanju veze klijentske sesije s istim back-endom).

NGINX Plus i druga izvedena rješenja proširuju ove mogućnosti praćenjem u stvarnom vremenu, kontrolnim pločama statusa, naprednim provjerama ispravnosti i dinamičkim API-jima za konfiguraciju, što se vrlo dobro uklapa u cloud-native arhitekture i implementacije na Kubernetes-u gdje Nginx često djeluje kao Ingress kontroler.

nginx obrnuti proxy

Postavke laboratorije: dva Debian servera sa Nginx-om i obrnutim proxy-jem

Vrlo poučna vježba za razumijevanje Nginxa kao obrnutog proxyja uključuje rad s dvije Debian mašine : jedna djeluje kao "konačni" web server (backend), a druga kao obrnuti proxy. Iz preglednika vaše fizičke mašine uvijek ćete pristupati proxyju, koji će preusmjeravati zahtjeve na originalni web server.

Ideja je sljedeća: na prvoj mašini imate svoju web stranicu za vježbu (na primjer, iz prethodne Nginx vježbe). Preimenovat ćete njenu konfiguraciju tako da se stranica zove webserverPromijenite port za slušanje na 8080 i provjerite da li nastavlja ispravno posluživati ​​stranicu.

Konkretno, na izvornom web serveru morate:

  • Preimenuj konfiguracijsku datoteku u /etc/nginx/sites-available i svaku internu referencu na naziv stranice tako da ona postane webserver.
  • Uklonite staru simboličku vezu u sites-enabled koristeći unlink i kreirajte novu simboličku vezu koja ukazuje na preimenovanu datoteku.
  • Promijenite direktivu listen 80; a listen 8080; u bloku server koja odgovara toj web stranici.
  • Ponovo pokrenite Nginx kako bi se prihvatile promjene i provjerilo da li možete pristupiti stranici http://webserver:8080 ili putem IP adrese: 8080.

Na drugoj Debian mašini, konfigurisaćete Nginx kao obrnuti proxy . Osnovni koraci:

  • Kreirajte konfiguracijsku datoteku u /etc/nginx/sites-available s nazivom vaše testne domene, na primjer ejemplo-proxy.
  • Definiraj blok server jednostavno s portom na kojem će proxy slušati (80 ili neki drugi ako želite dodatno razlikovati uloge) i server_name s domenom ili pseudonimom vašeg proxyja.
  • Unutar bloka location /, postaviti proxy_pass upućujući na IP adresu i port backenda, na primjer proxy_pass http://192.168.1.50:8080; o http://webserver:8080; ako imate interni DNS.
  • Kreirajte simboličku vezu u sites-enabled i testirajte konfiguraciju sa nginx -t.

Ako sve prođe u redu, nakon ponovnog učitavanja Nginxa moći ćete pristupiti svojoj web stranici koristeći proxy naziv i vidjet ćete sadržaj koji se zapravo poslužuje sa backend web servera, ali koji cijelo vrijeme prolazi kroz obrnuti proxy.

Dodajte prilagođene zaglavlja kako biste demonstrirali putanju zahtjeva

Vrlo jasan način da se provjeri da li zahtjev prolazi kroz proxy i stiže do izvornog servera je dodavanje prilagođenih HTTP zaglavlja na obje strane , a zatim njihov pregled iz alata za razvojne programere u pregledniku.

Praksa se sastoji od Konfigurišite i obrnuti proxy i web server tako da uključe dodatni zaglavlje u odgovore, na primjer korištenjem direktive add_header unutar bloka location / { ... }Zaglavlje bi moglo biti nešto poput X-Host: Proxy_inverso_tunombre u proxyju i X-Host: Servidor_web_tunombre na pozadini.

Preporučena brzina protoka je obično:

  1. Prvo dodajte zaglavlje, samo u obrnutom proxyjuPonovo pokrenite Nginx i provjerite da li i dalje možete normalno pristupiti stranici.
  2. Otvorite alate za razvojne programere u pregledniku (F12) i provjerite karticu MrežaOdabir glavnog zahtjeva i pregled zaglavlja odgovora kako bi se vidio novi zaglavlje koji je dodao proxy.
  3. Sada dodajte zaglavlje u konfiguraciju izvornog web servera, sa drugačijom vrijednošću da ga razlikujete, i ponovo pokrenite Nginx na tom serveru.
  4. Osvježite stranicu onemogućavanjem keš memorije preglednika ili u privatnom prozoru, kako bi se osiguralo da odgovori zaista dolaze sa servera.

Ako je sve ispravno postavljeno, u HTTP odgovorima ćete vidjeti dva zaglavlja , jedno generirano od strane obrnutog proxyja, a drugo od strane web servera, što potvrđuje da je zahtjev pratio kompletnu putanju do i od proxyja.

nginx

"Klasična" Nginx konfiguracija kao jednostavan obrnuti proxy

Minimalna Nginx konfiguracija potrebna za rad kao obrnuti proxy je vrlo jednostavna.Ali iz te osnove se mogu dodati mnoga poboljšanja. Zamislite da želite da zahtjevi /example naprijed prema https://example.comJednostavno dodavanje bloka bi bilo dovoljno. location do bloka server prikladno:

location /example {
proxy_pass https://example.com;
}

Ovaj isječak koda pokazuje da svaki zahtjev čija putanja počinje sa /example Bit će poslano na odredište navedeno u proxy_passČesto je popraćeno drugim direktivama za podešavanje zaglavlja, vremenskih ograničenja i ponašanja preusmjeravanja.

Potpunija verzija za poddirektorij tipa bloga mogla bi imati ovaj oblik:

server {
listen 80;
server_name example.com;

lokacija / {
try_files $uri $uri/ /index.php?$query_string;
}

lokacija /blog {
proxy_pass http://blog.domain.com;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;

proxy_set_header Nadogradnja $http_upgrade;
proxy_set_header Nadogradnja veze;
proxy_set_header Host $ host;
proxy_set_header X-Real-IP $ remote_addr;
proxy_set_header X-Forwarded-Za $ proxy_add_x_forwarded_for;
proxy_set_header X-prosljeđena-proto $ šema;
proxy_set_header X-Proslijeđeni-Host $host;
proxy_set_header X-Proslijeđeni-port $server_port;

proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}

Ključ je ovdje proxy_pass pokazujući na pozadinu i skup zaglavlja koji osiguravaju da izvorni server zna stvarnu IP adresu klijenta, originalnu shemu (HTTP ili HTTPS) i druge važne podatke za logove i za aplikacije koje zavise od tih zaglavlja.

Najbolje prakse za strukturu i konfiguraciju Nginx datoteka

Kada instalirate Nginx na distribuciju poput Ubuntua ili Debiana , tipična konfiguracijska struktura je organizirana u nekoliko direktorija koje treba poštovati kako bi se izbjeglo stvaranje haosa kako broj web-stranica raste.

Ključne tačke ove strukture su :

  • /etc/nginx/nginx.conf, glavna konfiguracijska datoteka, gdje su definirane globalne direktive i uključene ostale datoteke.
  • /etc/nginx/sites-available/, koji pohranjuje konfiguracijske datoteke za svaku virtualnu lokaciju, aktivnu ili ne.
  • /etc/nginx/sites-enabled/, koji sadrži simboličke veze do web-lokacija koje su zapravo aktivne.
  • /etc/nginx/conf.d/gdje možete staviti dodatne globalne konfiguracije u datoteke .conf koji se automatski naplaćuju.

Rad sa sites-available y sites-enabled ima nekoliko prednost. Možete pripremiti konfiguraciju web-mjesta bez aktiviranja dok ne kreirate simboličku vezu, deaktivirati web-mjesta uklanjanjem samo simboličke veze i zadržati konfiguraciju svakog servisa grupiranu u jednoj, lako dostupnoj datoteci.

Unutar svake datoteke web-mjesta obično ćete pronaći nekoliko blokova serversvaki sa svojim direktivama listen, server_name i različiti blokovi locationOvi posljednji definiraju kako se obrađuju različite rute (statičke, proxy, API-ji itd.), na primjer, posluživanjem /static/ direktno s diska i slanje /api/ na Node.js backend.

Opšta preporuka je Uvijek testirajte postavke prije ponovnog učitavanja koristeći sudo nginx -tkako biste izbjegli prekid rada servisa zbog jednostavne sintaktičke greške i koristite systemctl reload nginx kad god je to moguće, jer ponovo učitava konfiguraciju bez prekidanja aktivnih veza.

Instalacija i prvi koraci s Nginxom kao obrnutim proxyjem na Ubuntu/Debianu

Ako postavljate VPS od nule ili mašinu za vježbanje, koraci za korištenje Nginxa kao obrnutog proxyja na Ubuntu 22.04 (ili sličnom) su prilično jednostavni i mogu se lako automatizirati pomoću skripti.

Tipičan redoslijed instalacije :

  • Ažurirajte pakete con sudo apt update y sudo apt upgrade -y kako biste bili sigurni da je sve ažurno.
  • Instalirajte Nginx con sudo apt install nginx -y, što će automatski pokrenuti uslugu.
  • Provjerite status servisa koristeći sudo systemctl status nginx da vidim šta izgleda kao aktivan (trčanje).
  • Otvorite zaštitni zid U slučaju korištenja UFW-a, sa sudo ufw allow 'Nginx Full' kako bi se omogućio promet na portovima 80 i 443.

Nakon što instalirate Nginx, možete Kreirajte svoj prvi virtuelni host en /etc/nginx/sites-available/ejemplo.com i povežite ga sites-enabledOdatle, samo trebate dodati blok location / uraditi proxy_pass do pozadinskog sistema i preporučenih zaglavlja kako bi aplikacija na drugoj strani primila sve potrebne informacije.

U naprednijim okruženjima, uobičajeno je da se Nginx prati drugim komponentama kao što su Certbot za dobijanje Let's Encrypt certifikata, Gunicorn za Python aplikacije ili čak konfigurisanje obrnutog proxyja na Raspberry Pi-ju koji prosleđuje saobraćaj ka internim servisima (NAS, administratorske ploče itd.) sa preusmeravanjima portova sa rutera na mašinu sa Nginx-om.

Napredne opcije: balansiranje opterećenja, keširanje, SSL i fino podešavanje proxy politika

Nakon što savladate osnovno podešavanje obrnutog proxyja, primamljivo je stati tu. Ali Nginx nudi mnoge direktive koje vam omogućavaju da maksimizirate performanse i kontrolu.

para kreirajte uravnoteživač opterećenja prvo definirate blok upstream sa backend serverima, a zatim koristite proxy_pass pokazujući na to uzvodno:

upstream myapp1 {
server backend1.example.com;
server backend2.example.com;
}

server {
slušajte 80;
server_name example.com;

lokacija / {
proxy_pass http://myapp1;
greška proxy_next_upstream istekla je;
}
}

Da biste direktno sa proxyja prikazivali statički sadržaj , možete definirati dodatni blok lokacije:

server {
listen 80;
server_name example.com;

lokacija / {
proxy_pass http://backend.example.com;
}

lokacija /statična/ {
korijen /putanja/do/statičkih/datoteka;
ističe 30d;
}
}

Što se tiče direktive proxy_*Neki od najčešće korištenih su:

  • proxy_set_header prilagoditi zaglavlja kao što su Host, X-Real-IP o X-Forwarded-ProtoOsnove modernih web aplikacija.
  • proxy_cache y proxy_cache_pathZa aktiviranje i konfiguriranje obrnutih proxy keš memorija koje smanjuju opterećenje pozadinskog sistema.
  • proxy_buffering odlučiti da li Nginx baferuje odgovore ili ih strimuje, što može smanjiti latenciju u određenim API-jima.
  • proxy_connect_timeout, proxy_read_timeout y proxy_send_timeoutZa kontrolu kada se backend smatra nereagujućim i prelazak na sljedeći ili vraćanje greške.
  • proxy_ssl i povezani parametri ako je promet između Nginxa i backenda šifriran HTTPS-om.

Kada sastavite sve ove dijelove - obrnuti proxy, balansiranje opterećenja, keširanje, SSL i nadzor - Nginx postaje centralno čvorište kroz koje prolazi apsolutno sav promet vaše aplikacije. Poznavanje kako ga pravilno konfigurirati i razumijevanje njegove uloge u arhitekturi čini svu razliku između krhkog sistema i onog sposobnog za skaliranje, otpor napadima i pružanje vrlo niskog vremena odziva čak i pod velikim opterećenjem.


Dodaj kao preferirani izvor na Googleu