{"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\/sq\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Ne po publikojm\u00eb p\u00ebrs\u00ebri transkriptin e fjal\u00ebs nga konferenca <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, q\u00eb u mbajt n\u00eb Skolkovo, jasht\u00eb Mosk\u00ebs, m\u00eb 7\u20138 n\u00ebntor t\u00eb vitit t\u00eb kaluar. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> tregon si t\u00eb zgjeroni funksionalitetin e NGINX duke p\u00ebrdorur OpenResty dhe Lua.<\/em><\/p>\n<p>P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve, un\u00eb quhem Vladimir Protasov, punoj n\u00eb Parallels. Do t\u00eb flas pak p\u00ebr veten time. Tre t\u00eb kat\u00ebrtat e jet\u00ebs time kam punuar me kodin. Kam b\u00ebr\u00eb programues deri n\u00eb esenc\u00eb: ndonj\u00ebher\u00eb e shoh kodin edhe n\u00eb \u00ebndrrat e mia. Nj\u00eb t\u00eb kat\u00ebrt\u00ebn e jet\u00ebs - zhvillim industrial, shkruaj kod q\u00eb shkon direkt n\u00eb prodhim. Kod q\u00eb disa nga ju e p\u00ebrdorni, por nuk e dini k\u00ebt\u00eb.<\/p>\n<p>P\u00ebr ta kuptuar se sa keq ishte. Kur isha nj\u00eb junior i vog\u00ebl, erdha dhe m\u00eb dhan\u00eb baza me dy terabajt. Tani k\u00ebtu t\u00eb gjith\u00eb kan\u00eb highload. Shkoja n\u00eb konferenca dhe pyesja: 'Djem, tregoni, a keni big data, gjith\u00e7ka \u00ebsht\u00eb super? Sa e madhe \u00ebsht\u00eb baza juaj?' Ata me p\u00ebrgjigjen: 'Ne kemi 100 gigabajt!' Un\u00eb thosha: 'Super, 100 gigabajt!' Nd\u00ebrsa n\u00eb mendje mendoja se si t\u00eb mbaja nj\u00eb fytyr\u00eb t\u00eb qet\u00eb. Mendoj, po, djemt\u00eb jan\u00eb t\u00eb mrekulluesh\u00ebm, dhe pastaj kthehem dhe p\u00ebrleshem me k\u00ebto baza shum\u00eb terabajt. Dhe kjo - duke qen\u00eb junior. Mund t\u00eb imagjinoni se sa goditje ishte?<\/p>\n<p>Un\u00eb njoh m\u00eb shum\u00eb se 20 gjuh\u00eb programimi. Kjo \u00ebsht\u00eb di\u00e7ka q\u00eb m\u00eb \u00ebsht\u00eb dashur t\u00eb kuptoj gjat\u00eb pun\u00ebs. Ju japin kod n\u00eb Erlang, C, C++, Lua, Python, Ruby, dhe di\u00e7ka tjet\u00ebr, dhe duhet ta punoni. N\u00eb p\u00ebrgjith\u00ebsi, kjo ishte e nevojshme. Nuk arrita t\u00eb llogaris sakt\u00eb numrin, por ndoshta humba countin pas 20.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDuke qen\u00eb se t\u00eb gjith\u00eb t\u00eb pranish\u00ebm e din\u00eb \u00e7far\u00eb \u00ebsht\u00eb Parallels dhe me \u00e7far\u00eb merremi, nuk do t\u00eb flas p\u00ebr sa t\u00eb shk\u00eblqyer jemi dhe \u00e7far\u00eb b\u00ebjm\u00eb. Do t\u00eb theksoj vet\u00ebm se kemi 13 zyre n\u00eb bot\u00eb, m\u00eb shum\u00eb se 300 punonj\u00ebs, zhvillimi n\u00eb Mosk\u00eb, Tallin dhe n\u00eb Malt\u00eb. N\u00ebse d\u00ebshironi, mund t\u00eb transferoheni n\u00eb Malt\u00eb, n\u00ebse \u00ebsht\u00eb ftoht\u00eb dimri dhe duhet t\u00eb ngroheni.<\/p>\n<p>Sakt\u00ebsisht, departamenti yn\u00eb punon me Python 2. Ne merremi me biznes dhe nuk kemi koh\u00eb p\u00ebr t\u00eb futur teknologjit\u00eb e mod\u00ebs, k\u00ebshtu q\u00eb kemi v\u00ebshtir\u00ebsi. Ne p\u00ebrdorim Django, sepse aty ka gjith\u00e7ka, dhe heqim t\u00eb tep\u00ebrat. Po ashtu MySQL, Redis dhe NGINX. Kemi shum\u00eb gj\u00ebra t\u00eb tjera t\u00eb shk\u00eblqyera. Kemi MongoDB, ne kemi lepuj q\u00eb vrapojn\u00eb, kemi \u00e7far\u00ebdo - por kjo nuk \u00ebsht\u00eb pun\u00eb ime, dhe un\u00eb nuk merrem me t\u00eb.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nKam p\u00ebr vete fol\u00ebm. Le t\u00eb shohim se p\u00ebr \u00e7far\u00eb do flas sot:<\/p>\n<ul>\n<li>\u00c7far\u00eb \u00ebsht\u00eb OpenResty dhe si e p\u00ebrdorim at\u00eb?<\/li>\n<li>Pse t\u00eb shpikim nj\u00eb bi\u00e7iklet\u00eb tjet\u00ebr, kur kemi Python, NodeJS, PHP, Go dhe gj\u00ebra t\u00eb tjera t\u00eb shk\u00eblqyera me t\u00eb cilat t\u00eb gjith\u00eb jan\u00eb t\u00eb k\u00ebnaqur?<\/li>\n<li>Dhe pak shembuj nga jeta. M\u00eb duhej t\u00eb shkurtova shum\u00eb ligj\u00ebrat\u00ebn, sepse ajo rezultoi t\u00eb ishte 3.5 or\u00eb, prandaj shembujt do t\u00eb jen\u00eb t\u00eb pakta.<\/li>\n<\/ul>\n<p>\nOpenResty \u00ebsht\u00eb NGINX. Fal\u00eb tij kemi nj\u00eb server t\u00eb plot\u00eb web, i shkruar mir\u00eb dhe punon shpejt. Mendoj se shumica prej nesh p\u00ebrdorin NGINX n\u00eb prodhim. T\u00eb gjith\u00eb e dini se ai \u00ebsht\u00eb i shpejt\u00eb dhe i shk\u00eblqyer. Ata b\u00ebn\u00eb nj\u00eb hyrje\/dalje t\u00eb shk\u00eblqyer sinkron, prandaj nuk kemi nevoj\u00eb t\u00eb shpikim gj\u00ebra si\u00e7 \u00ebsht\u00eb b\u00ebr\u00eb me gevent n\u00eb Python. Gevent \u00ebsht\u00eb fantastik, por n\u00ebse shkruani kod n\u00eb C dhe di\u00e7ka shkon keq, ju do t\u00eb \u00e7mendeni p\u00ebr ta debuguar at\u00eb me gevent. Kam pasur eksperienc\u00eb: m'u desh\u00ebn dy dit\u00eb t\u00eb plota p\u00ebr t\u00eb kuptuar se \u00e7far\u00eb kishte shkuar keq. N\u00ebse dikush nuk do t\u00eb kishte g\u00ebrmuar p\u00ebr disa jav\u00eb p\u00ebrpara, nuk do t\u00eb kishte gjetur problem dhe nuk do ta kishte shkruar at\u00eb n\u00eb Internet, Google nuk do ta kishte gjetur k\u00ebt\u00eb, do t\u00eb ishim \u00e7mendur.<\/p>\n<p>N\u00eb NGINX, tashm\u00eb jan\u00eb b\u00ebr\u00eb caching dhe p\u00ebrmbajtje statike. Nuk keni nevoj\u00eb t\u00eb shqet\u00ebsoheni se si ta b\u00ebni at\u00eb si\u00e7 duhet, n\u00eb m\u00ebnyr\u00eb q\u00eb dikund t\u00eb mos ngecni, q\u00eb t\u00eb mos humbni ndonj\u00eb deskriptor. NGINX \u00ebsht\u00eb shum\u00eb e leht\u00eb p\u00ebr tu depolu, nuk keni nevoj\u00eb t\u00eb mendoni se \u00e7far\u00eb t\u00eb p\u00ebrdorni - WSGI, PHP-FPM, Gunicorn, Unicorn. Instaluar NGINX, ia dor\u00ebzuat administrator\u00ebve, ata din\u00eb si ta trajtojn\u00eb at\u00eb. NGINX trajton k\u00ebrkesat n\u00eb m\u00ebnyr\u00eb t\u00eb strukturuar. P\u00ebr k\u00ebt\u00eb do flas pak m\u00eb von\u00eb. N\u00eb p\u00ebrmbledhje, ka nj\u00eb faz\u00eb kur sapo pranoi k\u00ebrkes\u00ebn, nj\u00eb faz\u00eb kur e p\u00ebrpunoi dhe nj\u00eb faz\u00eb kur iu dha p\u00ebrmbajtja p\u00ebrdoruesit.<\/p>\n<p>Nginx \u00ebsht\u00eb i shk\u00eblqyer, por ka nj\u00eb problem: ai nuk \u00ebsht\u00eb mjaft i fleksib\u00ebl edhe me t\u00eb gjitha ato gj\u00ebra t\u00eb shk\u00eblqyera q\u00eb ekipi ka p\u00ebrfshir\u00eb n\u00eb konfigurimin e tij, p\u00ebrkund\u00ebr se mund t\u00eb konfigurohet. K\u00ebsaj fuqie i mungon fleksibiliteti. Prandaj, ekipi nga Taobao, para rreth tet\u00eb vjet\u00ebsh, e futi Lua atje. \u00c7far\u00eb na sjell kjo?<\/p>\n<ul>\n<li><strong>Madh\u00ebsia<\/strong>. Ai \u00ebsht\u00eb i vog\u00ebl. LuaJIT ofron rreth 100-200 kilobajt mbivendosje n\u00eb memorje dhe nj\u00eb mbivendosje minimale n\u00eb performanc\u00eb.<\/li>\n<li><strong>Shpejt\u00ebsia<\/strong>Interpreteri LuaJIT n\u00eb shum\u00eb situata \u00ebsht\u00eb i af\u00ebrm me C, n\u00eb disa situata ai humbet ndaj Java, dhe n\u00eb disa situata e tejkalon. Nj\u00eb koh\u00eb, ai u konsiderua state of the art, kompilatorin JIT m\u00eb t\u00eb avancuar. Tani ka m\u00eb t\u00eb avancuar, por ato jan\u00eb shum\u00eb t\u00eb r\u00ebnda, si p\u00ebr shembull V8. Disa interpretues JS dhe HotSpot-i i Java-s n\u00eb disa pika jan\u00eb m\u00eb t\u00eb shpejt\u00eb, por n\u00eb disa vendet akoma humbin.<\/li>\n<li><strong>Leht\u00ebsia n\u00eb m\u00ebsim<\/strong>. N\u00ebse ju, p\u00ebr shembull, keni nj\u00eb baz\u00eb kodi n\u00eb Perl, dhe nuk jeni Booking, nuk do t\u00eb gjeni programues Perl. Sepse nuk ka, t\u00eb gjith\u00eb i mor\u00ebn, dhe t\u2019i m\u00ebsoj ata \u00ebsht\u00eb e gjat\u00eb dhe e v\u00ebshtir\u00eb. N\u00ebse d\u00ebshironi programues n\u00eb di\u00e7ka tjet\u00ebr, ndoshta do t\u00eb duhet t'i ri-edukoni ose t'i gjeni. N\u00eb rastin e Lua, gjith\u00e7ka \u00ebsht\u00eb e thjesht\u00eb. Lua m\u00ebsohet nga \u00e7do junior brenda tre dit\u00ebsh. M\u00eb mori rreth dy or\u00eb p\u00ebr t\u2019u kuptuar. Pas dy or\u00ebve isha duke shkruar kod n\u00eb prodhim. Pas rreth nj\u00eb jave, ai shkoi direkt n\u00eb prodhim.<\/li>\n<\/ul>\n<p>\nSi rezultat, kjo duket k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nK\u00ebtu ka shum\u00eb gj\u00ebra. N\u00eb OpenResty jan\u00eb mbledhur shum\u00eb module, si ato t\u00eb lua-s ashtu edhe ato t\u00eb engine-s. Dhe ju keni gjith\u00e7ka gati - e keni deploy-ed dhe funksionon.<\/p>\n<h1>Shembuj<\/h1>\n<p>\nMjaft me lirikat, kalojm\u00eb te kodi. Ja nj\u00eb Hello World t\u00eb vog\u00ebl:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c7far\u00eb ka k\u00ebtu? ky \u00ebsht\u00eb nj\u00eb location i engine-s. Ne nuk shqet\u00ebsohemi, nuk shkruajm\u00eb routing ton\u00eb, nuk marrim ndonj\u00eb q\u00eb ekziston - kemi tashm\u00eb n\u00eb NGINX, jetojm\u00eb mir\u00eb dhe lenv\u00eb.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 \u00ebsht\u00eb nj\u00eb bllok, q\u00eb thot\u00eb se ne po japim p\u00ebrmbajtje me ndihm\u00ebn e nj\u00eb skripti Lua. Marrim nj\u00eb variab\u00ebl t\u00eb engine-s <code>remote_addr<\/code> dhe e fusim at\u00eb n\u00eb <code>string.format<\/code>. Kjo \u00ebsht\u00eb e nj\u00ebjta gj\u00eb si <code>sprintf<\/code>, vet\u00ebm n\u00eb Lua, vet\u00ebm n\u00eb m\u00ebnyr\u00eb t\u00eb duhur. Dhe ia japim klientit.<\/p>\n<p>Si rezultat, do t\u00eb duket k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPor le t\u00eb kthehemi n\u00eb bot\u00ebn reale. N\u00eb prodhim askush nuk deploy-on Hello World. Aplikacioni yn\u00eb zakonisht shkon n\u00eb baz\u00eb ose diku tjet\u00ebr dhe shumic\u00ebn e koh\u00ebs pret nj\u00eb p\u00ebrgjigje.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThjesht ulur dhe pret. Kjo nuk \u00ebsht\u00eb shum\u00eb mir\u00eb. Kur vijn\u00eb 100.000 p\u00ebrdorues, na vjen shum\u00eb e v\u00ebshtir\u00eb. Prandaj le t\u00eb marrim si shembull nj\u00eb aplikacion t\u00eb thjesht\u00eb. Do t\u00eb k\u00ebrkojm\u00eb imazhe, p\u00ebr shembull, t\u00eb maceve. Por ne nuk do t\u00eb k\u00ebrkojm\u00eb thjesht k\u00ebshtu, ne do t\u00eb zgjeronim fjal\u00ebt ky\u00e7e dhe, n\u00ebse p\u00ebrdoruesi k\u00ebrkoi \"kacurrel\", ne do t'i gjejm\u00eb mace, t\u00eb buta dhe gj\u00ebra t\u00eb tjera. S\u00eb pari na nevojitet t\u00eb marrim t\u00eb dh\u00ebnat e k\u00ebrkes\u00ebs n\u00eb backend. Kjo duket k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDy dy nota ju ofrojn\u00eb mund\u00ebsin\u00eb t\u00eb merrni parametrat GET, pa asnj\u00eb v\u00ebshtir\u00ebsi. Pastaj, le t\u00eb themi, nga nj\u00eb baz\u00eb t\u00eb dh\u00ebnash me nj\u00eb tabel\u00eb p\u00ebr fjal\u00ebn ky\u00e7 dhe zgjerimin, marrim k\u00ebt\u00eb informacion me nj\u00eb k\u00ebrkes\u00eb SQL t\u00eb zakonshme. \u00cbsht\u00eb e thjesht\u00eb. K\u00ebshtu duket:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKonektimi me bibliotek\u00ebn <code>resty.mysql<\/code>, e cila \u00ebsht\u00eb tashm\u00eb n\u00eb paket\u00eb. Nuk na nevojitet asgj\u00eb p\u00ebr t\u00eb instaluar, gjith\u00e7ka \u00ebsht\u00eb gati. Sh\u00ebnojm\u00eb si t\u00eb lidhemi dhe b\u00ebjm\u00eb k\u00ebrkes\u00ebn SQL:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nK\u00ebtu \u00ebsht\u00eb disi e frikshme, por gjith\u00e7ka funksionon. K\u00ebtu 10 \u00ebsht\u00eb kufiri. Ne nxjerrim 10 sh\u00ebnime, jemi t\u00eb lenat\u00eb, nuk duam t\u00eb tregojm\u00eb m\u00eb shum\u00eb. N\u00eb SQL e harrova kufirin.<\/p>\n<p>M\u00eb pas, ne gjejm\u00eb imazhe p\u00ebr t\u00eb gjitha k\u00ebrkesat. Mblidhemi nj\u00eb grup k\u00ebrkesash dhe mbushim nj\u00eb tabel\u00eb Lua, e cila quhet <code>reqs<\/code>, dhe b\u00ebjm\u00eb <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00eb gjith\u00eb k\u00ebta k\u00ebrkesa shkojn\u00eb n\u00eb paralele dhe na kthehen p\u00ebrgjigjet. Koha e ekzekutimit \u00ebsht\u00eb e barabart\u00eb me koh\u00ebn e p\u00ebrgjigjes m\u00eb t\u00eb ngadalshme. N\u00ebse t\u00eb gjith\u00eb p\u00ebrfundojn\u00eb brenda 50 milisekondash, dhe ne kemi d\u00ebrguar nj\u00ebqind k\u00ebrkesa, p\u00ebrgjigja jon\u00eb do t\u00eb vij\u00eb brenda 50 milisekondash.<\/p>\n<p>Pas si jemi t\u00eb lenat\u00eb dhe nuk duam t\u00eb shkruajm\u00eb p\u00ebrpunimin HTTP dhe caching, ne do ta detyrojm\u00eb NGINX t\u00eb b\u00ebj\u00eb gjith\u00e7ka p\u00ebr ne. Ashtu si\u00e7 e keni par\u00eb, kishte nj\u00eb k\u00ebrkes\u00eb p\u00ebr <code>url\/fetch<\/code>, ja ai:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNe b\u00ebjm\u00eb nj\u00eb t\u00eb thjesht\u00eb, sh\u00ebnojm\u00eb se ku t\u00eb ruajm\u00eb n\u00eb cache, si ta b\u00ebjm\u00eb k\u00ebt\u00eb, dhe gjith\u00e7ka funksionon. <code>proxy_pass<\/code>Por kjo nuk \u00ebsht\u00eb e mjaftueshme, ne gjithashtu duhet t'i japim t\u00eb dh\u00ebnat p\u00ebrdoruesit. Ideja m\u00eb e thjesht\u00eb \u00ebsht\u00eb ta serizojm\u00eb gjith\u00e7ka n\u00eb JSON, leht\u00eb, n\u00eb dy nota. Jepni Content-Type, jepni JSON.<\/p>\n<p>Por ka nj\u00eb veshtir\u00ebsi: p\u00ebrdoruesi nuk d\u00ebshiron t\u00eb lexoj\u00eb JSON. Duhet t\u00eb angazhojm\u00eb front-end developer\u00ebt. Ndonj\u00ebher\u00eb, fillimisht, nuk duam ta b\u00ebjm\u00eb k\u00ebt\u00eb. Edhe SEO specialist\u00ebt do t\u00eb thon\u00eb se, n\u00ebse po k\u00ebrkojm\u00eb imazhe, ata nuk kan\u00eb r\u00ebnd\u00ebsi. Por n\u00ebse po u japim ndonj\u00eb p\u00ebrmbajtje, at\u00ebher\u00eb ata do t\u00eb thon\u00eb se motor\u00ebt tan\u00eb t\u00eb k\u00ebrkimit nuk indeksojn\u00eb asgj\u00eb.<\/p>\n<p>\u00c7far\u00eb t\u00eb b\u00ebjm\u00eb me k\u00ebt\u00eb? Sigurisht, ne do t'i japim p\u00ebrdoruesit HTML. T\u00eb krijosh me dor\u00eb - nuk \u00ebsht\u00eb e kualifikuar, prandaj duam t\u00eb p\u00ebrdorim shabllone. P\u00ebr k\u00ebt\u00eb ka bibliotek\u00ebn<\/p>\n<p>lua-resty-template <code>Ndoshta e keni par\u00eb tre shkronjat e frikshme OPM. OpenResty vjen me menaxherin e tij t\u00eb paketave, p\u00ebrmes t\u00eb cilit mund t\u00eb instaloni nj\u00eb s\u00ebr\u00eb moduli t\u00eb ndrysh\u00ebm, n\u00eb ve\u00e7anti,<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n. Ky \u00ebsht\u00eb nj\u00eb motor i thjesht\u00eb shablloni, i af\u00ebrt me shabllonat Django. Atje mund t\u00eb shkruani kod dhe t\u00eb b\u00ebni z\u00ebvend\u00ebsimin e variablave. <code>Ndoshta e keni par\u00eb tre shkronjat e frikshme OPM. OpenResty vjen me menaxherin e tij t\u00eb paketave, p\u00ebrmes t\u00eb cilit mund t\u00eb instaloni nj\u00eb s\u00ebr\u00eb moduli t\u00eb ndrysh\u00ebm, n\u00eb ve\u00e7anti,<\/code>Si rezultat, gjith\u00e7ka do t\u00eb duket p\u00ebraf\u00ebrsisht k\u00ebshtu:<\/p>\n<p>Si rezultat, gjith\u00e7ka do t\u00eb duket p\u00ebrreth k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNe mor\u00ebm t\u00eb dh\u00ebnat dhe e k\u00ebrkuam s\u00ebrish shabllonin n\u00eb dy rreshta. P\u00ebrdoruesi \u00ebsht\u00eb i lumtur, ka marr\u00eb mace. Sepse ne e zgjat\u00ebm k\u00ebrkes\u00ebn, ai p\u00ebr macet e vegj\u00ebl mori edhe nj\u00eb fok\u00eb. Kush e di, ndoshta ai e k\u00ebrkonte pik\u00ebrisht at\u00eb, por nuk mund ta formuloj\u00eb si\u00e7 duhet k\u00ebrkes\u00ebn e tij.<\/p>\n<p>Gjith\u00e7ka \u00ebsht\u00eb super, por jemi n\u00eb zhvillim, dhe nuk duam akoma t'ua tregojm\u00eb p\u00ebrdoruesve. Le t\u00eb b\u00ebjm\u00eb autorizimin. P\u00ebr ta b\u00ebr\u00eb k\u00ebt\u00eb, le t\u00eb shohim si NGINX e trajton k\u00ebrkes\u00ebn n\u00eb terma t\u00eb OpenResty:<\/p>\n<ul>\n<li>Faza e par\u00eb\u00a0\u2014 <strong>access<\/strong>, kur p\u00ebrdoruesi sapo ka ardhur, dhe ne e shikojm\u00eb at\u00eb sipas titujve, IP adres\u00ebs, dhe t\u00eb dh\u00ebnave t\u00eb tjera. Mund ta nd\u00ebrpresim menj\u00ebher\u00eb n\u00ebse nuk na p\u00eblqen. Kjo mund t\u00eb p\u00ebrdoret p\u00ebr autorizimin, ose n\u00ebse na vijn\u00eb shum\u00eb k\u00ebrkesa, mund t'i ndalojm\u00eb leht\u00ebsisht n\u00eb k\u00ebt\u00eb faz\u00eb.<\/li>\n<li><strong>rewrite<\/strong>. Rishkruajm\u00eb disa t\u00eb dh\u00ebna t\u00eb k\u00ebrkes\u00ebs.<\/li>\n<li><strong>me mb\u00ebshtetje<\/strong>. I japim p\u00ebrmbajtjen p\u00ebrdoruesit.<\/li>\n<li><strong>headers filter<\/strong>. Nd\u00ebrrimi i titujve t\u00eb p\u00ebrgjigjes. N\u00ebse kemi p\u00ebrdorur <code>proxy_pass<\/code>, mund t\u00eb rishkruajm\u00eb disa tituj para se t'ia dor\u00ebzojm\u00eb p\u00ebrdoruesit.<\/li>\n<li><strong>body filter<\/strong>. Mund t\u00eb nd\u00ebrroni trupin.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 regjistrimi. Mund t\u00eb shkruani log\u00ebt n\u00eb Elasticsearch pa nj\u00eb nivel shtes\u00eb.<\/li>\n<\/ul>\n<p>\nAutorizimi yn\u00eb do t\u00eb duket p\u00ebraf\u00ebrsisht k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNe do ta shtojm\u00eb k\u00ebt\u00eb n\u00eb at\u00eb <code>location<\/code>, q\u00eb e kemi p\u00ebrshkruar m\u00eb par\u00eb, dhe do ta vendosim nj\u00eb kod t\u00eb till\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nShikojm\u00eb n\u00ebse kemi cookie token. N\u00ebse jo, at\u00ebher\u00eb e \u00e7ojm\u00eb n\u00eb autorizim. P\u00ebrdoruesit jan\u00eb t\u00eb zgjuar dhe mund ta kuptojn\u00eb se duhet t\u00eb vendosin cookie token. Prandaj ne do ta vendosim at\u00eb edhe n\u00eb Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKodi p\u00ebr pun\u00ebn me Redis \u00ebsht\u00eb shum\u00eb i thjesht\u00eb dhe nuk ndryshon nga gjuh\u00ebt e tjera. N\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb, gjith\u00eb hyrja\/dalja, aty dhe k\u00ebtu, \u00ebsht\u00eb jo bllokuese. N\u00ebse shkruani kod t\u00eb sinkronizuar, at\u00ebher\u00eb punon asinkronisht. P\u00ebrshtatsh\u00ebm si me gevent, vet\u00ebm se \u00ebsht\u00eb b\u00ebr\u00eb mir\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe ta b\u00ebjm\u00eb vet\u00eb autorizimin:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nThem se na nevojitet t\u00eb lexojm\u00eb trupin e k\u00ebrkes\u00ebs. Marrim argumentet POST, kontrollojm\u00eb q\u00eb emri i p\u00ebrdoruesit dhe fjal\u00ebkalimi jan\u00eb t\u00eb sakt\u00eb. N\u00ebse jan\u00eb t\u00eb pasakta, at\u00ebher\u00eb e \u00e7ojm\u00eb n\u00eb autorizim. Por n\u00ebse jan\u00eb t\u00eb sakta, sh\u00ebnojm\u00eb token n\u00eb Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMos harro t\u00eb vendos\u00ebsh cookie, kjo gjithashtu b\u00ebhet n\u00eb dy rreshta:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: kthemi NGINX n\u00eb nj\u00eb server t\u00eb plot\u00eb aplikacionesh\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nShembulli \u00ebsht\u00eb i thjesht\u00eb, teorik. Sigurisht q\u00eb nuk do t\u00eb krijojm\u00eb nj\u00eb sh\u00ebrbim q\u00eb tregon njer\u00ebzve mace. Megjithat\u00eb, kush na njeh. Prandaj, le t\u00eb kalojm\u00eb n\u00eb at\u00eb q\u00eb mund t\u00eb b\u00ebhet n\u00eb prodhim.<\/p>\n<ul>\n<li><strong>Backend minimalist<\/strong>. Ndonj\u00ebher\u00eb na nevojitet t\u00eb ofrojm\u00eb disa t\u00eb dh\u00ebna n\u00eb backend: ndonj\u00ebher\u00eb duhet t\u00eb vendosim nj\u00eb dat\u00eb, ndonj\u00ebher\u00eb t\u00eb shfaqim ndonj\u00eb list\u00eb, t\u00eb tregojm\u00eb se sa p\u00ebrdorues aktualisht jan\u00eb n\u00eb faqen e internetit, t\u00eb lidhemi me ndonj\u00eb num\u00ebrues apo statistik\u00eb. Di\u00e7ka e till\u00eb. K\u00ebto cop\u00ebza minimale mund t\u00eb realizohen shum\u00eb leht\u00ebsisht. K\u00ebshtu do t\u00eb dal\u00eb shpejt, leht\u00ebsisht dhe bukur.\n<\/li>\n<li><strong>Parap\u00ebrpunimi i t\u00eb dh\u00ebnave<\/strong>. Ndonj\u00ebher\u00eb na do t\u00eb integrojm\u00eb reklam\u00eb n\u00eb faqen ton\u00eb, dhe k\u00ebt\u00eb reklam\u00eb e marrim p\u00ebrmes API requests. Kjo \u00ebsht\u00eb shum\u00eb e leht\u00eb p\u00ebr tu realizuar pik\u00ebrisht k\u00ebtu. Ne nuk e ngarkojm\u00eb backend-in ton\u00eb, i cili dhe ashtu \u00ebsht\u00eb i ngarkuar shum\u00eb. Mund t\u00eb marrim dhe t\u00eb mbledhim k\u00ebtu. Ne mund t\u00eb krijojm\u00eb disa JS ose, p\u00ebrkundrazi, t'i ndajm\u00eb, di\u00e7ka p\u00ebr t'u parap\u00ebrpunuar p\u00ebrpara se t'ia japim p\u00ebrdoruesit.\n<\/li>\n<li><strong>Facade p\u00ebr mikrosh\u00ebrbisin<\/strong>. Ky \u00ebsht\u00eb gjithashtu nj\u00eb rast shum\u00eb i mir\u00eb, q\u00eb e kam realizuar. Para k\u00ebsaj kam punuar n\u00eb kompanin\u00eb Tenzor, e cila merret me raportimin elektronik, duke siguruar raportimin p\u00ebr rreth gjysm\u00ebn e personave juridik\u00eb n\u00eb vend. Ne krijuam nj\u00eb sh\u00ebrbim, aty me k\u00ebt\u00eb mekaniz\u00ebm jan\u00eb realizuar shum\u00eb gj\u00ebra: routimi, autorizimi dhe t\u00eb tjera.<br \/>\nOpenResty mund t\u00eb p\u00ebrdoret si shakulli p\u00ebr mikrosh\u00ebrbimet tuaja, q\u00eb do t\u00eb siguroj\u00eb nj\u00eb qasje t\u00eb nj\u00ebjt\u00eb p\u00ebr t\u00eb gjitha dhe nj\u00eb nd\u00ebrfaqe t\u00eb nj\u00ebjt\u00eb. Duke qen\u00eb se mikrosh\u00ebrbimet mund t\u00eb shkruhen n\u00eb m\u00ebnyr\u00eb q\u00eb k\u00ebtu keni Node.js, k\u00ebtu keni PHP, k\u00ebtu Python, dhe aty \u00ebsht\u00eb ndonj\u00eb gj\u00eb n\u00eb Erlang, ne e kuptojm\u00eb se nuk duam ta rikorrektojm\u00eb t\u00eb nj\u00ebjtin kod n\u00eb t\u00eb gjith\u00eb vendin. Prandaj OpenResty mund t\u00eb vendoset n\u00eb front.<\/p>\n<\/li>\n<li><strong>Statistika dhe analiza<\/strong>. Zakonisht NGINX \u00ebsht\u00eb n\u00eb hyrje dhe t\u00eb gjitha k\u00ebrkesat kalojn\u00eb p\u00ebrmes tij. Pik\u00ebrisht n\u00eb k\u00ebt\u00eb vend \u00ebsht\u00eb shum\u00eb e p\u00ebrshtatshme t\u00eb mbledhim. Mund t\u00eb b\u00ebjm\u00eb ndonj\u00eb llogaritje menj\u00ebher\u00eb dhe ta d\u00ebrgojm\u00eb diku, p\u00ebr shembull n\u00eb Elasticsearch, Logstash, ose thjesht ta regjistrojm\u00eb n\u00eb log dhe pastaj ta d\u00ebrgojm\u00eb diku.\n<\/li>\n<li><strong>Sistemet me p\u00ebrdorues t\u00eb shumt\u00eb<\/strong>. P\u00ebr shembull, lojrat online jan\u00eb gjithashtu shum\u00eb t\u00eb lehta p\u00ebr tu realizuar. Sot n\u00eb Cape Town, Aleksand\u00ebr Gladys do t\u00eb tregoj\u00eb se si t\u00eb prototipojm\u00eb shpejt nj\u00eb loj\u00eb multiplayer p\u00ebrmes OpenResty.\n<\/li>\n<li><strong>Filtrimi i k\u00ebrkesave (WAF)<\/strong>. Sot \u00ebsht\u00eb b\u00ebr\u00eb moden t\u00eb krijosh firewalls p\u00ebr aplikacionet web, ka shum\u00eb sh\u00ebrbime q\u00eb i ofrojn\u00eb ato. Me ndihm\u00ebn e OpenResty, mund t\u00eb krijosh nj\u00eb firewall p\u00ebr aplikacionet web, i cili do t\u00eb filtroj\u00eb k\u00ebrkesat sipas k\u00ebrkesave tuaja n\u00eb m\u00ebnyr\u00eb t\u00eb thjesht\u00eb dhe t\u00eb leht\u00eb. N\u00ebse ke Python, e kupton se PHP sigurisht nuk do t\u00eb injektohet, n\u00ebse, sigurisht, nuk e nxjerr nga konsola diku. E di q\u00eb ke MySQL dhe Python. Ndoshta, k\u00ebtu mund t\u00eb provojn\u00eb t\u00eb b\u00ebjn\u00eb ndonj\u00eb kalim direkt t\u00eb direktorive dhe t\u00eb injektojn\u00eb di\u00e7ka n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave. Prandaj, \u00ebsht\u00eb e mundur t\u00eb filtrohen k\u00ebrkesat e dyshimta shpejt dhe me kosto t\u00eb ul\u00ebt menj\u00ebher\u00eb n\u00eb front.\n<\/li>\n<li><strong>Bashk\u00ebsia.<\/strong> Duke qen\u00eb se OpenResty \u00ebsht\u00eb nd\u00ebrtuar mbi baz\u00ebn e NGINX, ai ka nj\u00eb avantazh - kjo \u00ebsht\u00eb <strong>komuniteti NGINX<\/strong>. Ai \u00ebsht\u00eb shum\u00eb i madh, dhe nj\u00eb pjes\u00eb e konsiderueshme e pyetjeve q\u00eb do t\u00eb kesh n\u00eb fillim, tashm\u00eb jan\u00eb zgjidhur nga komuniteti NGINX.\n<p><strong>Zhvilluesit e Lua<\/strong>. Dje bisedova me djemt\u00eb q\u00eb erdh\u00ebn p\u00ebr dit\u00ebn e m\u00ebsimeve HighLoad++ dhe d\u00ebgjova se Tarantool \u00ebsht\u00eb e vetmja q\u00eb \u00ebsht\u00eb shkruar n\u00eb Lua. Kjo nuk \u00ebsht\u00eb e v\u00ebrtet\u00eb, n\u00eb Lua jan\u00eb shkruar shum\u00eb gj\u00ebra. Shembuj: OpenResty, serveri XMPP Prosody, motorin e loj\u00ebrave Love2D, Lua script-izohet n\u00eb Warcraft dhe n\u00eb vende t\u00eb tjera. Ka shum\u00eb zhvillues t\u00eb Lua, ata kan\u00eb nj\u00eb komunitet t\u00eb madh dhe t\u00eb p\u00ebrgjegjsh\u00ebm. T\u00eb gjitha pyetjeve t\u00eb mia p\u00ebr Lua u p\u00ebrgjigj\u00ebn brenda disa or\u00ebsh. Kur shkruan n\u00eb list\u00ebn e shp\u00ebrndarjes, praktikisht pas disa minutash tashm\u00eb ka nj\u00eb mori p\u00ebrgjigjesh, shpjegojn\u00eb \u00e7far\u00eb dhe si, \u00e7far\u00eb \u00ebsht\u00eb \u00e7far\u00eb. Kjo \u00ebsht\u00eb shum\u00eb e shk\u00eblqyer. Fatkeq\u00ebsisht, nuk \u00ebsht\u00eb gjithmon\u00eb nj\u00eb komunitet kaq t\u00eb mir\u00ebprit\u00ebs.<br \/>\nP\u00ebr OpenResty ka GitHub, atje mund t\u00eb hap\u00ebsh nj\u00eb \u00e7\u00ebshtje n\u00ebse di\u00e7ka ka d\u00ebshtuar. Ka nj\u00eb list\u00eb shp\u00ebrndarjeje n\u00eb Google Groups, ku mund t\u00eb diskutosh pyetje t\u00eb p\u00ebrgjithshme, ka nj\u00eb shp\u00ebrndarje n\u00eb kinezisht - ndoshta, ndoshta nuk ke njohuri t\u00eb mjaftueshme n\u00eb anglisht, por di dhe kinezisht.<\/li>\n<\/ul>\n<p><\/p>\n<h1>P\u00ebrfundime<\/h1>\n<p><\/p>\n<ul>\n<li>Shpresoj se kam arritur t\u00eb shpjegoj se OpenResty \u00ebsht\u00eb nj\u00eb framework shum\u00eb i p\u00ebrshtatsh\u00ebm, i fokusuar n\u00eb web.<\/li>\n<li>Ai ka nj\u00eb nivel t\u00eb ul\u00ebt t\u00eb hyrjes, pasi kodi \u00ebsht\u00eb i ngjash\u00ebm me at\u00eb n\u00eb t\u00eb cil\u00ebn shkruajm\u00eb, gjuha \u00ebsht\u00eb mjaft e thjesht\u00eb dhe minimalistike.<\/li>\n<li>Ai ofron I\/O asinkron pa callbacks, nuk do t\u00eb kemi ngat\u00ebrrim, si\u00e7 mund ta shkruajm\u00eb ndonj\u00ebher\u00eb n\u00eb NodeJS.<\/li>\n<li>Ai ka nj\u00eb deploy t\u00eb leht\u00eb, pasi na nevojitet vet\u00ebm NGINX me modulin e nevojsh\u00ebm dhe kodi yn\u00eb, dhe gjith\u00e7ka funksionon menj\u00ebher\u00eb.<\/li>\n<li>Nj\u00eb komunitet i madh dhe i p\u00ebrgjegjsh\u00ebm.<\/li>\n<\/ul>\n<p>\nNuk i kam folur n\u00eb detaje se si b\u00ebhet rrug\u00ebzgjidhja, rezultoi se ishte nj\u00eb histori shum\u00eb e gjat\u00eb.<\/p>\n<p>Faleminderit p\u00ebr v\u00ebmendjen!<\/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=\"Luaj videon\" 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: e kthejm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb<\/a><\/noindex><\/em><br \/>\n<br \/>Burimi: <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.2 - 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\/sq\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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: shnd\u00ebrrojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb | ProHoster","description":"Ne po publikojm\u00eb s\u00ebrish transkriptimin.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}