40 odabranih Nginx intervju pitanjaš
Jednog dana, moj uÄenik Xiao Er se potajno zaputio na intervju u jednu firmu, ali se vratio i rekao mi da je pao na Nginx pitanjima i pitao me Å”ta da radi.
Prvo sam ga bez oklevanja kritikovao ā kako može iza leÄa svog voÄe da ide na intervjue? Ali, videvÅ”i njegovo tužno lice, ipak mi je bilo žao, pa sam mu pripremio 40 Nginx intervju pitanja u nadi da Äe mu pomoÄi.
- Å ta je Nginx?
- Koje prednosti ima Nginx?
- Koja su scenariji upotrebe Nginxa?
- Kako Nginx obraÄuje zahteve?
- Kako Nginx postiže visoku istovremenost?
- Å ta je forward proxy?
- Å ta je reverse proxy?
- Koje su prednosti reverse proxy servera?
- Koja je struktura direktorijuma Nginxa?
- Koje module i atribute ima konfiguracioni fajl nginx.conf?
- Razlika izmeÄu cookie i session?
- ZaŔto Nginx ne koristi viŔe niti?
- Razlika izmeÄu nginx i apache
- Å ta je razdvajanje dinamiÄkih i statiÄkih resursa?
- ZaÅ”to raditi razdvajanje dinamiÄkih i statiÄkih resursa?
- Å ta je CDN servis?
- Kako Nginx radi razdvajanje dinamiÄkih i statiÄkih resursa?
- Kako je implementiran algoritam za balansiranje optereÄenja u Nginxu? Koje strategije postoje?
- Kako reÅ”iti problem CORS-a na front-endu pomoÄu Nginxa?
- Kako konfigurisati virtuelne hostove u Nginxu?
- Koja je uloga location direktive?
- Kako se radi ograniÄavanje protoka (rate limiting)?
- Da li poznajete leaky bucket i token bucket algoritme?
- Kako konfigurisati visoku dostupnost Nginxa?
- Kako Nginx odreÄuje da odreÄena IP adresa ne može da pristupa?
- U nginxu, kako spreÄiti obradu zahteva koji koriste nedefinisano ime servera?
- Kako ograniÄiti pristup iz pretraživaÄa?
- Å ta su Rewrite globalne promenljive?
- Kako Nginx implementira proveru zdravlja (health check) pozadinskih servisa?
- Kako Nginx ukljuÄuje kompresiju?
- Koja je uloga ngx_http_upstream_module?
- Å ta je C10K problem?
- Da li Nginx podržava kompresiju zahteva ka upstream serverima?
- Kako dobiti trenutno vreme u Nginxu?
- Kako objasniti svrhu opcije -s na Nginx serveru?
- Kako dodati module na Nginx server?
- Kako u produkciji postaviti broj worker procesa?
- Nginx status kodovi

Å ta je Nginx?
Nginx je lagani/visoko-performantni reverse proxy web server, koji se koristi za HTTP, HTTPS, SMTP, POP3 i IMAP protokole. On implementira veoma efikasan reverse proxy i balansiranje optereÄenja; može da obradi 20.000-30.000 istovremenih konekcija, a zvaniÄno se navodi da podržava 50.000 istovremenih. Danas mnogi korisnici web sajtova u Kini koriste nginx, na primer: Sina, NetEase, Tencent itd.
Koje prednosti ima Nginx?
- ViŔeplatformski, jednostavna konfiguracija.
- NeblokirajuÄi, visoka istovremenost konekcija: obraÄuje 20.000-30.000 istovremenih konekcija, zvaniÄno podržava 50.000.
- Mala potroŔnja memorije: 10 pokrenutih Nginx procesa zauzima samo 150M memorije.
- Niska cena, i open source.
- Visoka stabilnost, veoma mala verovatnoÄa pada servera.
- UgraÄena funkcija provere zdravlja: ako jedan server padne, obaviÄe se provera zdravlja, i zahtevi se viÅ”e neÄe slati na taj server. Zahtevi Äe biti preusmereni na druge Ävorove.
Koja su scenariji upotrebe Nginxa?
- HTTP server. Nginx je http servis koji može nezavisno da pruža http uslugu. Može se koristiti kao statiÄki web server.
- Virtuelni host. OmoguÄava da se na jednom serveru kreira viÅ”e virtuelnih sajtova, na primer za liÄne sajtove.
- Reverse proxy i balansiranje optereÄenja. Kada broj poseta sajtu dostigne odreÄeni nivo, jedan server viÅ”e ne može da zadovolji zahteve korisnika, pa je potrebno koristiti klaster od viÅ”e servera ā Nginx se može koristiti kao reverse proxy. ViÅ”e servera može ravnomerno da podeli optereÄenje, izbegavajuÄi situaciju u kojoj jedan server pada zbog prevelikog optereÄenja dok drugi stoji neiskoriÅ”Äen.
- U Nginxu se takoÄe može konfigurisati upravljanje sigurnoÅ”Äu, na primer može se koristiti za izgradnju API gateway-a, gde se vrÅ”i intercept-ovanje svakog API servisa.
Kako Nginx obraÄuje zahteve?
server { # PoÄetak prvog Server bloka, predstavlja nezavisnu virtuelnu host stanicu
listen 80; # Port koji pruža uslugu, podrazumevano 80
server_name localhost; # Domen odnosno ime hosta koji pruža uslugu
location / { # PoÄetak prvog location bloka
root html; # Koreni direktorijum stanice, ekvivalentan instalacionom direktorijumu Nginxa
index index.html index.html; # Podrazumevana poÄetna datoteka, viÅ”e njih razdvoji razmakom
} # Kraj prvog location bloka- Prvo, pri pokretanju, Nginx analizira konfiguracioni fajl i dobija portove i IP adrese koje treba da sluŔa, a zatim u Master procesu Nginxa inicijalizuje taj Socket za sluŔanje (kreira Socket, postavlja addr, reuse i druge opcije, vezuje za zadatu IP adresu i port, a zatim sluŔa).
- Zatim se fork-uje (postojeÄi proces može pozvati fork funkciju da kreira novi proces ā novi proces kreiran fork-om se naziva child proces) viÅ”e child procesa.
- Nakon toga, child procesi se takmiÄe da prihvate (accept) nove konekcije. U tom trenutku, klijent može da uspostavi konekciju sa nginx-om. Kada klijent i nginx zavrÅ”e three-way handshake i uspostave konekciju, neki child proces Äe uspeÅ”no izvrÅ”iti accept, dobiti Socket te uspostavljene konekcije, a zatim kreirati nginx-ovu enkapsulaciju konekcije, odnosno ngx_connection_t strukturu.
- Zatim se postavljaju funkcije za obradu read/write dogaÄaja, i dodaju read/write dogaÄaji kako bi se vrÅ”ila razmena podataka sa klijentom.
- Na kraju, Nginx ili klijent aktivno zatvara konekciju, i time jedna konekcija zavrŔava svoj životni ciklus.
Kako Nginx postiže visoku istovremenost?
Ako jedan server koristi model u kojem jedan proces (ili nit) odgovara za jedan zahtev, onda je broj procesa istovremeno i broj istovremenih konekcija. OÄigledno, mnogi procesi bi bili u stanju Äekanja. Å ta Äekaju? NajviÅ”e verovatno mrežni prenos.
Nginx-ov asinhroni neblokirajuÄi naÄin rada upravo iskoriÅ”Äava to vreme Äekanja. Kada treba Äekati, ti procesi postaju slobodni i spremni. Zato se deÅ”ava da mali broj procesa reÅ”ava veliki broj istovremenih zahteva.
Kako to Nginx radi? Jednostavno reÄeno: sa istih 4 procesa, ako se koristi model jedan proces po zahtevu, onda kada doÄu 4 zahteva, svaki proces obraÄuje jedan sve dok se sesija ne zatvori. U tom periodu, ako doÄe 5. zahtev, ne može se blagovremeno odgovoriti jer sva 4 procesa joÅ” nisu zavrÅ”ila; zato obiÄno postoji proces za rasporeÄivanje koji, kad god stigne novi zahtev, otvara novi proces za obradu.
Setite se, da li BIO ima ovakav problem?
Nginx ne radi tako. Za svaki pristigli zahtev, jedan worker proces preuzima obradu. Ali ne obradu od poÄetka do kraja ā do koje taÄke? Do mesta gde može doÄi do blokade, na primer prosleÄivanje zahteva ka upstream (pozadinskom) serveru i Äekanje na odgovor. Taj worker neÄe glupo Äekati; nakon slanja zahteva, registrovaÄe dogaÄaj: āAko se upstream vrati sa odgovorom, obavesti me da nastavim". Zatim odlazi na odmor. Ako u tom trenutku stigne novi zahtev, može brzo da ga obradi na isti naÄin. A kada se upstream server vrati, okida se taj dogaÄaj i worker preuzima obradu, pa zahtev nastavlja dalje.
Zato se kaže da je Nginx zasnovan na modelu dogaÄaja (event model).
Zbog prirode rada web servera, veÄi deo životnog veka svakog zahteva je u mrežnom prenosu, a vreme provedeno na samom serveru je kratko. Tu leži tajna kako nekoliko procesa reÅ”ava problem visoke istovremenosti. Drugim reÄima:
Web server je upravo tip mrežno IO-intenzivne aplikacije, a ne CPU-intenzivne.
Asinhronost, neblokirajuÄi rad, upotreba epoll-a, i mnoge optimizacije u detaljima ā to je tehniÄki temelj koji Äini Nginx onim Å”to jeste.
Å ta je forward proxy?
To je server koji se nalazi izmeÄu klijenta i originalnog servera (origin server). Da bi dobio sadržaj sa originalnog servera, klijent Å”alje zahtev proxy-ju i navodi cilj (originalni server), zatim proxy prosleÄuje zahtev originalnom serveru i vraÄa dobijeni sadržaj klijentu.
Samo klijent može da koristi forward proxy. Ukratko o forward proxy-ju: proxy koji zastupa klijenta. Na primer: OpenVPN i sliÄni alati.
Å ta je reverse proxy?
Reverse Proxy je naÄin rada u kojem proxy server prihvata konekcione zahteve sa interneta, zatim prosleÄuje zahtev serveru na internoj mreži i vraÄa rezultat dobijen sa tog servera klijentu koji je tražio konekciju sa interneta ā u tom trenutku proxy server se prema spoljaÅ”njem svetu pojavljuje kao reverse proxy server.
Ukratko o reverse proxy-ju: proxy koji zastupa server.
Koje su prednosti reverse proxy servera?
Reverse proxy server može da sakrije postojanje i karakteristike izvornog servera. On deluje kao srednji sloj izmeÄu interneta (oblaka) i web servera. Ovo je dobro sa aspekta bezbednosti, posebno kada koristite web hosting usluge.
Koja je struktura direktorijuma Nginxa?
tree /usr/local/nginx
/usr/local/nginx
āāā client_body_temp
āāā conf # Direktorijum svih konfiguracionih fajlova Nginxa
ā āāā fastcgi.conf # Konfiguracioni fajl za fastcgi parametre
ā āāā fastcgi.conf.default # Originalna rezerva fastcgi.conf
ā āāā fastcgi_params # fastcgi parametri
ā āāā fastcgi_params.default
ā āāā koi-utf
ā āāā koi-win
ā āāā mime.types # Medija tipovi
ā āāā mime.types.default
ā āāā nginx.conf # Glavni konfiguracioni fajl Nginxa
ā āāā nginx.conf.default
ā āāā scgi_params # scgi parametri
ā āāā scgi_params.default
ā āāā uwsgi_params # uwsgi parametri
ā āāā uwsgi_params.default
ā āāā win-utf
āāā fastcgi_temp # fastcgi privremeni podaci
āāā html # Podrazumevani direktorijum stanice Nginxa
ā āāā 50x.html # Fajl za elegantnu zamenu stranice greÅ”ke, npr. pri 502 greÅ”ci
ā āāā index.html # Podrazumevana poÄetna stranica
āāā logs # Direktorijum logova Nginxa
ā āāā access.log # Log pristupa
ā āāā error.log # Log greÅ”aka
ā āāā nginx.pid # pid fajl; nakon pokretanja, Nginx upisuje ID svih procesa ovde
āāā proxy_temp # Privremeni direktorijum
āāā sbin # Direktorijum Nginx komandi
ā āāā nginx # Komanda za pokretanje Nginxa
āāā scgi_temp # Privremeni direktorijum
āāā uwsgi_temp # Privremeni direktorijumKoje module i atribute ima konfiguracioni fajl nginx.conf?
worker_processes 1; # Broj worker procesa
events { # PoÄetak bloka dogaÄaja
worker_connections 1024; # Maksimalan broj konekcija po worker procesu
} # Kraj bloka dogaÄaja
http { # PoÄetak HTTP bloka
include mime.types; # Biblioteka medija tipova koje Nginx podržava
default_type application/octet-stream; # Podrazumevani medija tip
sendfile on; # UkljuÄi efikasan režim prenosa
keepalive_timeout 65; # Timeout konekcije
server { # PoÄetak prvog Server bloka, predstavlja nezavisnu virtuelnu host stanicu
listen 80; # Port koji pruža uslugu, podrazumevano 80
server_name localhost; # Domen odnosno ime hosta koji pruža uslugu
location / { # PoÄetak prvog location bloka
root html; # Koreni direktorijum stanice, ekvivalentan instalacionom direktorijumu Nginxa
index index.html index.htm; # Podrazumevana poÄetna datoteka, viÅ”e njih razdvoji razmakom
} # Kraj prvog location bloka
error_page 500502503504 /50x.html; # Pri odgovarajuÄem http status kodu, koristi 50x.html za odgovor klijentu
location = /50x.html { # PoÄetak location bloka, pristup 50x.html
root html; # Zadaje html kao odgovarajuÄi direktorijum stanice
}
}
......Razlika izmeÄu cookie i session?
ZajedniÄko:
Äuvanje korisniÄkih informacija. Format Äuvanja: key-value format, par promenljive i njenog sadržaja.
Razlika:
cookie
- Äuva se u klijentskom pretraživaÄu
- Svaki domen ima svoj cookie, ne može pristupati cookie-ju drugog domena
- Korisnik može da pregleda ili izmeni cookie
- Postavlja se preko http response poruke pretraživaÄu
- KljuÄ (za otvaranje katanca na pretraživaÄu)
session:
- Äuva se na serveru (fajl, baza, redis)
- Äuvanje osetljivih informacija
- Katanac
ZaŔto Nginx ne koristi viŔe niti?
Apache: kreira viÅ”e procesa ili niti, i svaki proces ili nit dobija svoj CPU i memoriju (niti su znatno manje od procesa, pa worker podržava veÄu istovremenost od prefork), pa previsoka istovremenost može iscrpiti resurse servera.
Nginx: koristi jednu nit da asinhrono i neblokirajuÄe obraÄuje zahteve (administrator može konfigurisati broj worker procesa glavnog Nginx procesa) (epoll), ne dodeljuje CPU i memoriju svakom zahtevu, Å”tedi mnogo resursa, a takoÄe smanjuje veliki broj CPU context switch-ova. Zato Nginx podržava veÄu istovremenost.
Razlika izmeÄu nginx i apache
Lagani dizajn ā za istu web uslugu zauzima manje memorije i resursa od apache-a.
Otpornost na istovremenost ā nginx obraÄuje zahteve asinhrono i neblokirajuÄe, dok je apache blokirajuÄi; pri visokoj istovremenosti nginx održava niske resurse, nisku potroÅ”nju i visoke performanse.
Visoko modularan dizajn, pisanje modula je relativno jednostavno.
Najvažnija razlika je u tome Å”to je apache sinhroni multiprocesni model ā jedna konekcija odgovara jednom procesu, dok je nginx asinhron ā viÅ”e konekcija može deliti jedan proces.

Å ta je razdvajanje dinamiÄkih i statiÄkih resursa?
Razdvajanje dinamiÄkih i statiÄkih resursa znaÄi da se u dinamiÄkom sajtu, prema odreÄenim pravilima, razdvoje resursi koji se ne menjaju od onih koji se Äesto menjaju. Nakon ovog razdvajanja, možemo na osnovu karakteristika statiÄkih resursa izvrÅ”iti keÅ”iranje ā to je suÅ”tina razmiÅ”ljanja o statifikaciji sajta.
Ukratko, razdvajanje dinamiÄkih i statiÄkih resursa je: razdvajanje dinamiÄkih od statiÄkih fajlova.
ZaÅ”to raditi razdvajanje dinamiÄkih i statiÄkih resursa?
U razvoju softvera, neki zahtevi zahtevaju obradu na pozadini (npr. .jsp, .do itd.), dok drugi ne moraju da proÄu kroz pozadinu (npr. css, html, jpg, js fajlovi). Fajlovi koji ne zahtevaju obradu na pozadini nazivaju se statiÄki, a ostali dinamiÄki.
Zato pozadina može da ignoriÅ”e statiÄke fajlove. Neko Äe reÄi ā pa zar ne mogu samo da ignoriÅ”em statiÄke fajlove na pozadini? Naravno da možete, ali time se broj zahteva ka pozadini znatno poveÄava. Kada su nam važni brzi response resursa, treba koristiti strategiju razdvajanja dinamiÄkih i statiÄkih resursa, gde se statiÄki resursi (HTML, JavaScript, CSS, img fajlovi) razdvoje od pozadinske aplikacije, Äime se poveÄava brzina pristupa statiÄkom sadržaju i smanjuje optereÄenje pozadinske aplikacije.
Ovde statiÄke resurse stavljamo u Nginx, a dinamiÄke zahteve prosleÄujemo Tomcat serveru.
Naravno, poÅ”to su danas CDN servisi kao Å”to su Qiniu, Alibaba Cloud itd. veoma zreli, glavna praksa je da se statiÄki resursi keÅ”iraju na CDN servisu, Äime se poveÄava brzina pristupa.
U poreÄenju sa lokalnim Nginx-om, CDN server ima viÅ”e Ävorova u Kini pa može ostvariti korisnikov najbliži pristup. Osim toga, CDN servis može obezbediti veÄi propusni opseg, za razliku od naÅ”e aplikacije Äiji je propusni opseg ograniÄen.
Å ta je CDN servis?
CDN, odnosno Content Delivery Network (mreža za isporuku sadržaja).
Njegov cilj je da, dodavanjem novog sloja mrežne arhitekture na postojeÄi internet, sadržaj sajta objavi Å”to bliže korisniku, na mrežnoj ivici, tako da korisnik može uzeti željeni sadržaj sa najbliže lokacije, Äime se poveÄava brzina pristupa sajtu.
Uglavnom, poÅ”to su danas CDN servisi priliÄno uobiÄajeni, gotovo sve kompanije koriste CDN servise.
Kako Nginx radi razdvajanje dinamiÄkih i statiÄkih resursa?
Dovoljno je navesti direktorijum koji odgovara putanji. Location može koristiti regularne izraze za match-ovanje, i navesti odgovarajuÄi direktorijum na disku. Na primer: (sve operacije su na Linuxu)
location /image/ {
root /usr/local/static/;
autoindex on;
}Koraci:
# Kreiraj direktorijum
mkdir /usr/local/static/image
# UÄi u direktorijum
cd /usr/local/static/image
# Otpremi sliku
photo.jpg
# Restartuj nginx
sudo nginx -s reloadOtvori pretraživaÄ, unesi server_name/image/1.jpg i možeÅ” pristupiti toj statiÄkoj slici.
Kako je implementiran algoritam za balansiranje optereÄenja u Nginxu? Koje strategije postoje?
Da bi se izbegao pad servera, koristi se balansiranje optereÄenja za raspodelu pritiska. ViÅ”e servera se organizuje u klaster; kada korisnik pristupi, prvo pristupa serveru za prosleÄivanje, koji zatim distribuira pristup serverima sa manjim optereÄenjem.
Nginx implementira sledeÄih pet strategija balansiranja optereÄenja:
1. Round robin (podrazumevano)
Svaki zahtev se po redosledu pojavljivanja dodeljuje razliÄitim pozadinskim serverima; ako neki pozadinski server padne, automatski se izbacuje iz sistema.
upstream backserver {
server 192.168.0.12;
server 192.168.0.13;
}2. Weight (težina)
Å to je veÄa vrednost weight, to je veÄa verovatnoÄa dodele; koristi se uglavnom kada performanse pojedinaÄnih pozadinskih servera nisu ravnomerne. TakoÄe se koristi za postavljanje razliÄitih težina kod master-slave konfiguracija, radi racionalnog koriÅ”Äenja resursa servera.
# Å to je veÄa težina, veÄa je verovatnoÄa pristupa; u gornjem primeru to je 20% i 80%.
upstream backserver {
server 192.168.0.12 weight=2;
server 192.168.0.13 weight=8;
}3. ip_hash (IP vezivanje)
Svaki zahtev se dodeljuje na osnovu hash rezultata IP adrese pristupa, tako da posetioci sa iste IP adrese uvek pristupaju istom pozadinskom serveru, Å”to efikasno reÅ”ava problem deljenja sesije kod dinamiÄkih stranica.
upstream backserver {
ip_hash;
server 192.168.0.12:88;
server 192.168.0.13:80;
}4. fair (third-party plugin)
Mora se instalirati upstream_fair modul.
U poreÄenju sa weight i ip_hash, fair je inteligentniji algoritam balansiranja optereÄenja koji na osnovu veliÄine stranice i vremena uÄitavanja inteligentno vrÅ”i balansiranje, dajuÄi prioritet onima sa kraÄim vremenom odgovora.
# Koji server ima brže vreme odgovora, njemu se dodeljuje zahtev.
upstream backserver {
server server1;
server server2;
fair;
}5. url_hash (third-party plugin)
Mora se instalirati Nginx-ov hash softverski paket.
Zahtevi se dodeljuju na osnovu hash rezultata URL pristupa, tako da se svaki URL usmerava na isti pozadinski server, Äime se dodatno poveÄava efikasnost pozadinskih keÅ” servera.
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}Kako reÅ”iti problem CORS-a na front-endu pomoÄu Nginxa?
Koristite Nginx za prosleÄivanje zahteva. API-je koji izazivaju CORS napiÅ”ite kao pozive lokalnom domenu, a zatim ih prosledite na pravu adresu zahteva.
Kako konfigurisati virtuelne hostove u Nginxu?
Virtuelni host na osnovu domena ā razlikuje virtuelne hostove preko domena. Upotreba: spoljaÅ”nji sajtovi.
Virtuelni host na osnovu porta ā razlikuje virtuelne hostove preko portova. Upotreba: interni sajtovi firme, administrativna pozadina spoljaÅ”njih sajtova.
Virtuelni host na osnovu IP adrese.
Konfiguracija domena na osnovu virtuelnog hosta
Potrebno je kreirati /data/www /data/bbs direktorijume; u windows lokalnim hosts datotekama dodati rezoluciju domena za IP adresu virtuelne maÅ”ine; u direktorijum odgovarajuÄeg domena dodati index.html fajl.
# Kada klijent pristupa www.lijie.com, sluŔa port 80, i direktno prelazi na fajlove u direktorijumu data/www
server {
listen 80;
server_name www.lijie.com;
location / {
root data/www;
index index.html index.htm;
}
}
# Kada klijent pristupa bbs.lijie.com, sluŔa port 80, i direktno prelazi na fajlove u direktorijumu data/bbs
server {
listen 80;
server_name bbs.lijie.com;
location / {
root data/bbs;
index index.html index.htm;
}
}Virtuelni host na osnovu porta
Koristi port za razlikovanje; pretraživaÄ pristupa preko domena ili IP adrese:port.
# Kada klijent pristupa www.lijie.com, sluŔa port 8080, i direktno prelazi na fajlove u direktorijumu data/www
server {
listen 8080;
server_name www.lijie.com;
location / {
root data/www;
index index.html index.htm;
}
}
# Kada klijent pristupa www.lijie.com, sluŔa port 80 i direktno prelazi na pravu IP adresu servera 127.0.0.1:8080
server {
listen 80;
server_name www.lijie.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}Koja je uloga location direktive?
Uloga location direktive je da na osnovu URI-ja korisniÄkog zahteva izvrÅ”i razliÄite aplikacije, odnosno da na osnovu URL-a sajta koji korisnik traži vrÅ”i match-ovanje, i kada je match uspeÅ”an izvrÅ”i odgovarajuÄu operaciju.
Da li znate sintaksu location direktive?
Napomena: ~ oznaÄava slovo koje sami unosite

Location primeri sa regularnim izrazima
# Prioritet 1, taÄno match-ovanje, korena putanja
location =/ {
return 400;
}
# Prioritet 2, poÄinje odreÄenim stringom, poÄinje sa av, match-uje ovde, razlikuje velika i mala slova
location ^~ /av {
root /data/av/;
}
# Prioritet 3, regex match sa razlikovanjem velikih i malih slova, match-uje /media***** putanju
location ~ /media {
alias /data/static/;
}
# Prioritet 4, regex match bez razlikovanja velikih i malih slova, svi ****.jpg|gif|png idu ovde
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/av/;
}
# Prioritet 7, opŔti match
location / {
return 403;
}Kako se radi ograniÄavanje protoka?
Nginx rate limiting ograniÄava brzinu korisniÄkih zahteva, Å”titeÄi server od preoptereÄenja.
Postoje 3 vrste ograniÄavanja:
- Normalno ograniÄavanje frekvencije pristupa (normalan protok)
- OgraniÄavanje burst frekvencije pristupa (burst protok)
- OgraniÄavanje broja istovremenih konekcija
Nginx-ovo ograniÄavanje protoka je zasnovano na leaky bucket algoritmu.
Implementacija tri algoritma ograniÄavanja
1. Normalno ograniÄavanje frekvencije pristupa (normalan protok):
OgraniÄava zahteve koje jedan korisnik Å”alje ā koliko Äesto Nginx prihvata jedan zahtev.
Nginx koristi ngx_http_limit_req_module modul za ograniÄavanje frekvencije pristupa; princip je zasnovan na leaky bucket algoritmu. U nginx.conf fajlu mogu se koristiti limit_req_zone i limit_req komande za ograniÄavanje frekvencije obrade zahteva jednog IP-a.
# DefiniÅ”e dimenziju ograniÄenja ā jedan zahtev jednog korisnika u minuti, viÅ”ak se odbacuje
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
# Vezuje dimenziju ograniÄenja
server{
location/seckill.html{
limit_req zone=zone;
proxy_pass http://lj_seckill;
}
}1r/s znaÄi jedan zahtev u sekundi, 1r/m znaÄi jedan zahtev u minuti. Ako Nginx u tom trenutku joÅ” uvek obraÄuje zahteve drugih, odbijaÄe da obradi taj korisniÄki zahtev.
2. OgraniÄavanje burst frekvencije pristupa (burst protok):
OgraniÄava zahteve koje jedan korisnik Å”alje ā koliko Äesto Nginx prihvata jedan zahtev.
Gornja konfiguracija u odreÄenoj meri ograniÄava frekvenciju pristupa, ali postoji problem: ako burst protok premaÅ”i ograniÄenje, zahtevi se odbijaju i ne mogu se obraditi za vreme aktivnosti. Kako dalje postupiti u tom sluÄaju?
Nginx pruža burst parametar u kombinaciji sa nodelay parametrom koji reÅ”ava problem burst protoka ā omoguÄava podeÅ”avanje dodatnog broja zahteva koji se mogu obraditi iznad postavljenog ograniÄenja. Možemo dodati burst i nodelay parametre u prethodni primer:
# DefiniÅ”e dimenziju ograniÄenja ā jedan zahtev jednog korisnika u minuti, viÅ”ak se odbacuje
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
# Vezuje dimenziju ograniÄenja
server{
location/seckill.html{
limit_req zone=zone burst=5 nodelay;
proxy_pass http://lj_seckill;
}
}ZaÅ”to se dodaje burst=5 nodelay? Ovo znaÄi da Äe Nginx za korisniÄke zahteve odmah obraditi prvih pet, a viÅ”ak Äe se polako prolivati; ako nema zahteva drugih korisnika, obradiÄe tvoje, a ako ih ima ā Nginx Äe ih odbaciti i neÄe prihvatiti tvoje zahteve.
3. OgraniÄavanje broja istovremenih konekcija
Nginx-ov ngx_http_limit_conn_module modul pruža funkciju ograniÄavanja broja istovremenih konekcija; mogu se koristiti limit_conn_zone i limit_conn direktive za konfiguraciju. Hajde da vidimo jednostavan primer:
http {
limit_conn_zone $binary_remote_addr zone=myip:10m;
limit_conn_zone $server_name zone=myServerName:10m;
}
server {
location / {
limit_conn myip 10;
limit_conn myServerName 100;
rewrite / http://www.lijie.net permanent;
}
}Gornja konfiguracija ograniÄava maksimalan broj istovremenih konekcija jednog IP-a na 10, i maksimalan broj istovremenih konekcija celog virtuelnog servera na 100. Naravno, broj konekcija virtuelnog servera se broji tek nakon Å”to server obradi header zahteva. Kao Å”to je pomenuto, Nginx je zasnovan na principu leaky bucket algoritma, a opÅ”te uzevÅ”i ograniÄavanje protoka je zasnovano na leaky bucket i token bucket algoritmima.
Da li poznajete leaky bucket i token bucket algoritme?
Leaky bucket algoritam
Leaky bucket algoritam je jednostavan: vodu posmatramo kao zahteve, a leaky bucket kao maksimalnu procesnu moÄ sistema. Voda prvo ulazi u leaky bucket, a zatim istiÄe odreÄenom brzinom. Kada je brzina isticanja manja od brzine uliva, poÅ”to je kapacitet kofe ograniÄen, viÅ”ak vode se prevri i izlije se (zahtevi se odbijaju), Äime se ostvaruje ograniÄavanje protoka.

Token bucket algoritam
Princip token bucket algoritma je takoÄe priliÄno jednostavan ā možemo ga zamisliti kao prijavu za pregled u bolnici: tek kada dobijete broj možete biti pregledani.
Sistem održava bucket tokena (token); u kofu se tokeni dodaju konstantnom brzinom. Kada pristigne zahtev koji želi da bude obraÄen, prvo mora iz kofe uzeti jedan token. Kada u kofi nema viÅ”e tokena, taj zahtev Äe biti odbijen. Token bucket algoritam kontroliÅ”e zahteve putem kapaciteta kofe i brzine izdavanja tokena.

Kako konfigurisati visoku dostupnost Nginxa?
Kada upstream server (server za stvarni pristup) prestane da radi ili ne odgovara na vreme, treba odmah preÄi na sledeÄi server, obezbeÄujuÄi visoku dostupnost.
Nginx konfiguracioni kod:
server {
listen 80;
server_name www.lijie.com;
location / {
### Navodi upstream server za balansiranje optereÄenja
proxy_pass http://backServer;
### Vreme timeout-a izmeÄu nginx i upstream servera (servera za stvarni pristup) ā timeout konekcije ka pozadinskom serveru, vreme Äekanja na odgovor nakon handshake-a
proxy_connect_timeout 1s;
### Timeout za slanje od nginx ka upstream serveru (serveru za stvarni pristup)
proxy_send_timeout 1s;
### Timeout za primanje od nginx od upstream servera (servera za stvarni pristup)
proxy_read_timeout 1s;
index index.html index.htm;
}
}Kako Nginx odreÄuje da odreÄena IP adresa ne može da pristupa?
# Ako je IP adresa pristupa 192.168.9.115, vraÄa 403
if ($remote_addr = 192.168.9.115) {
return 403;
}U nginxu, kako spreÄiti obradu zahteva koji koriste nedefinisano ime servera?
Dovoljno je definisati server koji odbacuje zahteve na sledeÄi naÄin:
Ime servera se zadržava kao prazan string; on match-uje zahteve koji nemaju Host header polje, a vraÄa se poseban ne-standardni nginx kod koji prekida konekciju.
Kako ograniÄiti pristup iz pretraživaÄa?
## Ne dozvoljava pristup preko Chrome pretraživaÄa; ako je Chrome, vraÄa 500
if ($http_user_agent ~ Chrome) {
return 500;
}Å ta su Rewrite globalne promenljive?
$remote_addr // IP adresa klijenta
$binary_remote_addr // IP adresa klijenta (binarno)
$remote_port // Port klijenta, npr. 50472
$remote_user // KorisniÄko ime provereno kroz Auth Basic Module
$host // Host header polje zahteva, inaÄe ime servera, npr. blog.sakmon.com
$request // Informacije o zahtevu korisnika, npr. GET ?a=1&b=2 HTTP/1.1
$request_filename // Putanja fajla tekuÄeg zahteva, formirana od root/alias i URI request, npr. /2013/81.html
$status // Statusni kod odgovora zahteva, npr. 200
$body_bytes_sent // Broj bajtova body-ja poslatih u odgovoru. Äak i ako se konekcija prekine, ovaj podatak je taÄan, npr. 40
$content_length // Jednako vrednosti āContent_Length" u liniji zahteva
$content_type // Jednako vrednosti āContent_Type" u liniji zahteva
$http_referer // Referentna adresa
$http_user_agent // Informacije o agentu klijenta, npr. Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36
$args // Isto kao $query_string ā parametri URL-a (GET), npr. a=1&b=2
$document_uri // Isto kao $uri ā ova promenljiva oznaÄava URI tekuÄeg zahteva bez parametara (vidi $args), npr. /2013/81.html
$document_root // Vrednost korene putanje za tekuÄi zahtev
$hostname // npr. centos53.localdomain
$http_cookie // Cookie informacije klijenta
$cookie_COOKIE // Vrednost cookie promenljive COOKIE
$is_args // Ako postoji $args parametar, ova promenljiva je ā?", inaÄe je prazna, npr. ?
$limit_rate // Ova promenljiva može ograniÄiti brzinu konekcije, 0 znaÄi bez ograniÄenja
$query_string // Isto kao $args ā parametri URL-a (GET), npr. a=1&b=2
$request_body // Beleži POST podatke
$request_body_file // Privremeno ime fajla sa informacijama o telu zahteva klijenta
$request_method // Akcija zahteva klijenta, obiÄno GET ili POST, npr. GET
$request_uri // Originalni URI sa parametrima zahteva, bez imena hosta, npr. /2013/81.html?a=1&b=2
$scheme // HTTP metod (npr. http, https), npr. http
$uri // Ova promenljiva oznaÄava URI tekuÄeg zahteva bez parametara (vidi $args), npr. /2013/81.html
$request_completion // Ako je zahtev zavrŔen, postavlja se na OK. Ako nije zavrŔen ili nije poslednji u nizu, prazno (Empty), npr. OK
$server_protocol // Protokol koji zahtev koristi, obiÄno HTTP/1.0 ili HTTP/1.1, npr. HTTP/1.1
$server_addr // IP adresa servera, može se utvrditi nakon jednog sistemskog poziva
$server_name // Ime servera, npr. blog.sakmon.com
$server_port // Port servera na koji zahtev pristiže, npr. 80Kako Nginx implementira proveru zdravlja pozadinskih servisa?
NaÄin 1: iskoristiti ugraÄene Nginx module ngx_http_proxy_module i ngx_http_upstream_module za proveru zdravlja pozadinskih Ävorova.
NaÄin 2 (preporuÄeno): iskoristiti nginx_upstream_check_module modul za proveru zdravlja pozadinskih Ävorova.
Kako Nginx ukljuÄuje kompresiju?
Kada se ukljuÄi Nginx gzip kompresija, veliÄina statiÄkih resursa kao Å”to su web stranice, css, js se znatno smanjuje, Äime se Å”tedi velika koliÄina propusnog opsega, poveÄava efikasnost prenosa i korisniku se pruža brže iskustvo. Iako se troÅ”e CPU resursi, vredi radi boljeg korisniÄkog iskustva.
Konfiguracija za ukljuÄivanje je sledeÄa:
Gornju konfiguraciju stavite u http{ ⦠} Ävor u nginx.conf.
http {
# UkljuÄi gzip
gzip on;
# Minimalna veliÄina fajla za gzip kompresiju; fajlovi manji od ove vrednosti se ne kompresuju
gzip_min_length 1k;
# Nivo gzip kompresije 1-10
gzip_comp_level 2;
# Tipovi fajlova koji se kompresuju.
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# Da li dodati Vary: Accept-Encoding u http header, preporuÄuje se ukljuÄivanje
gzip_vary on;
}SaÄuvaj i restartuj nginx, osveži stranicu (da izbegneÅ” keÅ”, uradi force refresh) i videÄeÅ” efekat. U Chrome pretraživaÄu, preko F12 pogledaj response header zahteva:
Možemo prvo uporediti veliÄine fajlova pre nego Å”to smo ukljuÄili zip kompresiju, kao Å”to je prikazano:

A sada, nakon Å”to smo ukljuÄili gzip kompresiju, evo veliÄine fajlova:

I kada pogledamo response header, videÄemo gzip kompresiju kao Å”to je prikazano:

Uporeda gzip kompresije pre i posle: originalna veliÄina jquery je 90kb, nakon kompresije samo 30kb.
Iako je gzip koristan, sledeÄe tipove resursa se ne preporuÄuje kompresovati.
1. Tip slike
Razlog: Slike poput jpg i png su veÄ kompresovane, tako da nakon ukljuÄivanja gzip-a nema velike razlike u veliÄini pre i posle kompresije ā ukljuÄivanje samo uzalud troÅ”i resurse. (Savet: možeÅ” probati da kompresujeÅ” jpg sliku u zip i primetiÄeÅ” da veliÄina nije mnogo promenjena. Iako su zip i gzip algoritmi razliÄiti, vidi se da kompresija slika nema veliku vrednost.)
2. Veliki fajlovi
Razlog: TroŔi mnogo CPU resursa, a efekat nije nužno primetan.
Koja je uloga ngx_http_upstream_module?
ngx_http_upstream_module se koristi za definisanje grupa servera koje mogu biti referencirane putem fastcgi_pass, proxy_pass, uwsgi_pass, memcached_pass i scgi_pass direktiva.
Å ta je C10K problem?
C10K problem se odnosi na nemoguÄnost istovremenog rukovanja velikim brojem klijentskih (10.000) mrežnih socket-a.
Da li Nginx podržava kompresiju zahteva ka upstream serverima?
Možete koristiti Nginx modul gunzip za kompresiju zahteva ka upstream serverima. gunzip modul je filter koji može dekompresovati odgovore sa āContent-Encoding: gzip" za klijente ili servere koji ne podržavaju āgzip" metodu kodiranja.
Kako dobiti trenutno vreme u Nginxu?
Da biste dobili trenutno vreme Nginxa, morate koristiti SSI modul i promenljivu date_local.
Proxy_set_header THE-TIME $date_gmt;Kako objasniti svrhu opcije -s na Nginx serveru?
Koristi se za pokretanje Nginx -s parametra izvrŔne datoteke.
Kako dodati module na Nginx server?
Tokom kompilacije, Nginx moduli se moraju odabrati jer Nginx ne podržava izbor modula u toku rada (runtime).
Kako u produkciji postaviti broj worker procesa?
Ako imate viÅ”e CPU-ova, možete postaviti viÅ”e worker-a; broj worker procesa može biti jednak broju jezgara CPU-a. Ako na jednom CPU-u pokrenete viÅ”e worker procesa, operativni sistem Äe vrÅ”iti rasporeÄivanje izmeÄu njih, Å”to smanjuje performanse sistema. Ako imate samo jedan CPU, dovoljno je pokrenuti samo jedan worker proces.
Nginx status kodovi
499:
Server predugo obraÄuje zahtev, a klijent aktivno zatvara konekciju.
502:
(1) Da li je FastCGI proces pokrenut
(2) Da li broj FastCGI worker procesa nije dovoljan
(3) Da li FastCGI predugo traje
- fastcgi_connect_timeout 300;
- fastcgi_send_timeout 300;
- fastcgi_read_timeout 300;
(4) FastCGI Buffer nije dovoljan ā nginx kao i apache ima ograniÄenje front-end bafera, mogu se podesiti parametri bafera
- fastcgi_buffer_size 32k;
- fastcgi_buffers 8 32k;
(5) Proxy Buffer nije dovoljan ā ako koristite Proxying, podesite
- proxy_buffer_size 16k;
- proxy_buffers 4 16k;
(6) PHP skripta se predugo izvrŔava
- Promenite 0s u php-fpm.conf u odgovarajuÄe vreme
Nakon Å”to je proÄitao ovih 40 Nginx intervju pitanja, Xiao Er je bio neizrecivo zahvalan, oduÅ”evljen bez merenja. Tapnuo sam ga po ramenu i uteÅ”io ga: āDrži se, buduÄnost je tvoja."
Izvorni link: blog.csdn.net/wuzhiwei549/article/details/122758937, obradio: Chenmo Wang Er
