Posts

nginx: Kompresija i keširanje

Ciljevi lekcije Nakon ove lekcije trebalo bi da: podesiš gzip kompresiju bez trošenja procesora na sadržaj koji se ne isplati kompresovati razumeš odnos expires zaglavlja i strategije imenovanja fajlova postaviš proxy_cache i pratiš njegovu efikasnost serviraš stari sadržaj kada backend padne, umesto da vraćaš grešku rešiš pitanje invalidacije keša u besplatnoj verziji nginx-a 1. gzip kompresija Tekstualni sadržaj se kompresuje na oko četvrtinu veličine. Za HTML, CSS, JavaScript i JSON to je najjeftinije poboljšanje performansi koje postoji. http { gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 5; gzip_min_length 256; gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml application/rss+xml application/atom+xml image/svg+xml font/ttf font/otf; } Objašnjenja za ono što nije očigledno: ...

nginx: Aplikacioni backendi

Ciljevi lekcije Nakon ove lekcije trebalo bi da: povežeš nginx sa PHP-FPM-om preko FastCGI protokola, i to bezbedno postaviš Python aplikaciju iza Gunicorn-a ili uWSGI-ja pustiš Node.js aplikaciju u produkciju iza reverse proxy-ja napišeš systemd unit koji drži aplikaciju živom rešiš probleme sa dozvolama nad socket fajlovima 1. Tri načina komunikacije nginx ne izvršava aplikacioni kod. On saobraća sa zasebnim procesom, na jedan od tri načina: Protokol Direktiva Tipično za FastCGI fastcgi_pass PHP-FPM HTTP proxy_pass Node.js, Gunicorn, Puma, Kestrel uWSGI uwsgi_pass Python preko uWSGI servera Izbor ne zavisi od jezika nego od toga šta aplikacioni server govori. Gunicorn govori HTTP, pa se ka njemu ide proxy_pass -om iako je Python. uWSGI govori sopstveni binarni protokol, pa ide uwsgi_pass -om. Sve tri postavke dele isti obrazac: klijent → nginx → [socket ili TCP port] → aplikacioni proces ↑ statika ide odavde, sa diska S...

nginx: HTTPS i TLS

Ciljevi lekcije Nakon ove lekcije trebalo bi da: izdaš i automatski obnavljaš Let's Encrypt sertifikat napišeš ispravnu TLS konfiguraciju ručno, ne samo kroz certbot podesiš preusmeravanje sa HTTP-a na HTTPS bez petlji razumeš HSTS i rizike koje nosi testiraš postavku alatima umesto da pretpostavljaš da radi 1. Šta ti treba Za HTTPS su potrebne tri stvari: privatni ključ, sertifikat koji potvrđuje da ključ pripada tvom domenu, i konfiguracija koja ih spaja. Sertifikate izdaju sertifikaciona tela (CA). Let's Encrypt ih izdaje besplatno i automatizovano, pa je danas podrazumevani izbor za ogromnu većinu sajtova. Komercijalne CA imaju smisla samo kada ti treba nešto što Let's Encrypt ne nudi — OV/EV validacija, sertifikati sa dužim rokom, ili garancija. Preduslov: domen mora da pokazuje na tvoj server pre nego što pokušaš izdavanje. Let's Encrypt proverava vlasništvo tako što traži da mu odgovoriš na tom domenu. Ako DNS nije podešen, ništa neće raditi. dig ...

nginx: Load balancing

Ciljevi lekcije Nakon ove lekcije trebalo bi da: definišeš grupu backend servera kroz upstream blok biraš metod raspodele prema prirodi aplikacije podesiš keep-alive konekcije prema backend-u i znaš zašto je to obavezno razumeš pasivne provere zdravlja i njihova ograničenja u besplatnoj verziji rešiš pitanje sesija kada aplikacija nije bezstanjna 1. upstream blok Umesto jedne adrese u proxy_pass , definišeš imenovanu grupu: upstream aplikacija { server 10.0.1.10:3000; server 10.0.1.11:3000; server 10.0.1.12:3000; } server { listen 80; server_name example.com; location / { proxy_pass http://aplikacija; include proxy_params; } } upstream ide u http kontekst, van server blokova. Ime grupe je proizvoljno i koristiš ga u proxy_pass na mestu gde bi inače stajao host. Isti mehanizam radi i sa unix socket-ima, što je korisno kada više instanci aplikacije radi na istoj mašini: upstream aplikacija { server unix:/run/app-1.soc...

nginx: Reverse proxy

Ciljevi lekcije Nakon ove lekcije trebalo bi da: razumeš razliku između proxy_pass sa URI-jem i bez njega — to je najvažnija stvar u ovoj lekciji znaš koja zaglavlja moraš da prosleđuješ i zašto podesiš tajmaute i baferisanje prema potrebama aplikacije omogućiš WebSocket saobraćaj kroz nginx prepoznaš uzrok grešaka 502, 504 i 413 1. Šta radi reverse proxy Forward proxy stoji ispred klijenta i izlazi na internet u njegovo ime. Reverse proxy stoji ispred servera i prima saobraćaj u njegovo ime. klijent ──▶ nginx :443 ──▶ aplikacija :3000 (javno) (127.0.0.1, nedostupna spolja) Zašto ne pustiti aplikaciju direktno na port 443? Zato što nginx radi niz stvari koje aplikacija ne bi trebalo da radi: TLS terminacija — aplikacija govori običan HTTP, ne mora da zna ništa o sertifikatima statika sa diska — CSS i slike ne prolaze kroz aplikacioni proces spori klijenti — nginx prihvata zahtev u komadima i prosleđuje ga backend-u tek kad je kompletan, pa apl...

nginx: Serviranje statičkog sadržaja

Ciljevi lekcije Nakon ove lekcije trebalo bi da: razumeš razliku između root i alias i znaš kada koji koristiš vladaš direktivom try_files u svim njenim oblicima umeš da podesiš index , autoindex i MIME tipove postaviš prilagođene stranice grešaka dijagnostikuješ 403 i 404 sistematski, umesto pogađanjem 1. root — spajanje putanje root određuje osnovni direktorijum. nginx sastavlja putanju do fajla prostim nadovezivanjem: putanja_do_fajla = root + uri server { root /var/www/example.com/html; location /slike/ { # root se nasleđuje } } Zahtev Fajl na disku / /var/www/example.com/html/ → traži se index /o-nama.html /var/www/example.com/html/o-nama.html /slike/logo.png /var/www/example.com/html/slike/logo.png Primeti da se prefiks iz location bloka zadržava u putanji. /slike/ iz zahteva postaje slike/ na disku. root možeš da nadjačaš u pojedinačnom location bloku: server { root /var/www/example.com/html; locati...