{"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: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Po publikojm\u00eb p\u00ebrs\u00ebri p\u00ebrmbledhjen e raportit nga konferenca <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, q\u00eb u mbajt n\u00eb Skolkovo, rajoni i Mosk\u00ebs m\u00eb 7\u20148 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 me OpenResty dhe Lua.<\/em><\/p>\n<p>P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve, emri im \u00ebsht\u00eb Vladimir Protasov, punoj n\u00eb Parallels. Do t\u00eb flas pak p\u00ebr veten. Tre t\u00eb kat\u00ebrtat e jet\u00ebs time kam kaluar duke shkruar kod. Jam b\u00ebr\u00eb programues n\u00eb kuptimin e plot\u00eb t\u00eb fjal\u00ebs: ndonj\u00ebher\u00eb shoh kod n\u00eb \u00ebndrrat e mia. Nj\u00eb kat\u00ebrta e jet\u00ebs \u00ebsht\u00eb zhvillim industrial, shkruaj kod q\u00eb shkon drejtp\u00ebrdrejt n\u00eb prodhim. Kodu q\u00eb disa prej jush e p\u00ebrdorin, por nuk e dijn\u00eb k\u00ebt\u00eb.<\/p>\n<p>Q\u00eb t\u00eb kuptoni sa keq ishte gjith\u00e7ka. Kur isha nj\u00eb junior i vog\u00ebl, erdha, dhe m\u00eb dhan\u00eb baza dy terabajt. Tani t\u00eb gjith\u00eb k\u00ebtu jan\u00eb highload. Shkova n\u00eb konferenca dhe pyeta: \"Djem, tregoni, a keni big data, \u00ebsht\u00eb super? Sa ka aty databaza juaj?\" M\u00eb p\u00ebrgjigj\u00ebn: \"Ne kemi 100 gigabajt!\" Un\u00eb thash\u00eb: \"Super, 100 gigabajt!\" Nd\u00ebrsa brenda meje mendoja si t\u00eb ruaja nj\u00eb pokerface. Mendon, po, djemt\u00eb jan\u00eb t\u00eb shk\u00eblqyer, dhe pastaj kthehesh dhe shkruan me k\u00ebto baza me shum\u00eb terabajt. Dhe kjo \u00ebsht\u00eb kur isha junior. Mendoni p\u00ebr at\u00eb goditje!<\/p>\n<p>Un\u00eb njoh mbi 20 gjuh\u00eb programimi. Kjo \u00ebsht\u00eb ajo q\u00eb duhej t\u00eb kuptoja gjat\u00eb pun\u00ebs. T\u00eb japin kod n\u00eb Erlang, n\u00eb C, n\u00eb C++, n\u00eb Lua, n\u00eb Python, n\u00eb Ruby, n\u00eb di\u00e7ka tjet\u00ebr, dhe duhet ta kodosh gjith\u00e7ka. N\u00eb p\u00ebrgjith\u00ebsi, duhej ta b\u00ebnte. Sasia e sakt\u00eb nuk arrita ta llogaris, por ndoshta numri humbi rreth 20.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDuke q\u00eb t\u00eb gjith\u00eb t\u00eb pranishmit din\u00eb se \u00e7far\u00eb \u00ebsht\u00eb Parallels dhe \u00e7far\u00eb b\u00ebjm\u00eb ne, nuk do t\u00eb flas p\u00ebr sa t\u00eb shk\u00eblqyer jemi dhe \u00e7far\u00eb b\u00ebjm\u00eb. Do t\u00eb p\u00ebrmend vet\u00ebm se kemi 13 zyra n\u00eb bot\u00eb, mbi 300 punonj\u00ebs, zhvillim n\u00eb Mosk\u00eb, Talin dhe Mal t\u00eb Zi. N\u00ebse d\u00ebshiron, mund t\u00eb marr\u00ebsh dhe t\u00eb transferohesh n\u00eb Malt\u00eb n\u00ebse dimri \u00ebsht\u00eb i ftoht\u00eb dhe duhet t\u00eb ngrohim shpin\u00ebn.<\/p>\n<p>Sakt\u00ebsisht departamenti yn\u00eb shkruan n\u00eb Python 2. Ne merremi me biznes dhe nuk kemi koh\u00eb t\u00eb aplikojm\u00eb teknologji t\u00eb reja, prandaj vuajm\u00eb. Ne p\u00ebrdorim Django, sepse ka gjith\u00e7ka q\u00eb na nevojitet, dhe heqim at\u00eb q\u00eb \u00ebsht\u00eb e tep\u00ebrt. Po ashtu, MySQL, Redis dhe NGINX. Kemi shum\u00eb gj\u00ebra t\u00eb tjera interesante. Kemi MongoDB, kemi lepuj q\u00eb vrapojn\u00eb, kemi gjith\u00e7ka - por kjo nuk \u00ebsht\u00eb p\u00ebr mua dhe nuk merrem me t\u00eb.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nFlas p\u00ebr veten. Le t\u00eb shohim p\u00ebr \u00e7far\u00eb do t\u00eb flas sot:<\/p>\n<ul>\n<li>\u00c7far\u00eb \u00ebsht\u00eb OpenResty dhe si p\u00ebrdoret?<\/li>\n<li>Pse t\u00eb shpikim nj\u00eb tjet\u00ebr bi\u00e7iklet\u00eb kur kemi Python, NodeJS, PHP, Go dhe teknologji 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 disa shembuj nga jeta. M\u00eb \u00ebsht\u00eb dashur t\u00eb shkurtoj ndjesh\u00ebm prezantimin, sepse po dilte 3.5 or\u00eb, prandaj shembujt do t\u00eb jen\u00eb t\u00eb pak\u00ebt.<\/li>\n<\/ul>\n<p>\nOpenResty \u00ebsht\u00eb NGINX. Fal\u00eb tij, ne kemi nj\u00eb server t\u00eb plot\u00eb web, i shkruar mir\u00eb dhe q\u00eb funksionon shpejt. Mendoj se shumica prej nesh p\u00ebrdorin NGINX n\u00eb prodhim. T\u00eb gjith\u00eb e dini se \u00ebsht\u00eb i shpejt\u00eb dhe i mrekulluesh\u00ebm. Ka nj\u00eb hyrje\/dalje sinkrone t\u00eb shk\u00eblqyer, prandaj nuk na nevojitet t\u00eb shpikim di\u00e7ka si\u00e7 b\u00ebjm\u00eb me gevent n\u00eb Python. Gevent \u00ebsht\u00eb i shk\u00eblqyer, por n\u00ebse shkruani kod n\u00eb C dhe di\u00e7ka shkon keq, at\u00ebher\u00eb do t\u00eb \u00e7mendeni duke e debugg-uar me gevent. Kam pasur p\u00ebrvoj\u00eb: m\u00eb nevojiteshin dy dit\u00eb p\u00ebr t\u00eb kuptuar se \u00e7far\u00eb kishte shkuar keq. Sikur dikush t\u00eb mos kishte hulumtuar p\u00ebr disa jav\u00eb, t\u00eb mos kishte gjetur problemin, t\u00eb mos kishte shkruar n\u00eb internet dhe Google t\u00eb mos kishte gjetur k\u00ebt\u00eb, do t\u00eb ishim \u00e7uar krejt n\u00eb \u00e7menduri.<\/p>\n<p>Nginx tashme ka caching dhe p\u00ebrmbajtje statike. Nuk keni nevoj\u00eb t\u00eb shqet\u00ebsoheni se si ta b\u00ebni si\u00e7 duhet, q\u00eb askund t\u00eb mos keni pengesa dhe t\u00eb mos humbni ndonj\u00eb descriptor. Deployimi i Nginx \u00ebsht\u00eb shum\u00eb i leht\u00eb, nuk keni nevoj\u00eb t\u00eb mendoni \u00e7far\u00eb t\u00eb merrni \u2014 WSGI, PHP-FPM, Gunicorn, Unicorn. E keni vendosur Nginx, ia keni dh\u00ebn\u00eb administrator\u00ebve, ata din\u00eb si ta p\u00ebrdorin k\u00ebt\u00eb. Nginx e p\u00ebrpunon k\u00ebrkesat n\u00eb nj\u00eb m\u00ebnyr\u00eb t\u00eb strukturuar. Do flas pak m\u00eb von\u00eb p\u00ebr k\u00ebt\u00eb. N\u00eb p\u00ebrmbledhje, ai ka nj\u00eb faz\u00eb, kur pranon k\u00ebrkes\u00ebn, kur e p\u00ebrpunon dhe kur i jep p\u00ebrmbajtjen p\u00ebrdoruesit.<\/p>\n<p>Nginx \u00ebsht\u00eb i shk\u00eblqyer, por ka nj\u00eb problem: nuk \u00ebsht\u00eb mjaft fleksib\u00ebl, edhe me t\u00eb gjitha ato karakteristika t\u00eb mira q\u00eb ata e shtuan n\u00eb konfigurim, duke marr\u00eb parasysh q\u00eb gjith\u00e7ka mund t\u00eb konfigurohet. K\u00ebto kapacitete jan\u00eb t\u00eb pamjaftueshme. Prandaj, ekipi i Taobao, ndoshta para tet\u00eb vitesh, integroi Lua. \u00c7far\u00eb ofron ky?<\/p>\n<ul>\n<li><strong>Madh\u00ebsia<\/strong>. Ai \u00ebsht\u00eb i vog\u00ebl. LuaJIT i jep rreth 100-200 kilobajt mbetje n\u00eb kujtes\u00eb dhe nj\u00eb mbetje minimale n\u00eb performanc\u00eb.<\/li>\n<li><strong>Shpejt\u00ebsia<\/strong>. Nd\u00ebrprer\u00ebsi LuaJIT, n\u00eb shum\u00eb situata, \u00ebsht\u00eb af\u00ebr performanc\u00ebs s\u00eb C, n\u00eb disa raste humbet ndaj Java dhe n\u00eb disa e tejkalon at\u00eb. Nj\u00eb koh\u00eb t\u00eb gjat\u00eb \u00ebsht\u00eb konsideruar si state of the art, kompajleri JIT m\u00eb i avancuar. Tani ka m\u00eb t\u00eb avancuar, por jan\u00eb shum\u00eb t\u00eb r\u00ebnd\u00eb, si p\u00ebr shembull V8. Disa interpretuese JavaScript dhe HotSpot i Java-s jan\u00eb m\u00eb t\u00eb shpejt\u00eb n\u00eb disa pika, por ende humbasin n\u00eb disa t\u00eb tjera.<\/li>\n<li><strong>Thjesht\u00ebsia n\u00eb m\u00ebsim<\/strong>. N\u00ebse keni, p\u00ebr shembull, 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 u mor\u00ebn, dhe t\u00eb m\u00ebsosh \u00ebsht\u00eb e gjat\u00eb e e komplikuar. N\u00ebse doni programues p\u00ebr di\u00e7ka tjet\u00ebr, ndoshta do t'ju duhet t'i riedukoni, ose t'i gjeni. N\u00eb rastin e Lua-s, gjith\u00e7ka \u00ebsht\u00eb e thjesht\u00eb. Lua m\u00ebsohet nga \u00e7do junior p\u00ebr tri dit\u00eb. M\u00eb nevojiteshin rreth dy or\u00eb p\u00ebr t\u00eb kuptuar. Pas dy or\u00ebsh, isha duke shkruar kod p\u00ebr prodhim. Diku pas nj\u00eb jav\u00eb, ai doli direkt n\u00eb prodhim.<\/li>\n<\/ul>\n<p>\nSi rezultat, kjo duket k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" 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 t\u00eb Lua-s, ashtu edhe t\u00eb engine-s. Dhe gjith\u00e7ka \u00ebsht\u00eb gati \u2014 e nd\u00ebrron dhe punon.<\/p>\n<h1>Shembuj<\/h1>\n<p>\nMjaft me lirika, kalojm\u00eb te kodi. Ja nj\u00eb Hello World t\u00eb vog\u00ebl:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c7far\u00eb ka k\u00ebtu? Kjo \u00ebsht\u00eb nj\u00eb lokacion i endjinseve. Ne nuk shqet\u00ebsohemi, nuk shkruajm\u00eb rrug\u00ebtimin ton\u00eb, nuk marrim ndonj\u00eb t\u00eb gatsh\u00ebm \u2014 ne tashm\u00eb e kemi n\u00eb NGINX, jetojm\u00eb mir\u00eb dhe me len\u00ebsi.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 \u00ebsht\u00eb nj\u00eb bllok q\u00eb thot\u00eb se ne po dor\u00ebzojm\u00eb p\u00ebrmbajtjen me ndihm\u00ebn e skriptit Lua. Marrim nj\u00eb variab\u00ebl endjinse <code>remote_addr<\/code> dhe e futim 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 e sakt\u00eb. Dhe e dor\u00ebzojm\u00eb klientit.<\/p>\n<p>Si rezultat, kjo do t\u00eb duket k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPor kthehemi n\u00eb bot\u00ebn reale. N\u00eb prodhim, askush nuk e hedh Hello World. Aplikacioni yn\u00eb zakonisht shkon n\u00eb baz\u00eb ose diku tjet\u00ebr dhe nj\u00eb pjes\u00eb t\u00eb madhe t\u00eb koh\u00ebs pret nj\u00eb p\u00ebrgjigje.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThjesht ulur dhe duke pritur. Kjo nuk \u00ebsht\u00eb shum\u00eb mir\u00eb. Kur vijn\u00eb 100,000 p\u00ebrdorues, na vjen shum\u00eb v\u00ebshtir\u00eb. Prandaj le t\u00eb krijojm\u00eb nj\u00eb aplikacion t\u00eb thjesht\u00eb si shembull. 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, do t\u00eb zgjerojm\u00eb fjal\u00ebt ky\u00e7e dhe, n\u00ebse p\u00ebrdoruesi k\u00ebrkon 'macet e vogla', ne do t'i gjejm\u00eb macet, t\u00eb leshta dhe t\u00eb tjera. N\u00eb fillim 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: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nD\u00eb dy rreshta ju lejojn\u00eb t\u00eb marrim parametrat GET pa asnj\u00eb v\u00ebshtir\u00ebsi. M\u00eb pas, supozojm\u00eb se marrim informacionin nga nj\u00eb databaz\u00eb me nj\u00eb tabel\u00eb sipas fjal\u00ebs ky\u00e7e dhe zgjerimit me nj\u00eb SQL query t\u00eb zakonshme. \u00cbsht\u00eb e thjesht\u00eb. Kjo duket k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebndojm\u00eb bibliotek\u00ebn <code>resty.mysql<\/code>, e cila \u00ebsht\u00eb tashm\u00eb n\u00eb paket\u00eb. Nuk na nevojitet asgj\u00eb tjet\u00ebr p\u00ebr tu instaluar, gjith\u00e7ka \u00ebsht\u00eb gati. Tregojm\u00eb si t\u00eb lidhemi dhe b\u00ebjm\u00eb SQL query:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nK\u00ebtu \u00ebsht\u00eb pak e frikshme, por gjith\u00e7ka funksionon. Numri 10 \u00ebsht\u00eb kufiri. Ne nxjerrim 10 t\u00eb dh\u00ebna, jemi t\u00eb lodhur, nuk duam t\u00eb tregojm\u00eb m\u00eb shum\u00eb. Harrova p\u00ebr kufirin n\u00eb SQL.<\/p>\n<p>M\u00eb pas, ne t\u00eb gjejm\u00eb imazhet p\u00ebr t\u00eb gjitha k\u00ebrkesat. Ne grumbullojm\u00eb nj\u00eb grup k\u00ebrkesash dhe plot\u00ebsojm\u00eb 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: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00eb gjitha k\u00ebto k\u00ebrkesa shkojn\u00eb paralelisht, dhe ne marrim p\u00ebrgjigjet. Koha e ekzekutimit \u00ebsht\u00eb e barabart\u00eb me koh\u00ebn e p\u00ebrgjigjes m\u00eb t\u00eb ngadalt\u00eb. N\u00ebse t\u00eb gjitha p\u00ebrfundojn\u00eb p\u00ebr 50 milisekonda, dhe ne d\u00ebrgojm\u00eb nj\u00ebqind k\u00ebrkesa, p\u00ebrgjigja do t\u00eb vij\u00eb p\u00ebr 50 milisekonda.<\/p>\n<p>Pasi jemi t\u00eb lodhur dhe nuk duam t\u00eb shkruajm\u00eb trajtimin e HTTP dhe caching, do ta b\u00ebjm\u00eb NGINX t\u00eb b\u00ebj\u00eb gjith\u00e7ka p\u00ebr ne. Si\u00e7 e keni par\u00eb, ka pasur nj\u00eb k\u00ebrkes\u00eb p\u00ebr <code>url\/fetch<\/code>, kjo \u00ebsht\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nB\u00ebjm\u00eb nj\u00eb thjesht <code>proxy_pass<\/code>, tregojm\u00eb se ku t\u00eb cache-ojm\u00eb, si ta b\u00ebjm\u00eb k\u00ebt\u00eb, dhe gjith\u00e7ka funksionon.<\/p>\n<p>Por kjo nuk \u00ebsht\u00eb e mjaftueshme, na duhet gjithashtu t\u00eb kthejm\u00eb t\u00eb dh\u00ebnat te p\u00ebrdoruesi. Ideja m\u00eb e thjesht\u00eb \u00ebsht\u00eb ta serializojm\u00eb gjith\u00e7ka n\u00eb JSON, leht\u00eb, n\u00eb dy rreshta. Kthejm\u00eb Content-Type, kthejm\u00eb JSON.<\/p>\n<p>Por ka nj\u00eb v\u00ebshtir\u00ebsi: p\u00ebrdoruesi nuk do t\u00eb lexoj\u00eb JSON-in. Duhet t\u00eb angazhojm\u00eb frontend-er\u00ebt. N sometimes kurr\u00eb nuk na p\u00eblqen ta b\u00ebjm\u00eb k\u00ebt\u00eb n\u00eb fillim. Edhe seo specialist\u00ebt do t\u00eb thon\u00eb se n\u00ebse k\u00ebrkojm\u00eb imazhe, at\u00ebher\u00eb ata nuk kan\u00eb r\u00ebnd\u00ebsi. Nd\u00ebrsa n\u00ebse i japim ndonj\u00eb p\u00ebrmbajtje, 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? Natyrisht, ne do t\u2019i d\u00ebrgojm\u00eb p\u00ebrdoruesit HTML. T\u00eb gjenerojm\u00eb manualisht - nuk \u00ebsht\u00eb profesionale, prandaj duam t\u00eb p\u00ebrdorim shabllone. P\u00ebr k\u00ebt\u00eb ka nj\u00eb bibliotek\u00eb <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJu ndoshta keni par\u00eb tre shkronja t\u00eb frikshme OPM. OpenResty vjen me menaxherin e tij t\u00eb paketave, p\u00ebrmes t\u00eb cilit mund t\u00eb instaloni edhe shum\u00eb module t\u00eb tjera, n\u00eb ve\u00e7anti, <code>lua-resty-template<\/code>. Ky \u00ebsht\u00eb nj\u00eb motor i thjesht\u00eb shabllonesh, i ngjash\u00ebm me shabllonet Django. Atje mund t\u00eb shkruani kod dhe t\u00eb b\u00ebni z\u00ebvend\u00ebsimin e variablave.<\/p>\n<p>Si rezultat, gjith\u00e7ka do t\u00eb duket pak a shum\u00eb k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKemi marr\u00eb t\u00eb dh\u00ebnat dhe e kemi renderuar modelin p\u00ebrs\u00ebri n\u00eb dy rreshta. P\u00ebrdoruesi \u00ebsht\u00eb i lumtur, ka marr\u00eb macet. P\u00ebr shkak se ne zgjat\u00ebm k\u00ebrkes\u00ebn, ai p\u00ebr macet e vogla mori edhe nj\u00eb uturak deti. Ndoshta ai po e k\u00ebrkonte at\u00eb, por nuk mund t'i formulonte sakt\u00eb k\u00ebrkesat e tij.<\/p>\n<p>E gjitha \u00ebsht\u00eb e mrekullueshme, por ne jemi n\u00eb zhvillim dhe nuk duam p\u00ebr momentin t'u 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 p\u00ebrpunon k\u00ebrkes\u00ebn n\u00eb kushtet e OpenResty:<\/p>\n<ul>\n<li>Faza e par\u00eb \u2014 <strong>access<\/strong>, kur p\u00ebrdoruesi sapo erdhi, dhe ne e shqyrtuam at\u00eb p\u00ebrmes titujve, adres\u00ebs IP, dhe t\u00eb dh\u00ebnave t\u00eb tjera. Mund ta ndalim menj\u00ebher\u00eb, n\u00ebse nuk na p\u00eblqen. Kjo mund t\u00eb p\u00ebrdoret p\u00ebr autorizim, ose, n\u00ebse na vijn\u00eb shum\u00eb k\u00ebrkesa, ne mund t'i ndalim leht\u00ebsisht n\u00eb k\u00ebt\u00eb faz\u00eb.<\/li>\n<li><strong>rewrite<\/strong>. Rwriting disa t\u00eb dh\u00ebna t\u00eb k\u00ebrkes\u00ebs.<\/li>\n<li><strong>content<\/strong>. I ofrojm\u00eb p\u00ebrmbajtjen p\u00ebrdoruesit.<\/li>\n<li><strong>headers filter<\/strong>. Ndryshojm\u00eb titujt e p\u00ebrgjigjes. N\u00ebse kemi p\u00ebrdorur <code>proxy_pass<\/code>, mund t\u00eb riformulojm\u00eb disa tituj, para se t'i dor\u00ebzojm\u00eb p\u00ebrdoruesit.<\/li>\n<li><strong>body filter<\/strong>. Mund t\u00eb nd\u00ebrlikojm\u00eb trupin.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 regjistrimi. Mund t\u00eb shkruani regjistrat n\u00eb elasticsearch pa nj\u00eb shtes\u00eb t\u00eb ardhshme.<\/li>\n<\/ul>\n<p>\nAutentifikimi yn\u00eb do t\u00eb duket m\u00eb pak si kjo:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDo ta shtojm\u00eb k\u00ebt\u00eb n\u00eb <code>lokacionin<\/code>, q\u00eb p\u00ebrshkruam m\u00eb par\u00eb, dhe do t\u00eb fusim atje nj\u00eb kod t\u00eb till\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPo shikojm\u00eb n\u00ebse kemi cookie token. N\u00ebse jo, at\u00ebher\u00eb e drejtojm\u00eb n\u00eb autentifikim. P\u00ebrdoruesit jan\u00eb t\u00eb zgjuar dhe mund t\u00eb supozojn\u00eb se duhet t\u00eb vendosin cookie token. Prandaj, do ta ruajm\u00eb edhe n\u00eb Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKodi p\u00ebr t\u00eb punuar 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, t\u00eb gjith\u00eb input\/output atje dhe k\u00ebtu jan\u00eb jo-bllokues. N\u00ebse shkruani kod sinhron, funksionon asinkron. Diku si me gevent, vet\u00ebm se \u00ebsht\u00eb realizuar mir\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe t\u00eb b\u00ebjm\u00eb autentifikimin vet\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" 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 gabuara, e drejtojm\u00eb n\u00eb autentifikim. Por n\u00ebse jan\u00eb t\u00eb sakta, regjistrojm\u00eb token n\u00eb Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" 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 me dy rreshta:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: e trasformojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plot\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nShembulli \u00ebsht\u00eb i thjesht\u00eb, hipotetik. Sigurisht q\u00eb nuk do t\u00eb b\u00ebjm\u00eb nj\u00eb sh\u00ebrbim q\u00eb u tregon njer\u00ebzve mace. Megjithat\u00eb, kush e di. Prandaj, le t\u00eb kalojm\u00eb p\u00ebr at\u00eb q\u00eb mund t\u00eb b\u00ebjm\u00eb n\u00eb prodhim.<\/p>\n<ul>\n<li><strong>Backend minimalist<\/strong>. Ndonj\u00ebher\u00eb na nevojitet t\u00eb ofrojm\u00eb vet\u00ebm nj\u00eb sasi t\u00eb vog\u00ebl t\u00eb t\u00eb dh\u00ebnave n\u00eb backend: ndonj\u00ebher\u00eb duhet t\u00eb shtojm\u00eb nj\u00eb dat\u00eb, ndonj\u00ebher\u00eb t\u00eb shfaqim nj\u00eb list\u00eb, t\u00eb tregojm\u00eb se sa p\u00ebrdorues ka aktualisht n\u00eb faqe, t\u00eb lidhen nj\u00eb num\u00ebrues ose statistik\u00eb. Di\u00e7ka e till\u00eb e vog\u00ebl. K\u00ebto cop\u00ebza minimale mund t\u00eb b\u00ebhen shum\u00eb leht\u00ebsisht. K\u00ebshtu do ta b\u00ebjm\u00eb shpejt, leht\u00ebsisht dhe shk\u00eblqyesh\u00ebm.\n<\/li>\n<li><strong>Parap\u00ebrpunimi i t\u00eb dh\u00ebnave<\/strong>. Ndonj\u00ebher\u00eb d\u00ebshirojm\u00eb t\u00eb integrojm\u00eb reklama n\u00eb faqen ton\u00eb, dhe k\u00ebto reklama i marrim p\u00ebrmes k\u00ebrkesave API. Kjo \u00ebsht\u00eb shum\u00eb leht\u00eb t\u00eb realizohet pik\u00ebrisht k\u00ebtu. Nuk e ngarkojm\u00eb backend-in ton\u00eb, i cili tashm\u00eb \u00ebsht\u00eb duke punuar me v\u00ebshtir\u00ebsi. Mund t\u00eb marrim dhe t\u00eb nxjerrim di\u00e7ka k\u00ebtu. Mund t\u00eb krijojm\u00eb disa JS ose, p\u00ebrkundrazi, t'i ndarim ato, t\u00eb kryejm\u00eb ndonj\u00eb parap\u00ebrpunim para se t'ia dor\u00ebzojm\u00eb p\u00ebrdoruesit.\n<\/li>\n<li><strong>Facada p\u00ebr mikrosh\u00ebrbimin<\/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 dhe siguron raportimin p\u00ebr rreth gjysm\u00ebn e personave juridik\u00eb n\u00eb vend. Ne krijuam nj\u00eb sh\u00ebrbim, ku me ndihm\u00ebn e k\u00ebtij mekanizmi u b\u00ebn\u00eb shum\u00eb gj\u00ebra: rrug\u00ebzimi, autorizimi dhe t\u00eb tjera.<br \/>\nOpenResty mund t\u00eb p\u00ebrdoret si ngjit\u00ebs p\u00ebr mikrosh\u00ebrbimet tuaja, duke ofruar nj\u00eb qasje t\u00eb unifikuar dhe nj\u00eb nd\u00ebrfaqe t\u00eb vetme. Pasi mikrosh\u00ebrbimet mund t\u00eb jen\u00eb t\u00eb shkruara n\u00eb forma t\u00eb ndryshme, si p\u00ebr shembull, k\u00ebtu keni Node.js, aty keni PHP, k\u00ebtu Python, dhe ndonj\u00eb gj\u00eb tjet\u00ebr n\u00eb Erlang, ne kuptojm\u00eb q\u00eb nuk duam t\u00eb shkruajm\u00eb t\u00eb nj\u00ebjtin kod kudo. Prandaj, OpenResty mund t\u00eb vendoset n\u00eb front.<\/p>\n<\/li>\n<li><strong>Statistika dhe Analitika<\/strong>. Normalisht NGINX \u00ebsht\u00eb n\u00eb hyrje, dhe t\u00eb gjitha k\u00ebrkesat kalojn\u00eb p\u00ebrmes tij. Pik\u00ebrisht n\u00eb k\u00ebt\u00eb pik\u00eb \u00ebsht\u00eb shum\u00eb e leht\u00eb t\u00eb mblidhen t\u00eb dh\u00ebnat. Mund t\u00eb b\u00ebni ndonj\u00eb llogaritje dhe ta d\u00ebrgoni diku, p\u00ebr shembull n\u00eb Elasticsearch, Logstash, ose thjesht ta regjistroni n\u00eb log dhe pastaj ta d\u00ebrgoni diku tjet\u00ebr.\n<\/li>\n<li><strong>Sistemet shum\u00ebp\u00ebrdorues<\/strong>. P\u00ebr shembull, loj\u00ebrat online gjithashtu b\u00ebhen shum\u00eb mir\u00eb. Sot n\u00eb Cape Town, Aleksand\u00ebr Gladys do t\u00eb flas\u00eb se si t\u00eb prototipizoni shpejt nj\u00eb loj\u00eb shum\u00ebp\u00ebrdoruesh\u00ebm duke p\u00ebrdorur OpenResty.\n<\/li>\n<li><strong>Filtrimi i k\u00ebrkesave (WAF)<\/strong>. Tani koh\u00eb \u00ebsht\u00eb n\u00eb mod\u00eb t\u00eb b\u00ebhet nj\u00eb web application firewall, ka shum\u00eb sh\u00ebrbime q\u00eb i ofrojn\u00eb ato. Me OpenResty, mund t\u00eb krijoni nj\u00eb web application firewall, i cili do t\u00eb filtroj\u00eb leht\u00ebsisht k\u00ebrkesat sipas k\u00ebrkesave tuaja. N\u00ebse keni Python, e kuptoni se PHP nuk do t\u00eb injektohet me siguri, p\u00ebrve\u00e7 n\u00ebse, natyrisht, e shp\u00ebrtheni nga konsola kudo. E dini q\u00eb keni MySQL dhe Python. Mbase k\u00ebtu dikush mund t\u00eb p\u00ebrpiqet t\u00eb b\u00ebj\u00eb ndonj\u00eb directory traversal dhe t\u00eb injektoj\u00eb di\u00e7ka n\u00eb baz\u00eb. Prandaj, mund t\u00eb filtrohen k\u00ebrkesat shqet\u00ebsuese shpejt dhe me \u00e7mim t\u00eb ul\u00ebt menj\u00ebher\u00eb n\u00eb front.\n<\/li>\n<li><strong>Komuniteti.<\/strong> Duke qen\u00eb se OpenResty \u00ebsht\u00eb nd\u00ebrtuar mbi NGINX, ai ka nj\u00eb bonus - \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 keni n\u00eb fillim \u00ebsht\u00eb zgjidhur tashm\u00eb nga komuniteti NGINX.\n<p><strong>Zhvilluesit e Lua<\/strong>. Dje e bisedova me djemt\u00eb q\u00eb erdh\u00ebn n\u00eb dit\u00ebn e trajnimit HighLoad++ dhe d\u00ebgjova se vet\u00ebm Tarantool \u00ebsht\u00eb shkruar n\u00eb Lua. Kjo nuk \u00ebsht\u00eb e v\u00ebrtet\u00eb; shum\u00eb gj\u00ebra jan\u00eb shkruar n\u00eb Lua. Disa shembuj p\u00ebrfshijn\u00eb: OpenResty, serverin XMPP Prosody, motorin e loj\u00ebs Love2D, Lua p\u00ebrdoret n\u00eb Warcraft dhe n\u00eb vende t\u00eb tjera. Ka shum\u00eb zhvillues Lua, dhe ata kan\u00eb nj\u00eb komunitet t\u00eb madh e p\u00ebrgjegj\u00ebs. T\u00eb gjitha pyetjet e mia p\u00ebr Lua u zgjidhen brenda disa or\u00ebsh. Kur shkruan n\u00eb list\u00ebn e postimeve, gati p\u00ebr disa minuta merr nj\u00eb mori p\u00ebrgjigjesh, duke shpjeguar \u00e7do gj\u00eb. Kjo \u00ebsht\u00eb shum\u00eb e bukur. Fatkeq\u00ebsisht, nuk \u00ebsht\u00eb gjithmon\u00eb nj\u00eb komunitet kaq i dashur.<br \/>\nP\u00ebr OpenResty ka nj\u00eb GitHub, ku mund t\u00eb hapni nj\u00eb \u00e7\u00ebshtje n\u00ebse ndodhi ndonj\u00eb problem. Ka nj\u00eb list\u00eb postimesh n\u00eb Google Groups, ku mund t\u00eb diskutoni pyetje t\u00eb p\u00ebrgjithshme, ka nj\u00eb list\u00eb postimesh n\u00eb kinezisht \u2014 ndoshta nuk e zot\u00ebroni anglishten, por keni njohuri n\u00eb kinezisht.<\/li>\n<\/ul>\n<p><\/p>\n<h1>P\u00ebrfundimet<\/h1>\n<p><\/p>\n<ul>\n<li>Shpresoj se kam arritur t\u00eb shpreh se OpenResty \u00ebsht\u00eb nj\u00eb framework shum\u00eb i p\u00ebrshtatsh\u00ebm, i orientuar p\u00ebr web.<\/li>\n<li>Ai ka nj\u00eb prag t\u00eb ul\u00ebt hyrjeje, pasi kodi ngjan me at\u00eb q\u00eb ne shkruajm\u00eb, gjuha \u00ebsht\u00eb e thjesht\u00eb dhe minimaliste.<\/li>\n<li>Ai ofron I\/O asinkron pa callback-e, k\u00ebshtu q\u00eb nuk do kemi nj\u00eb kod t\u00eb komplikuar, ashtu si mund t\u00eb shkruajm\u00eb ndonj\u00ebher\u00eb n\u00eb NodeJS.<\/li>\n<li>Ka p\u00ebr t\u00eb deponim t\u00eb leht\u00eb, pasi na nevojitet vet\u00ebm NGINX me modulin p\u00ebrkat\u00ebs dhe kodi yn\u00eb, dhe gjith\u00e7ka funksionon menj\u00ebher\u00eb.<\/li>\n<li>Nj\u00eb komunitet i madh dhe reagues.<\/li>\n<\/ul>\n<p>\nNuk e kam p\u00ebrmendur n\u00eb detaje si b\u00ebhet routing, do t\u00eb dilte 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 \u2014 OpenResty: po e shnd\u00ebrrojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plota<\/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 4.9.10 - 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 \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\" \/>\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) 4.9.10\" \/>\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 \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\" \/>\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: po e shnd\u00ebrrojm\u00eb NGINX n\u00eb nj\u00eb server aplikacionesh t\u00eb plota | ProHoster","description":"Po publikojm\u00eb s\u00ebrish transkriptin e raportit nga konferenca HighLoad++ 2016, e cila u mbajt n\u00eb Skolkovo, af\u00ebr Mosk\u00ebs m\u00eb 7-8 n\u00ebntor t\u00eb vitit t\u00eb kaluar. Vladimir Protasov shpjegon se si t\u00eb zgjeroni funksionalitetin e NGINX me ndihm\u00ebn e OpenResty dhe Lua. P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve, emri im \u00ebsht\u00eb Vladimir Protasov, punoj n\u00eb Parallels. Do t\u00eb flas pak p\u00ebr veten. Tre t\u00eb kat\u00ebrtat e jet\u00ebs time kam shkruar kod. Pash\u00eb","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 \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","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"},"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}]}}