{"id":71378,"date":"2020-02-25T20:45:02","date_gmt":"2020-02-25T17:45:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij"},"modified":"2020-03-03T16:14:21","modified_gmt":"2020-03-03T13:14:21","slug":"openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Ponovno objavljamo transkript izlaganja sa konferencije <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016. koja se odr\u017eala u moskovskom Skolkovu 7\u20148. novembra pro\u0161le godine. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> govori o tome kako pro\u0161iriti funkcionalnost NGINX-a pomo\u0107u OpenResty i Lua.<\/em><\/p>\n<p>Zdravo svima, ja sam Vladimir Protasov, radim u Parallels-u. Re\u0107i \u0107u malo o sebi. Tri \u010detvrtine svog \u017eivota se bavim kodiranjem. Postao sam programer doslovno do kostiju: ponekad u snu vidim kod. \u010cetvrtinu \u017eivota posvetio sam industrijskoj proizvodnji, pisanju koda koji ide direktno u produkciju. Kod kojim neki od vas koriste, ali ne znaju o njemu.<\/p>\n<p>Da razumete koliko je sve bilo lo\u0161e. Kada sam bio mali junior, do\u0161ao sam i dobio takve dvotera bajtne baze. Sada svi imamo highload. I\u0161ao sam na konferencije, pitao: \u201eRao, ispri\u010dajte nam, imate big data, sve je super? Koliko imate baze?\u201d Odgovarali su mi: \u201eImamo 100 gigabajta!\u201d Govorio sam: \u201eSuper, 100 gigabajta!\u201d A u sebi sam mislio, kako da zadr\u017eim poker face. Misli\u0161, da, momci su sjajni, a zatim se vra\u0107a\u0161 i mu\u010di\u0161 se s tim vi\u0161etera bajtnim bazama. A to je bilo kao junior. Mo\u017eete li zamisliti kakav je to udarac?<\/p>\n<p>Poznajem vi\u0161e od 20 programskih jezika. To je ono \u0161to sam morao da savladam tokom rada. Dobije\u0161 kod na Erlangu, C, C++, Lua, Python-u, Ruby-u, ne\u010demu drugom, i treba da sve to sastavi\u0161. Uop\u0161te, bilo je potrebno. Ta\u010dan broj nisam uspeo da izra\u010dunam, ali negde oko 20 sam se izgubio.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nBudu\u0107i da svi prisutni znaju \u0161ta je Parallels i \u010dime se bavimo, ne\u0107u govoriti o tome koliko smo sjajni i \u0161ta radimo. Samo \u0107u re\u0107i da imamo 13 kancelarija \u0161irom sveta, vi\u0161e od 300 zaposlenih, razvoj u Moskvi, Talinu i na Malti. Ako \u017eelite, mo\u017eete se preseliti na Maltu, ako je zima hladna i trebate da se ugrijete.<\/p>\n<p>Na\u0161 odeljak konkretno pi\u0161e na Python 2. Bavimo se poslovanjem i nemamo vremena za uvo\u0111enje modernih tehnologija, zato patimo. Imamo Django, jer u njemu ima svega, a suvi\u0161no smo izbacili. Tako\u0111e MySQL, Redis i NGINX. Imamo mnogo drugih sjajnih stvari. Imamo MongoDB, imamo ze\u010deve koji tr\u010de, imamo svega\u2014ali to nije moje i time se ne bavim.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nO sebi sam rekao. Hajde da vidimo o \u010demu \u0107u danas govoriti:<\/p>\n<ul>\n<li>\u0160ta je OpenResty i s \u010dim se jede?<\/li>\n<li>Zakaj izumljati \u0161e en kolo, ko imamo Python, NodeJS, PHP, Go in druge odli\u010dne stvari, s katerimi so vsi zadovoljni?<\/li>\n<li>In nekaj primerov iz \u017eivljenja. Moral sem mo\u010dno skraj\u0161ati poro\u010dilo, ker je trajalo 3,5 ure, zato bo primerov malo.<\/li>\n<\/ul>\n<p>\nOpenResty je NGINX. Zahvaljujo\u010d njemu imamo popoln spletni stre\u017enik, ki je dobro napisan in deluje hitro. Mislim, da ve\u010dina med nami uporablja NGINX v produkciji. Vsi veste, da je hiter in odli\u010den. Ima odli\u010dno sinhrono vhod\/izhod, zato nam ni treba izumljati kolesa, kot je to storjeno v Pythonu s gevent. Gevent je odli\u010den, super, vendar \u010de napi\u0161ete C kodo in se kaj zalomi, se boste zaradi debagiranja z geventom zme\u0161ali. Imao sem izku\u0161njo: potreboval sem kar dva dni, da sem ugotovil, kaj je \u0161lo narobe. \u010ce ne bi nekdo pred tem raziskoval ve\u010d tednov, na\u0161el te\u017eavo, napisal na spletu, in Google tega ne bi na\u0161el, bi se resni\u010dno zme\u0161ali.<\/p>\n<p>V NGINX so \u017ee vklju\u010deni predpomnjenje in stati\u010dna vsebina. Ni vam treba skrbeti, kako to narediti pravilno, da vas kje ne bi upo\u010dasnilo, da ne bi izgubili descriptorjev. Nginx je zelo enostaven za namestitev, ni vam treba razmi\u0161ljati, kaj vzeti \u2013 WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx namestite, predate administratorjem, oni vedo, kako to delati. Nginx strukturirano obravnava zahteve. O tem bom malo pozneje govoril. Na kratko ima fazo, ko sprejme zahtevo, ko jo obdeluje in ko vrne vsebino uporabniku.<\/p>\n<p>Nginx je super, vendar obstaja en problem: ni dovolj prilagodljiv, kljub vsem tistim odli\u010dnim funkcijam, ki so jih fantje vgradili v konfiguracijo, \u010deprav jo je mogo\u010de prilagoditi. Te mo\u010di primanjkuje. Zato so fantje iz Taobao pred osmimi leti vgradili Lua. Kaj to prina\u0161a?<\/p>\n<ul>\n<li><strong>Dimenzije<\/strong>. Je majhen. LuaJIT daje nekje 100-200 kilobajtov overheada pomnilnika in minimalen overhead pri zmogljivosti.<\/li>\n<li><strong>Hitrost<\/strong>. Interpreter LuaJIT je v mnogih situacijah blizu C, v nekaterih ga premaga Java, v nekaterih pa jo prehiti. Nekaj \u010dasa je bil cenjen kot state of the art, najbolj\u0161i JIT kompajler. Zdaj so bolj\u0161i, vendar so zelo te\u017eki, na primer V8. Nekateri JS interpreterji in Java HotSpot so v nekaterih to\u010dkah hitrej\u0161i, a v nekaterih \u0161e vedno zaostajajo.<\/li>\n<li><strong>Enostavno za u\u010denje<\/strong>. \u010ce imate, recimo, kodo na Perlu in niste Booking, ne boste na\u0161li PerlProgramerjev. Ker jih ni, vse so jih pobrali, njihovi so dolgotrajni in zapleteni. \u010ce \u017eelite programerje na ne\u010dem drugem, jih bo morda tudi potrebno ponovno usposobiti ali najti. V primeru Lua je vse enostavno. Lua se vsakdo nau\u010di v treh dneh. Potreboval sem pribli\u017eno dve uri, da sem se ujel. Po dveh urah sem \u017ee pisal kodo v produkciji. Nekje po enem tednu je od\u0161la naravnost v produkcijo.<\/li>\n<\/ul>\n<p>\nZato to izgleda takole:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTu je veliko stvari. V OpenResty so zbrali kup modulov, tako luovskih kot end\u017einskih. In imate vse pripravljeno \u2013 razporedite in dela.<\/p>\n<h1>Primeri<\/h1>\n<p>\nKonec lirike, preidimo na kodo. Tukaj je majhen Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKaj je tukaj? To je end\u017einsko mesto. Ne mu\u010dimo se, ne pi\u0161emo svojega usmerjanja, ne vzamemo kak\u0161nega pripravljenega \u2013 \u017ee imamo v NGINX, \u017eivimo dobro in leno.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 to je blok, ki pove, da vsebino predajamo preko Lua skripte. Vzamemo end\u017einsko spremenljivko <code>remote_addr<\/code> in jo vstavi v <code>string.format<\/code>. To je isto kot <code>sprintf<\/code>, samo na Luu, samo prav. In predajamo stranki.<\/p>\n<p>Zato bo to izgledalo takole:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAmpak vrnimo se v pravi svet. V produkciji nih\u010de ne razporeja Hello World. Na\u0161a aplikacija obi\u010dajno komunicira z bazo ali drugam in ve\u010dino \u010dasa \u010daka na odgovor.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPreprosto sedi in \u010daka. To ni najbolj\u0161e. Ko pride 100.000 uporabnikov, nam je zelo te\u017eko. Zato si poglejmo preprosto aplikacijo. I\u0161\u010devali bomo slike, na primer ma\u010dk. Samo ne bomo preprosto iskali, raz\u0161irili bomo klju\u010dne besede in, \u010de uporabnik i\u0161\u010de 'ma\u010di\u010dke', mu bomo na\u0161li ma\u010dke, puhaste in podobno. Najprej moramo pridobiti podatke o zahtevi na zadnjem delu. Izgleda to takole:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDve vrstici vam omogo\u010data, da pridobite GET parametre, brez zapletenosti. Nato iz baze podatkov s tabelo o klju\u010dni besedi in raz\u0161iritvi pridobimo te informacije s preprostim SQL poizvedovanjem. Vse je preprosto. Izgleda takole:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPovezujemo knji\u017enico <code>resty.mysql<\/code>, ki jo \u017ee imamo v kompletu. Ni\u010d ne potrebujemo namestiti, vse je pripravljeno. Navedemo, kako se povezati in izvedemo SQL poizvedbo:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTu je malo stra\u0161ljivo, a sve funkcioni\u0161e. Ovde je 10 \u2013 to je limit. Uzimamo 10 zapisa, lenji smo, ne \u017eelimo da prikazujemo vi\u0161e. Zaboravio sam na limit u SQL-u.<\/p>\n<p>Dalje, nalazimo slike za sve upite. Prikupljamo gomilu upita i popunjavamo Lua tabelu koja se zove <code>reqs<\/code>, i radimo <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSvi ti upiti idu paralelno, i dobijamo odgovore. Vreme rada je jednako vremenu odgovora najsporijeg. Ako svi postignu za 50 milisekundi, a poslali smo stotinu upita, odgovor \u0107e nam sti\u0107i za 50 milisekundi.<\/p>\n<p>Po\u0161to smo lenji i ne \u017eelimo da pi\u0161emo HTTP obradu i ke\u0161iranje, natera\u0107emo NGINX da sve uradi umesto nas. Kao \u0161to ste videli, bio je upit na <code>url\/fetch<\/code>, evo ga:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nRadimo jednostavno <code>proxy_pass<\/code>, navodimo gde da se ke\u0161ira, kako to uraditi, i sve funkcioni\u0161e.<\/p>\n<p>Ali to nije dovoljno, jo\u0161 moramo da damo podatke korisniku. Najjednostavnija ideja je sve serijalizovati u JSON, lako, u dve linije. Davamo Content-Type, dajemo JSON.<\/p>\n<p>Ali postoji jedan problem: korisnik ne \u017eeli da \u010dita JSON. Moramo da anga\u017eujemo frontendere. Ponekad nam se na po\u010detku ne svi\u0111a da to radimo. A i SEO stru\u010dnjaci \u0107e re\u0107i da im nije bitno ako tra\u017eimo slike. A ako im dajemo neki sadr\u017eaj, re\u0107i \u0107e da pretra\u017eiva\u010di ni\u0161ta ne indeksiraju.<\/p>\n<p>\u0160ta uraditi s tim? Normalno, da\u0107emo korisniku HTML. Ru\u010dno generisanje \u2013 nije u redu, zato \u017eelimo da koristimo \u0161ablone. Za to postoji biblioteka <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVerovatno ste primetili tri stra\u0161ne slova OPM. OpenResty dolazi sa svojim paket menad\u017eerom, preko kojeg mo\u017eete instalirati jo\u0161 mno\u0161tvo raznih modula, uklju\u010duju\u0107i <code>lua-resty-template<\/code>. To je jednostavan \u0161ablon motor, sli\u010dan Django \u0161ablonima. Tamo mo\u017eete napisati kod i zameniti promenljive.<\/p>\n<p>Kao rezultat, sve \u0107e izgledati otprilike ovako:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nUzimamo podatke i renderujemo \u0161ablon opet u dve linije. Korisnik je sre\u0107an, dobio je ma\u010di\u0107e. Po\u0161to smo pro\u0161irili upit, dobio je i morskog lava. Mo\u017eda je tra\u017eio ba\u0161 njega, ali nije mogao pravilno da formuli\u0161e svoj upit.<\/p>\n<p>Sve je sjajno, ali smo u razvoju i ne \u017eelimo da prikazujemo korisnicima. Hajde da uradimo autorizaciju. Da bismo to uradili, hajde da vidimo kako NGINX obra\u0111uje upit u terminima OpenResty:<\/p>\n<ul>\n<li>Prva faza \u2013 <strong>access<\/strong>, ko uporabnik \u0161ele pride, ga lahko takoj preu\u010dimo po naslovih, IP naslovu in drugih podatkih. \u010ce nam ni v\u0161e\u010d, ga lahko takoj blokiramo. To se lahko uporablja za avtentikacijo, ali pa, \u010de prejmemo veliko zahtevkov, jih lahko enostavno zavrnemo v tej fazi.<\/li>\n<li><strong>rewrite<\/strong>. Prepisujemo nekatere podatke zahtevka.<\/li>\n<li><strong>content<\/strong>. Vrnemo vsebino uporabniku.<\/li>\n<li><strong>filtriranje glavic<\/strong>. Zamenjamo glavice odgovora. \u010ce smo uporabili <code>proxy_pass<\/code>, lahko prepi\u0161emo nekatere glavice, preden jih vrnemo uporabniku.<\/li>\n<li><strong>filtriranje telesa<\/strong>. Lahko zamenjamo telo.<\/li>\n<li><strong>dnevnik<\/strong>\u00a0\u2014 bele\u017eenje. Bele\u017eimo lahko dnevnike v elasticsearch brez dodatne plasti.<\/li>\n<\/ul>\n<p>\nNa\u0161a avtentikacija bo izgledala pribli\u017eno tako:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTo dodamo v tisti <code>lokacija<\/code>, ki smo ga opisali prej, in vanj vstavimo tak\u0161no kodo:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPoglejmo, ali imamo cookie token. \u010ce ne, uporabnike usmerimo na avtentikacijo. Uporabniki so spretni in se lahko domislijo, da morajo dodati cookie token. Zato jo \u0161e dodamo v Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKoda za delo z Redisom je zelo preprosta in se ne razlikuje od drugih jezikov. Vsi vhodni\/izhodni podatki tam in tukaj niso blokirni. \u010ce pi\u0161ete sinhrono kodo, ta deluje asinhrono. Tako kot pri gevent, le da je to dobro narejeno.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPoglejmo, kako izvedemo avtentikacijo:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPovezujemo, da moramo prebrati telo zahtevka. Prejmemo POST argumente, preverimo, ali sta uporabni\u0161ko ime in geslo pravilna. \u010ce nista, jih usmerimo na avtentikacijo. \u010ce sta pravilna, zapi\u0161emo token v Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNe pozabimo dodati cookieja, to se naredi v dveh vrsticah:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: spremenimo NGINX v poln vrhnji stre\u017enik aplikacij\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrimer je preprost, teoreti\u010den. Seveda ne bomo ustvarjali storitve, ki prikazuje ljudem ma\u010dke. Kdo ve. Zato poglejmo, kaj lahko naredimo v produkciji.<\/p>\n<ul>\n<li><strong>Minimalisti\u010dna nazadnja<\/strong>. V\u010dasih potrebujemo, da nazadnja vrne zelo malo podatkov: kje je treba postaviti datum, kje prikazati kak\u0161en seznam, povedati, koliko uporabnikov je trenutno na spletnem mestu, prilo\u017eiti \u0161tevec ali statistiko. Nekaj takega majhnega. Minimalni ko\u0161\u010dki se lahko zelo enostavno izdelajo. S tem bo hitro, enostavno in dobro.\n<\/li>\n<li><strong>Predobdelava podatkov<\/strong>. V\u010dasih si \u017eelimo vklju\u010diti ogla\u0161evanje na na\u0161o stran, pri \u010demer to ogla\u0161evanje pridobivamo preko API poizvedb. To je zelo enostavno narediti tukaj. Ne obremenjujemo na\u0161ega backend-a, ki \u017ee tako trdo dela. Lahko pa to sestavimo tukaj. Lahko naredimo kak\u0161en JS ali pa ravno obratno, kaj predelamo, preden to posredujemo uporabniku.\n<\/li>\n<li><strong>Facade za mikroservis<\/strong>. To je prav tako zelo dobra zadeva, jo je \u017ee izvedel. Pred tem sem delal v podjetju Tenzor, ki se ukvarja z elektronskim poro\u010danjem, in zagotavlja poro\u010danje pribli\u017eno polovici pravnih oseb v dr\u017eavi. Naredili smo storitev, kjer je bilo s pomo\u010djo istega mehanizma izvedenih mnogo stvari: usmerjanje, avtentikacija in drugo.<br \/>\nOpenResty lahko uporabite kot vezivo za va\u0161e mikroservise, ki bo zagotovil enoten dostop do vsega in enoten vmesnik. Ker so mikroservisi lahko napisani tako, da imate tu Node.js, tam PHP, tam Python, in tam je lahko kaj na Erlangu, razumemo, da ne \u017eelimo istega kode pretvarjati povsod. Zato lahko OpenResty postavite na sprednji del.<\/p>\n<\/li>\n<li><strong>Statistika in analiza<\/strong>. Obi\u010dajno NGINX stoji na vhodu in vse poizvedbe gredo preko njega. Prav na tem mestu je zelo priro\u010dno zbirati. Lahko nekaj neposredno izra\u010dunate in nekam po\u0161ljete, na primer Elasticsearch, Logstash ali pa preprosto zapi\u0161ete v dnevnik in ga kasneje kam po\u0161ljete.\n<\/li>\n<li><strong>Ve\u010duporabni\u0161ki sistemi<\/strong>. Na primer, spletne igre je prav tako zelo dobro razvijati. Danes bo v Cape Townu Aleksander Gladish govoril o tem, kako hitro prototipirati ve\u010duporabni\u0161ko igro z uporabo OpenResty.\n<\/li>\n<li><strong>Filtracija poizvedb (WAF)<\/strong>. Zdaj je moderno delati razli\u010dne po\u017earne zidove za spletne aplikacije, je veliko storitev, ki jih zagotavljajo. S pomo\u010djo OpenResty lahko ustvarite svoj spletni po\u017earni zid, ki bo preprosto in enostavno filtriral poizvedbe po va\u0161ih zahtevah. \u010ce imate Python, potem razumete, da vam PHP zagotovo ne morejo injicirati, razen \u010de seveda ga ne za\u017eenete iz konzole nikjer. Veste, da imate MySQL in Python. Verjetno bodo tu poskusili narediti kak\u0161no pre\u010dkanje direktorija in kaj injicirati v bazo. Zato lahko hitro in poceni filtrirate slabih poizvedb takoj na sprednjem delu.\n<\/li>\n<li><strong>Skupnost.<\/strong> Ker je OpenResty zgrajen na osnovi NGINX, ima \u0161e dodatek - to je <strong>NGINX skupnost<\/strong>Je zelo obse\u017een in znaten del vpra\u0161anj, ki se vam lahko sprva postavi, je \u017ee re\u0161en s strani skupnosti NGINX.\n<p><strong>Lua razvijalci<\/strong>V\u010deraj sem se pogovarjal z ljudmi, ki so pri\u0161li na izobra\u017eevalni dan HighLoad++, in sli\u0161al, da je le Tarantool napisan v Lua. To ni res, v Lua je napisanih veliko stvari. Primeri: OpenResty, stre\u017enik XMPP Prosody, igralni motor Love2D, Lua se uporablja v Warcraftu in na drugih mestih. Lua razvijalcev je zelo veliko, imajo veliko in odzivno skupnost. Vsa moja vpra\u0161anja o Lua so bila re\u0161ena v nekaj urah. Ko pi\u0161em na mailing listo, dobi\u0161 v dobesedno nekaj minutah kup odgovorov, ki podrobno razlo\u017eijo, kako in kaj, in kaj je s \u010dim. To je res odli\u010dno. \u017dal pa ni povsod tako dobrosr\u010dna skupnost.<br \/>\nNa voljo je GitHub za OpenResty, kjer lahko odprete te\u017eavo, \u010de se kaj pokvari. Obstaja mailing lista na Google Groups, kjer se lahko razpravljajo splo\u0161na vpra\u0161anja, obstaja tudi mailing lista v kitaj\u0161\u010dini - \u010de slu\u010dajno ne obvladate angle\u0161\u010dine, morda pa znate kitajsko.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Zaklju\u010dki<\/h1>\n<p><\/p>\n<ul>\n<li>Upam, da sem uspel sporo\u010diti, da je OpenResty zelo priro\u010den okvir, prilagojen za splet.<\/li>\n<li>Njegov vstopni prag je nizek, saj je koda podobna tistemu, kar pi\u0161emo, jezik je precej preprost in minimalisti\u010den.<\/li>\n<li>Ponuja asinhronski I\/O brez povratnih klicev, ne bomo imeli 'testenin', kot jih v\u010dasih napi\u0161emo v NodeJS.<\/li>\n<li>Ima preprosto namestitev, saj potrebujemo le NGINX z ustreznim modulom in na\u0161o kodo, in \u017ee vse deluje.<\/li>\n<li>Velika in odzivna skupnost.<\/li>\n<\/ul>\n<p>\nNisem podrobno opisal, kako se izvaja usmerjanje, ker bi to bilo zelo dolgo pripovedovanje.<\/p>\n<p>Hvala za pozornost!<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"silrEB0Brvo\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/silrEB0Brvo\/hqdefault.jpg\" alt=\"Predvajaj video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<em><noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2016\/abstracts\/2432.html\">Vladimir Protasov - OpenResty: NGINX spremenimo v polnopravni stre\u017enik aplikacij<\/a><\/noindex><\/em><br \/>\n<br \/>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/321864\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0441 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 HighLoad++ 2016, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0430 \u0432 \u043f\u043e\u0434\u043c\u043e\u0441\u043a\u043e\u0432\u043d\u043e\u043c \u0421\u043a\u043e\u043b\u043a\u043e\u0432\u043e 7\u20148 \u043d\u043e\u044f\u0431\u0440\u044f \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430. \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u041f\u0440\u043e\u0442\u0430\u0441\u043e\u0432 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c NGINX \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e OpenResty \u0438 Lua. \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u041f\u0440\u043e\u0442\u0430\u0441\u043e\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 Parallels. \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043e \u0441\u0435\u0431\u0435. \u0422\u0440\u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0438\u0448\u0443 \u043a\u043e\u0434. \u0421\u0442\u0430\u043b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":71379,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-71378","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47OpenResty: \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c NGINX \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-25T17:45:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47OpenResty: NGINX spremenimo v polnopravni stre\u017enik aplikacij | ProHoster","description":"Ponovno objavljamo transkripcijo.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47OpenResty: \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c NGINX \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 | ProHoster","og:description":"\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443.","og:url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-25T17:45:02+00:00","article:modified_time":"2020-03-03T13:14:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"71378","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:03:22","updated":"2022-09-30 08:39:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}