{"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\/sk\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Op\u00e4\u0165 zverej\u0148ujeme prepis prezent\u00e1cie z konferencie <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, ktor\u00e1 sa konala v podmoskovskom Skolkovu 7.\u20148. novembra minul\u00e9ho roku. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> hovor\u00ed, ako roz\u0161\u00edri\u0165 funk\u010dnos\u0165 NGINX pomocou OpenResty a Lua.<\/em><\/p>\n<p>Ahojte, vol\u00e1m sa Vladimir Protasov, pracujem v Parallels. Povedal by som nie\u010do o sebe. Tri \u0161tvrtiny svojho \u017eivota sa zaober\u00e1m p\u00edsan\u00edm k\u00f3du. Stal som sa program\u00e1torom do morku kost\u00ed v pravom slova zmysle: niekedy v noci vid\u00edm k\u00f3d aj vo sne. \u0160tvrtinu \u017eivota \u2013 priemyslovou v\u00fdrobou, p\u00edsan\u00edm k\u00f3du, ktor\u00fd ide priamo do produkcie. K\u00f3d, ktor\u00fd niektor\u00ed z v\u00e1s pou\u017e\u00edvaj\u00fa, ale ani netu\u0161ia, \u017ee ho pou\u017e\u00edvaj\u00fa.<\/p>\n<p>Aby ste ch\u00e1pali, ako zl\u00e9 to bolo. Ke\u010f som bol mal\u00fd junior, pri\u0161iel som a dostal som tak\u00e9 dvojterabajtov\u00e9 datab\u00e1zy. Dnes m\u00e1 ka\u017ed\u00fd highload. Chodieval som na konferencie, p\u00fdtal som sa: \u201eChalani, povedzte, m\u00e1te big data, v\u0161etko super? Ko\u013eko m\u00e1te tam datab\u00e1z?\u201c Odpovedali mi: \u201eM\u00e1me 100 gigabajtov!\u201c Hovoril som: \u201eSuper, 100 gigabajtov!\u201c A vn\u00fatri som si myslel, ako si udr\u017ea\u0165 poker face. Mysl\u00ed\u0161, \u017ee \u00e1no, chalani s\u00fa super, a potom sa vr\u00e1ti\u0161 a dupo\u0161 s t\u00fdmi mnohoterabajtov\u00fdmi datab\u00e1zami. A to ako junior. Predstavte si, ak\u00fd to bol \u00fader?<\/p>\n<p>Pozn\u00e1m viac ako 20 programovac\u00edch jazykov. To je to, \u010do som sa musel nau\u010di\u0165 po\u010das pr\u00e1ce. Daj\u00fa ti k\u00f3d na Erlangu, C, C++, Lua, Python, Ruby a na nie\u010dom \u010fal\u0161om, a ty to v\u0161etko mus\u00ed\u0161 vyrobi\u0165. V skratke, musel som. Presn\u00fd po\u010det sa mi nepodarilo spo\u010d\u00edta\u0165, ale asi som stratil preh\u013ead pri 20.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKe\u010f\u017ee v\u0161etci pr\u00edtomn\u00ed vedia, \u010do je Parallels a \u010d\u00edm sa zaober\u00e1me, nebudem sa rozpr\u00e1va\u0165 o tom, ak\u00ed sme \u00fa\u017easn\u00ed a \u010do rob\u00edme. Poviem len, \u017ee m\u00e1me 13 kancel\u00e1ri\u00ed po celom svete, viac ako 300 zamestnancov, v\u00fdvoj v Moskve, Tallinne a na Malte. Ak m\u00e1te z\u00e1ujem, m\u00f4\u017eete sa pres\u0165ahova\u0165 na Maltu, ak je zima a potrebujete si trochu zahria\u0165 chrbticu.<\/p>\n<p>Konkr\u00e9tne n\u00e1\u0161 t\u00edm pracuje s Python 2. Zaober\u00e1me sa biznisom a nem\u00e1me \u010das zav\u00e1dza\u0165 m\u00f3dne technol\u00f3gie, tak\u017ee trp\u00edme. M\u00e1me Django, preto\u017ee obsahuje v\u0161etko, \u010do potrebujeme, a nepotrebn\u00e9 sme vyhodili. Takisto MySQL, Redis a NGINX. M\u00e1me ve\u013ea \u010fal\u0161\u00edch skvel\u00fdch vec\u00ed. M\u00e1me MongoDB, m\u00e1me kr\u00e1liky behaj\u00face, m\u00e1me \u010doko\u013evek \u2013 ale to nie je moja pr\u00e1ca a t\u00fdm sa nezaober\u00e1m.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nO sebe som povedal. Po\u010fme sa pozrie\u0165, o \u010dom budem dnes hovori\u0165:<\/p>\n<ul>\n<li>\u010co je OpenResty a na \u010do je dobr\u00fd?<\/li>\n<li>Pre\u010do vyn\u00e1\u0161a\u0165 \u010fal\u0161\u00ed bicykel, ke\u010f m\u00e1me Python, NodeJS, PHP, Go a \u010fal\u0161ie skvel\u00e9 veci, s ktor\u00fdmi s\u00fa v\u0161etci spokojn\u00ed?<\/li>\n<li>A k\u00fasok pr\u00edkladov z praxe. Musel som v\u00fdrazne skr\u00e1ti\u0165 predn\u00e1\u0161ku, preto\u017ee vych\u00e1dzala na 3,5 hodiny, tak\u017ee pr\u00edkladov bude m\u00e1lo.<\/li>\n<\/ul>\n<p>\nOpenResty je NGINX. V\u010faka nemu m\u00e1me plnohodnotn\u00fd webov\u00fd server, ktor\u00fd je dobre nap\u00edsan\u00fd a r\u00fdchlo funguje. Mysl\u00edm, \u017ee v\u00e4\u010d\u0161ina z n\u00e1s pou\u017e\u00edva NGINX v produkcii. V\u0161etci viete, \u017ee je r\u00fdchly a skvel\u00fd. M\u00e1 skvel\u00e9 synchronn\u00e9 vstupy\/v\u00fdstupy, tak\u017ee nemus\u00edme ni\u010d vym\u00fd\u0161\u013ea\u0165, ako to rob\u00edme v Pythone s gevent. Gevent je skvel\u00fd, fajn, ale ak nap\u00ed\u0161ete k\u00f3d v C a nie\u010do sa pokaz\u00ed, tak sa z toho s geventem zbl\u00e1znite pri debagovan\u00ed. M\u00e1m s t\u00fdm sk\u00fasenos\u0165: trvalo mi cel\u00e9 dva dni, k\u00fdm som zistil, \u010do sa skuto\u010dne stalo. Keby sa niekto nepok\u00fasil nieko\u013eko t\u00fd\u017ed\u0148ov predt\u00fdm, nena\u0161iel probl\u00e9m, nenap\u00edsal to na Internet a Google by to nena\u0161iel, boli by sme \u00faplne z\u00fafal\u00ed.<\/p>\n<p>V NGINX u\u017e existuje cache a statick\u00fd obsah. Nemus\u00edte sa ob\u00e1va\u0165, ako to spr\u00e1vne urobi\u0165, aby niekde neza\u010dalo spoma\u013eova\u0165, aby ste niekde nestratili deskriptory. Nginx je ve\u013emi pohodln\u00e9 nasadzova\u0165, nemus\u00edte prem\u00fd\u0161\u013ea\u0165, \u010do vzia\u0165 \u2013 WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx nain\u0161talujete, odovzd\u00e1te administr\u00e1torom, oni vedia, ako s t\u00fdm pracova\u0165. Nginx \u0161trukt\u00farovane spracov\u00e1va po\u017eiadavky. O tom poviem nesk\u00f4r. Stru\u010dne povedan\u00e9, m\u00e1 f\u00e1zu, ke\u010f len prijal po\u017eiadavku, ke\u010f ju spracoval a ke\u010f odovzdal obsah pou\u017e\u00edvate\u013eovi.<\/p>\n<p>Nginx je skvel\u00fd, ale je tu jeden probl\u00e9m: nie je dostato\u010dne flexibiln\u00fd, aj pri v\u0161etk\u00fdch t\u00fdch skvel\u00fdch funkci\u00e1ch, ktor\u00e9 chalani vtla\u010dili do konfigur\u00e1cie, aj ke\u010f je mo\u017en\u00e9 ho nastavi\u0165. Tieto mo\u017enosti s\u00fa nedostato\u010dn\u00e9. Preto chalani z Taobao pred \u00f4smimi rokmi, mysl\u00edm, zakomponovali Lua. \u010co to prin\u00e1\u0161a?<\/p>\n<ul>\n<li><strong>Ve\u013ekos\u0165<\/strong>. Je mal\u00fd. LuaJIT prin\u00e1\u0161a zhruba 100-200 kilobajtov pam\u00e4\u0165ov\u00e9ho overheadu a minim\u00e1lny overhead pri v\u00fdkonnosti.<\/li>\n<li><strong>R\u00fdchlos\u0165<\/strong>. Interpreter LuaJIT je v mnoh\u00fdch situ\u00e1ci\u00e1ch bl\u00edzko C, v niektor\u00fdch situ\u00e1ci\u00e1ch prehr\u00e1va proti Jave, v niektor\u00fdch ju predbehne. Nejak\u00fd \u010das bol pova\u017eovan\u00fd za \u0161tandard, najlep\u0161\u00ed JIT kompil\u00e1tor. Teraz existuj\u00fa lep\u0161ie, ale s\u00fa ve\u013emi \u0165a\u017ek\u00e9, napr\u00edklad ten ist\u00fd V8. Niektor\u00e9 JS interpretery a Java HotSpot s\u00fa v niektor\u00fdch bodoch r\u00fdchlej\u0161ie, ale v niektor\u00fdch oblastiach st\u00e1le zaost\u00e1vaj\u00fa.<\/li>\n<li><strong>Jednoduchos\u0165 u\u010denia<\/strong>. Ak m\u00e1te napr\u00edklad k\u00f3dov\u00fa z\u00e1klad\u0148u v Perle a nie ste Booking, nen\u00e1jdete program\u00e1torov v Perle. Preto\u017ee nie s\u00fa, v\u0161etk\u00fdch vzali, a u\u010di\u0165 ich trv\u00e1 dlho a je to n\u00e1ro\u010dn\u00e9. Ak chcete program\u00e1torov na nie\u010dom inom, mo\u017eno ich tie\u017e bude treba prekvalifikova\u0165 alebo n\u00e1js\u0165. V pr\u00edpade Lua je to jednoduch\u00e9. Lua sa nau\u010d\u00ed ak\u00fdko\u013evek junior za tri dni. Mne trvalo asi dve hodiny, aby som sa zorientoval. Po dvoch hodin\u00e1ch som u\u017e p\u00edsal k\u00f3d do produkcie. Asi po t\u00fd\u017edni ho priamo poslali do produkcie.<\/li>\n<\/ul>\n<p>\nV\u00fdsledok vyzer\u00e1 takto:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nJe tu mno\u017estvo vec\u00ed. V OpenResty skombinovali mno\u017estvo modulov, ako lua-ov\u00fdch, tak aj engine-ov\u00fdch. A m\u00e1te v\u0161etko pripraven\u00e9 \u2013 nasadili ste a funguje to.<\/p>\n<h1>Pr\u00edklady<\/h1>\n<p>\nDos\u0165 s lyrikou, po\u010fme k\u00f3du. Tu je jednoduch\u00e9 Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u010co je tu? Toto je engine-ov\u00fd location. Nezaober\u00e1me sa t\u00fdm, nep\u00ed\u0161eme svoj routing, neberieme nejak\u00fd hotov\u00fd \u2013 u\u017e ho m\u00e1me v NGINX, \u017eijeme pohodlne a lenivo.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 to je blok, ktor\u00fd hovor\u00ed, \u017ee pred\u00e1vame obsah pomocou Lua skriptu. Berieme engine-ov\u00fa premenn\u00fa <code>remote_addr<\/code> a pod\u00e1vame ju do <code>string.format<\/code>. To ist\u00e9, ako <code>sprintf<\/code>, len na Lua, len spr\u00e1vne. A vr\u00e1time klientovi.<\/p>\n<p>V\u00fdsledok bude vyzera\u0165 takto:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAle vr\u00e1\u0165me sa do re\u00e1lneho sveta. Do produkcie nikto nenasadzuje Hello World. Na\u0161a aplik\u00e1cia zvy\u010dajne komunikuje s datab\u00e1zou alebo niekde inde a v\u00e4\u010d\u0161inu \u010dasu \u010dak\u00e1 na odpove\u010f.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProsto sed\u00ed a \u010dak\u00e1. To nie je ve\u013emi dobr\u00e9. Ke\u010f pr\u00edde 100 000 pou\u017e\u00edvate\u013eov, je n\u00e1m ve\u013emi \u0165a\u017eko. Preto si vezmime ako pr\u00edklad jednoduch\u00fa aplik\u00e1ciu. Budeme h\u013eada\u0165 obr\u00e1zky, povedzme, ma\u010diatok. Len nebudeme len tak h\u013eada\u0165, budeme roz\u0161irova\u0165 k\u013e\u00fa\u010dov\u00e9 slov\u00e1 a ak pou\u017e\u00edvate\u013e h\u013ead\u00e1 \u201ema\u010diatka\u201c, n\u00e1jdeme mu ma\u010dky, chlpat\u00e9 a podobne. Na za\u010diatok potrebujeme z\u00edska\u0165 \u00fadaje po\u017eiadavky na backend. Vyzer\u00e1 to takto:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDve riadky v\u00e1m umo\u017enia z\u00edska\u0165 GET parametre, \u017eiadne zlo\u017eitosti. Potom, povedzme, z datab\u00e1zy s tabu\u013ekou pod\u013ea k\u013e\u00fa\u010dov\u00e9ho slova a pr\u00edpony z\u00edskame t\u00fato inform\u00e1ciu be\u017en\u00fdm SQL pr\u00edkazom. V\u0161etko je jednoduch\u00e9. Vyzer\u00e1 to takto:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPripoj\u00edme kni\u017enicu <code>resty.mysql<\/code>, ktor\u00e1 u\u017e je u n\u00e1s v s\u00faprave. Nemus\u00edme ni\u010d in\u0161talova\u0165, v\u0161etko je pripraven\u00e9. Uv\u00e1dzame, ako sa pripoji\u0165, a rob\u00edme SQL pr\u00edkaz:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTu je to tro\u0161ku stra\u0161ideln\u00e9, ale v\u0161etko funguje. Tu je 10 \u2013 to je limit. Vy\u0165ahujeme 10 z\u00e1znamov, sme leniv\u00ed, nechceme ukazova\u0165 viac. Na limit v SQL som zabudol.<\/p>\n<p>\u010ealej h\u013ead\u00e1me obr\u00e1zky pod\u013ea v\u0161etk\u00fdch po\u017eiadaviek. Zbierame bal\u00edk po\u017eiadaviek a vyp\u013a\u0148ame Lua tabu\u013eku, ktor\u00e1 sa vol\u00e1 <code>reqs<\/code>, a rob\u00edme <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u0161etky tieto po\u017eiadavky id\u00fa paralelne a vracaj\u00fa n\u00e1m odpovede. \u010cas spracovania je rovn\u00fd \u010dasu odpovede najpomal\u0161ieho. Ak sa n\u00e1m v\u0161etky spracuj\u00fa za 50 milisek\u00fand a poslali sme sto po\u017eiadaviek, odpove\u010f dostaneme za 50 milisek\u00fand.<\/p>\n<p>Ke\u010f\u017ee sme leniv\u00ed a nechceme p\u00edsa\u0165 spracovanie HTTP a cacheovania, prin\u00fatime NGINX robi\u0165 v\u0161etko za n\u00e1s. Ako ste videli, tam bola po\u017eiadavka na <code>url\/fetch<\/code>, to je ono:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nRob\u00edme jednoduch\u00fd <code>proxy_pass<\/code>, ur\u010dujeme, kam to zakonzervova\u0165, ako to spravi\u0165, a m\u00e1me v\u0161etko funk\u010dn\u00e9.<\/p>\n<p>Ale to nesta\u010d\u00ed, mus\u00edme e\u0161te odovzda\u0165 d\u00e1ta pou\u017e\u00edvate\u013eovi. Najjednoduch\u0161ia my\u0161lienka \u2013 v\u0161etko serializova\u0165 do JSON-u, jednoduch\u00e9, na dve \u010diarky. Odovzd\u00e1vame Content-Type, odovzd\u00e1vame JSON.<\/p>\n<p>Ale je tu jedna komplik\u00e1cia: pou\u017e\u00edvate\u013e nechce \u010d\u00edta\u0165 JSON. Mus\u00edme pritiahnu\u0165 frontendistov. Niekedy sa n\u00e1m to zo za\u010diatku nechce robi\u0165. A SEO \u0161pecialisti povedia, \u017ee ak h\u013ead\u00e1me obr\u00e1zky, je im to jedno. A ak im poskytujeme nejak\u00fd obsah, povedia, \u017ee na\u0161e vyh\u013ead\u00e1va\u010de ni\u010d neindexuj\u00fa.<\/p>\n<p>\u010co s t\u00fdm robi\u0165? Samozrejme, budeme odovzd\u00e1va\u0165 pou\u017e\u00edvate\u013eovi HTML. Generova\u0165 ru\u010dne \u2013 nie je \u0161t\u00fdlov\u00e9, preto chceme pou\u017ei\u0165 \u0161abl\u00f3ny. Na to existuje kni\u017enica <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUr\u010dite ste si v\u0161imli tri desiv\u00e9 p\u00edsmen\u00e1 OPM. OpenResty prich\u00e1dza so svoj\u00edm spr\u00e1vcom bal\u00edkov, cez ktor\u00fd m\u00f4\u017eeme nain\u0161talova\u0165 e\u0161te mno\u017estvo r\u00f4znych modulov, konkr\u00e9tne <code>lua-resty-template<\/code>. Je to jednoduch\u00fd \u0161abl\u00f3nov\u00fd engine, bl\u00edzky Django \u0161abl\u00f3nam. Tam m\u00f4\u017eeme nap\u00edsa\u0165 k\u00f3d a urobi\u0165 substit\u00faciu premenn\u00fdch.<\/p>\n<p>V d\u00f4sledku toho to bude vyzera\u0165 zhruba takto:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVzali sme d\u00e1ta a zrenderovali \u0161abl\u00f3nu op\u00e4\u0165 len na dve \u010diarky. Pou\u017e\u00edvate\u013e je \u0161\u0165astn\u00fd, dostal ma\u010di\u010dky. Ke\u010f\u017ee sme roz\u0161\u00edrili po\u017eiadavku, dostal okrem ma\u010diatok aj morsk\u00e9ho leva. Kto vie, mo\u017eno pr\u00e1ve jeho h\u013eadal, ale nemohol spr\u00e1vne formulova\u0165 svoj dopyt.<\/p>\n<p>V\u0161etko je skvel\u00e9, ale sme predsa v v\u00fdvoji a zatia\u013e nechceme pou\u017e\u00edvate\u013eom ukazova\u0165. Po\u010fme spravi\u0165 autoriz\u00e1ciu. Aby sme to spravili, pozrime sa, ako NGINX spracov\u00e1va po\u017eiadavku z poh\u013eadu OpenResty:<\/p>\n<ul>\n<li>Prv\u00e1 f\u00e1za \u2013 <strong>access<\/strong>, ke\u010f pou\u017e\u00edvate\u013e pr\u00e1ve pri\u0161iel, a my sme sa na\u0148ho pozreli pod\u013ea hlavi\u010diek, pod\u013ea IP adresy a in\u00fdch \u00fadajov. M\u00f4\u017eeme ho okam\u017eite odpoji\u0165, ak sa n\u00e1m nep\u00e1\u010di. Toto m\u00f4\u017eeme pou\u017ei\u0165 na autentifik\u00e1ciu, alebo, ak n\u00e1m prich\u00e1dza ve\u013ea \u017eiadost\u00ed, m\u00f4\u017eeme ich \u013eahko odmietnu\u0165 v tejto f\u00e1ze.<\/li>\n<li><strong>rewrite<\/strong>. Prepisujeme nejak\u00e9 \u00fadaje \u017eiadosti.<\/li>\n<li><strong>content<\/strong>. Odovzd\u00e1vame obsah pou\u017e\u00edvate\u013eovi.<\/li>\n<li><strong>filter hlavi\u010diek<\/strong>. M\u00f4\u017eeme zmeni\u0165 hlavi\u010dky odpovede. Ak sme pou\u017eili <code>proxy_pass<\/code>, m\u00f4\u017eeme prep\u00edsa\u0165 niektor\u00e9 hlavi\u010dky predt\u00fdm, ako ich odovzd\u00e1me pou\u017e\u00edvate\u013eovi.<\/li>\n<li><strong>filter tela<\/strong>. M\u00f4\u017eeme zmeni\u0165 telo.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 logovanie. M\u00f4\u017eeme zapisova\u0165 logy do elasticsearch bez dodato\u010dnej vrstvy.<\/li>\n<\/ul>\n<p>\nNa\u0161a autentifik\u00e1cia bude vyzera\u0165 pribli\u017ene takto:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nToto prid\u00e1me do toho <code>location<\/code>, ktor\u00e9 sme op\u00edsali predt\u00fdm, a vlo\u017e\u00edme tam tak\u00fdto k\u00f3d:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPozrieme sa, \u010di m\u00e1me cookie token. Ak nie, odosielame na autentifik\u00e1ciu. Pou\u017e\u00edvatelia s\u00fa pref\u00edkan\u00ed a m\u00f4\u017eu uh\u00e1dnu\u0165, \u017ee je potrebn\u00e9 nastavi\u0165 cookie token. Preto to e\u0161te ulo\u017e\u00edme aj do Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nK\u00f3d pr\u00e1ce s Redis je ve\u013emi jednoduch\u00fd a nel\u00ed\u0161i sa od in\u00fdch jazykov. V\u0161etok vstup\/v\u00fdstup tam aj tu je neblokuj\u00faci. Ak p\u00ed\u0161ete synchronn\u00fd k\u00f3d, funguje to asynchr\u00f3nne. Menej viac ako s gevent, ale spraven\u00e9 to je dobre.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPo\u010fme spravi\u0165 samotn\u00fa autentifik\u00e1ciu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPovieme, \u017ee potrebujeme \u010d\u00edta\u0165 telo \u017eiadosti. Z\u00edskame POST argumenty, skontrolujeme, \u010di je pou\u017e\u00edvate\u013esk\u00e9 meno a heslo spr\u00e1vne. Ak s\u00fa nespr\u00e1vne, odosielame na autentifik\u00e1ciu. A ak s\u00fa spr\u00e1vne, uklad\u00e1me token do Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNezabudnite nastavi\u0165 cookie, to sa tie\u017e rob\u00ed v dvoch riadkoch:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPr\u00edklad je jednoduch\u00fd, teoretick\u00fd. Samozrejme, \u017ee nebudeme robi\u0165 slu\u017ebu, ktor\u00e1 ukazuje \u013eu\u010fom ma\u010dky. Aj ke\u010f kto n\u00e1s pozn\u00e1. Preto po\u010fme prejs\u0165 po tom, \u010do m\u00f4\u017eeme spravi\u0165 v produkcii.<\/p>\n<ul>\n<li><strong>Minimalistick\u00e9 backendov\u00e9 rie\u0161enie<\/strong>. Niekedy potrebujeme v backende vyda\u0165 len p\u00e1r \u00fadajov: niekde je potrebn\u00e9 dosadi\u0165 d\u00e1tum, niekde zobrazi\u0165 nejak\u00fd zoznam, poveda\u0165, ko\u013eko pou\u017e\u00edvate\u013eov je teraz na str\u00e1nke, pripoji\u0165 po\u010d\u00edtadlo alebo \u0161tatistiku. Nie\u010do tak\u00e9 mal\u00e9. Minim\u00e1lne k\u00fasky je ve\u013emi \u013eahk\u00e9 vytvori\u0165. Na tomto to bude r\u00fdchlo, jednoducho a skvele.\n<\/li>\n<li><strong>Preprocessing \u00fadajov<\/strong>. Niekedy m\u00e1me chu\u0165 za\u010dleni\u0165 do na\u0161ich str\u00e1nok reklamu, pri\u010dom t\u00fato reklamu berieme cez API po\u017eiadavky. Je ve\u013emi jednoduch\u00e9 to urobi\u0165 pr\u00e1ve tu. Neza\u0165a\u017eujeme n\u00e1\u0161 backend, ktor\u00fd u\u017e \u0165a\u017eko pracuje. M\u00f4\u017eeme si to tu zbiera\u0165. M\u00f4\u017eeme posklada\u0165 nejak\u00e9 JS alebo, naopak, rozlo\u017ei\u0165, nie\u010do preprocessova\u0165 pred t\u00fdm, ne\u017e to odovzd\u00e1me pou\u017e\u00edvate\u013eovi.\n<\/li>\n<li><strong>Facade pre microservice<\/strong>. Toto je tie\u017e ve\u013emi dobr\u00fd pr\u00edpad, ktor\u00fd som realizoval. Predt\u00fdm som pracoval vo firme Tenzor, ktor\u00e1 sa zaober\u00e1 elektronick\u00fdm reportovan\u00edm a zabezpe\u010duje reportovanie asi pre polovicu pr\u00e1vnick\u00fdch os\u00f4b v krajine. Vytvorili sme slu\u017ebu, kde pomocou tohto mechanizmu bola realizovan\u00e1 v\u00e4\u010d\u0161ina vec\u00ed: smerovanie, autoriz\u00e1cia a in\u00e9.<br \/>\nOpenResty mo\u017eno pou\u017ei\u0165 ako lepidlo pre va\u0161e microservisy, ktor\u00e9 zabezpe\u010d\u00ed jednotn\u00fd pr\u00edstup ku v\u0161etk\u00e9mu a jedin\u00e9mu rozhraniu. Ke\u010f\u017ee microservisy m\u00f4\u017eu by\u0165 nap\u00edsan\u00e9 tak, \u017ee tu m\u00e1te Node.js, tu m\u00e1te PHP, tu Python, a niekde be\u017e\u00ed nie\u010do na Erlangu, ch\u00e1peme, \u017ee nechceme prepisova\u0165 ten ist\u00fd k\u00f3d v\u0161ade. Preto sa OpenResty d\u00e1 zasadi\u0165 na front-end.<\/p>\n<\/li>\n<li><strong>\u0160tatistika a anal\u00fdza<\/strong>. Zvy\u010dajne NGINX stoj\u00ed na vstupe a v\u0161etky po\u017eiadavky id\u00fa cez neho. Pr\u00e1ve na tomto mieste je ve\u013emi pohodln\u00e9 zbiera\u0165 d\u00e1ta. M\u00f4\u017eete nie\u010do ihne\u010f po\u010d\u00edta\u0165 a niekam posla\u0165, napr\u00edklad do Elasticsearch, Logstash alebo len zaznamena\u0165 do logu a potom niekam odosla\u0165.\n<\/li>\n<li><strong>Viacer\u00ed u\u017e\u00edvatelia v syst\u00e9me<\/strong>. Napr\u00edklad online hry sa tie\u017e ve\u013emi dobre robia. Dnes v Kapskom Meste bude Alexander Glad\u00fd\u0161 rozpr\u00e1va\u0165, ako r\u00fdchlo prototypova\u0165 multiplayerov\u00fa hru pomocou OpenResty.\n<\/li>\n<li><strong>Filtrovanie po\u017eiadaviek (WAF)<\/strong>. Dnes je modern\u00e9 robi\u0165 r\u00f4zne webov\u00e9 aplika\u010dn\u00e9 firewally, existuje mnoho slu\u017eieb, ktor\u00e9 ich poskytuj\u00fa. S pomocou OpenResty si mo\u017eete vytvori\u0165 webov\u00fd aplika\u010dn\u00fd firewall, ktor\u00fd jednoducho a \u013eahko bude filtrova\u0165 po\u017eiadavky pod\u013ea va\u0161ich po\u017eiadaviek. Ak m\u00e1te Python, ch\u00e1pete, \u017ee PHP v\u00e1m ur\u010dite nem\u00f4\u017ee prejs\u0165 injekciou, ak ho samozrejme nespaun\u00edte nikde z konzoly. Viete, \u017ee m\u00e1te MySQL a Python. Pravdepodobne sa tu niekto m\u00f4\u017ee pok\u00fasi\u0165 urobi\u0165 nejak\u00fd directory traversal a nie\u010do infiltrova\u0165 do datab\u00e1zy. Preto m\u00f4\u017eete r\u00fdchlo a lacno filtrova\u0165 podozriv\u00e9 po\u017eiadavky priamo na front-end.\n<\/li>\n<li><strong>Komunita.<\/strong> Ke\u010f\u017ee OpenResty je postaven\u00fd na NGINX, m\u00e1 bonus - to je <strong>NGINX-komunita<\/strong>Je to ve\u013emi rozsiahle a zna\u010dn\u00e1 \u010das\u0165 ot\u00e1zok, ktor\u00e9 sa v\u00e1m na za\u010diatku m\u00f4\u017eu vyskytn\u00fa\u0165, u\u017e bola vyrie\u0161en\u00e1 komunitou NGINX.\n<p><strong>Lua v\u00fdvoj\u00e1ri<\/strong>V\u010dera som hovoril s chlapcami, ktor\u00ed pri\u0161li na vzdel\u00e1vac\u00ed de\u0148 HighLoad++ a po\u010dul som, \u017ee na Lua je nap\u00edsan\u00fd iba Tarantool. To nie je pravda, na Lua je nap\u00edsan\u00fdch ve\u013ea projektov. Pr\u00edklady: OpenResty, XMPP server Prosody, hern\u00fd engine Love2D, Lua sa pou\u017e\u00edva v Warcraft a na in\u00fdch miestach. Lua v\u00fdvoj\u00e1rov je ve\u013ea, maj\u00fa ve\u013ek\u00fa a ochotn\u00fa komunitu. V\u0161etky moje ot\u00e1zky oh\u013eadom Lua boli vyrie\u0161en\u00e9 v priebehu nieko\u013ek\u00fdch hod\u00edn. Ke\u010f nap\u00ed\u0161ete na mailing list, doslova o p\u00e1r min\u00fat u\u017e dostanete mno\u017estvo odpoved\u00ed, ktor\u00e9 v\u00e1m vysvetlia, \u010do a ako, \u010do k \u010domu. Je to naozaj skvel\u00e9. Bohu\u017eia\u013e, nie v\u0161ade je tak\u00e1 pohostinn\u00e1 du\u0161evn\u00e1 komunita.<br \/>\nNa OpenResty je GitHub, kde m\u00f4\u017eete zalo\u017ei\u0165 issue, ak sa nie\u010do pokaz\u00ed. Existuje mailing list na Google Groups, kde sa daj\u00fa prebra\u0165 v\u0161eobecn\u00e9 ot\u00e1zky, existuje aj mailing list v \u010d\u00edn\u0161tine \u2014 mo\u017eno, \u017ee anglicky nehovor\u00edte, ale m\u00e1jete vedomosti v \u010d\u00edn\u0161tine.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Zhrnutie<\/h1>\n<p><\/p>\n<ul>\n<li>D\u00fafam, \u017ee som dok\u00e1zal prenies\u0165, \u017ee OpenResty je ve\u013emi pohodln\u00fd framework, prisp\u00f4soben\u00fd na web.<\/li>\n<li>M\u00e1 n\u00edzky prah vstupu, preto\u017ee k\u00f3d je podobn\u00fd tomu, na \u010dom p\u00ed\u0161eme, jazyk je dos\u0165 jednoduch\u00fd a minimalistick\u00fd.<\/li>\n<li>Poskytuje asynchr\u00f3nny I\/O bez callbackov, nebudeme ma\u0165 \u017eiadne zamotan\u00e9 rie\u0161enia, ako sa to ob\u010das m\u00f4\u017ee sta\u0165 v NodeJS.<\/li>\n<li>M\u00e1 jednoduch\u00e9 nasadenie, preto\u017ee potrebujeme len NGINX s po\u017eadovan\u00fdm modulom a n\u00e1\u0161 k\u00f3d a v\u0161etko hne\u010f funguje.<\/li>\n<li>Ve\u013ek\u00e1 a ochotn\u00e1 komunita.<\/li>\n<\/ul>\n<p>\nNepovedal som podrobnosti o tom, ako sa rob\u00ed smerovanie, v\u00fdsledkom by bol ve\u013emi dlh\u00fd pr\u00edbeh.<\/p>\n<p>\u010eakujem za pozornos\u0165!<\/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=\"Prehrajte 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 \u2014 OpenResty: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server<\/a><\/noindex><\/em><br \/>\n<br \/>Zdroj: <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.4 - 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\/sk\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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: premen\u00edme NGINX na plnohodnotn\u00fd aplika\u010dn\u00fd server | ProHoster","description":"Op\u00e4\u0165 zverej\u0148ujeme prepis.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}