Krajem aprila završena je Percona Live konferencija u Kaliforniji. Ne, nisam bio, šmrc, ali sam bar gledao snimke sa keynote obraćanja. Kako već duže vreme pratim MySQL performance blog, predavanje koje je drzao Peter Zaitsev je bilo nešto što nisam želeo da propustim. Ono što je rekao, i što već svi znaju, je da je u zadnjih par godina LAMP stack postao sve samo ne LAMP. Jedino se još Linux drži kao neprikosnoven, Apache, PHP i MySQL više nisu usamljeni. Umesto PHP-a koriste se razni jezici, kao npr. Ruby, kao baze su se pojavile i Drizzle, Cassandra, neki koriste i MongoDB kao produkcionu bazu.
Ono o čemu se sve više priča su drugi web serveri. Pored Apache servera sve više sajtova koristi NginX. Ovaj simpatičan server, koji drži i naše sajtove, nema kao Apache podršku da se u njega uključe standardni programski jezici, već uglavnom radi kao reverzni proxy i SSL offload engine, koji zahteve dalje prosleđuje drugim serverima. Dosta programera i CMS-ova i dalje insistira na korišćenju Apache servera, pre svega zbog dodatnih podešavanja kroz .htaccess mehanizam – pa prosečan PHP sajt može imati NginX u prvom planu, a u pozadini ili Apache+PHP, ili npr. PHP FastCGI ako prebacite rewrite-ove na sam NginX. Evo par kratkih recepata kako:
Prvo – instalacija. Moja preporuka je još uvek CentOS Linux, pa samim tim preporuujem i gotove pakete za njega. Možete ih naći na ovom linku. Možete i ručno dodati repo koji izgleda ovako:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1
Drugo, osnovna konfiguracija. Ako koristite NginX kao server koji će vaši korisnici videti, napravite backend koji će videti sam server, i koji će da koristi sve vaše web servere. Za dva apache servera koji rade na odvojenim mašinama to izgleda ovako:
upstream my_servers {
server 192.168.0.1 max_fails=3 fail_timeout=30s;
server 192.168.0.2 max_fails=3 fail_timeout=30s down;
}
Sam server, tj. sajt ćete onda lako podesiti da gađa ova dva servera. Osnovna konfiguracija može da bude ovako nešto:
server {
listen 0.0.0.0 ;
server_name www.mojdomen.tld. ;
location / {
proxy_pass http://my_servers;
}
}
I to je to. To je neka osnova, koju sada mozete da proširujete po potrebi. U ovom primeru serveri su apache, ali nije problem da samo promenite port i gađate dve sprave sa FastCGI-em. Prvi sledeći korak je dodavanje SSL-a, koje možete rešiti drugim serverom, ovako:
server {
listen 0.0.0.0:443;
server_name secure.mojdomen.tld.
ssl on;
ssl_certificate /etc/nginx/secure.mojdomen.tld.pem ;
ssl_certificate_key /etc/nginx/secure.mojdomen.tld.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols SSLv3 TLSv1;
location / {
proxy_pass http://my_servers;
}
}
Ovako imate odvojen domen za SSL, gde se svo procesiranje i procesorski zahtevna obrada obavljaju na load balanseru, čime rasterećujete web/aplikacione servere za vašu aplikaciju. Sledeći koraci bi bili, prvo keširanje slika kod korisnika, ovako:
location /images {
expires 30d;
proxy_pass http://my_servers;
}
Čime sprečavate stalno učitavanje slika sa vašeg servera, plus dodatno ubrzavate rad – jer korisnik ne mora da čeka na sliku. Konačno, ako ste rešeni da izbacite apache i pređete na PHP FPM i time dodatno ubrzate rad, možete i rewrite-ove prebaciti na nginx. Osnova uopšte nije teška i izgleda otprilike ovako:
rewrite ^/img(.*)-([0-9]).jpg$ /slike/element$1.jpg break;
Čime uklanjate i većinu onoga što standardni CMS-ovi drže u htaccess fajlovima i omogućavate, uz malo posla, prelazak na FastCGI. Kompresija podataka se isto lako uključuje – u samo par redova:
gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
A naravno, kako je u pitanju klasičan web server, možete ga podesiti i da deo sadržaja služi direktno sa diska. Dajte mu pristup deljenom mrežnom disku (nekom NFS-u) i prebacite slike na neki dodatni cookie-less domen i eto vašeg mini-CDN-a koji će vam dodatno ubrzati rad i olakšati sajt!
Nadam se da sam vas ovim tekstom bar malo ohrabrio da istražite NginX i razmislite da ga koristite kao front-end do vašeg sajta. Limundo i Kupindo, Netflix, Pinterest, Zynga i WordPress.com su to već uradili, pa znate da ćete biti u dobrom društvu. Prave prednosti su, pre svega, threaded model rada koji omogućava da bez većih problema imate hiljade aktivnih konekcija, čime potstiče na korišćenje keepalive-a za HTTP, manje zauzeće memorije, lagan i udoban rad, podrška za reload konfiguracije bez gašenja….
Hvala ti na ovom comentu, nemam pojma šta pričaš, ali znam da je linox prava stvar. Jel mogu da se služim njim na androidu. Open sistem rules!
Pročitah iako ništa ne razumem osim par pojmova PHP, Apache i MySQL 🙂
A sad jedno pitanje: dešava mi se da naletim na aukcije na kojima kada se klikne na jedan od thumb sličica dobijem 404 not found stranicu Limunda. Zašto se to dešava? Može biti problem na nekoliko strana: neuspešan upload od strane korisnika prilikom postavljanja aukcija, greška u korumpiranoj bazi ili na osnovu ovog bloga – i do samog servera. Prošle nedelje sam naišao na aukciju kod koje se čak i jedan thumb nije prikazivao (bila je default sličica ili tako nešto, ali je placeholder bio tu.
Hvala i nastavite sa tech blogom 😉
@Darko:
Ono sto sigurno nije je “korumpirana baza”, sta god pod tim mislio. Apsolutno mogu da tvrdim da je integritet podataka u bazi zasticen i da ne moze doci do bilo kakvog (pa i namernog) ostecenja podataka, a da se to ne primeti.
Osim toga, ne znam jer mi se, iskreno, nikad nije desilo da otvorim thimb i dobijem 404 gresku. Ako primetis tako nesto sledeci put, posalji nasoj korisnickoj podrsci, pa cemo pogledati zasto se to desilo.
Ok, ali definitivno sam na to nailazio par puta, gledaću da sledeći put ne budem lenj. Inače, potvrđeno iz više browsera, nije sa moje strane bag. Nisam ekspert za baze, ali mislio sam na “broken link” odnosno referencu/string koji se čuva u bazi koja vodi do određene sličice (ako uopšte vodite db strukturu pri postavljanju aukcija)
Kao što sam obećao, nije me mrzelo sada – evo prazne sličice na Kupindu koju sam dobio u pretrazi “android” (negde pri dnu u srednjem redu, cena 4500):
http://www.kupindo.com/pretraga.php?Pretraga=Android&CeleReci=1&Okrug=-1&Opstina=-1&Grupa=136&sSort=cena&sSmer=ASC
slika (link)
http://www.kupindo.com//_
screenshot
http://img855.imageshack.us/img855/2739/20130530083618.png
Evo prošlo je 10 sati od prethodne poruke i “prazna sličica” još uvek izlazi u pretrazi (samo se pomerila malo na gore). Nešto se definitivno dešava, ne verujem da je server toliko spor da prodate predmete ne može da ukloni sa liste u ovom periodu.
Darko, hvala ti puno na JAKO detaljnoj prijavi problema. Nasli smo ga i indentifikovali, problem je vezan za neke optimizacije koje radimo na nasim search&indexing serverima. Predmet koji je prikazan je zaostatak od prodatog predmeta, nije nijedan predmet nekog clana sklonjen, vec se samo vidi sum kome to nije mesto.
Problem se resava dok pricamo, tj. upravo radimo na tome i bice resen u sledecem upgrade-u sistema, koji sledi uskoro. Taj upgrade ce usput doneti i, po nasim merenjima, znacajno ubrzanje pretrage na oba sajta.
U medjuvremenu nas marketing sprema pokloncic za tebe, u znak zahvalnosti za trud da nam sajt bude sto bolji. 🙂
Hvala Nikola!
Tu smo da nam svima bude bolje 🙂
Mene je jako zaintereosvala ova tema, nažalost mala je količina članaka na Srpskom jeziku a ja sam sa engleskim malo slabiji. Želeo bih svoj sajt da prebacim na nginx i ovaj članak mi je dosta pomogao.
Takođe sam naišao na ovo pisanije https://www.leo-host.com/2016/11/25/zasto-apache-radi-bolje-uz-nginx/
Dosta zanimljivih činjenica o NGINX koje nisam znao, a i članak je podugačak.
Zna li neko ima li još ovakvih članaka negde, na Srpskom?