{"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\/az\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Yenid\u0259n konfrans\u0131n hesabat\u0131n\u0131n transkriptini d\u0259rc edirik <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016-c\u0131 ild\u0259 Moskva regionunun Skolkovo \u015f\u0259h\u0259rind\u0259 7\u20148 noyabrda ba\u015f tutmu\u015fdur. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> NGINX-in funksionall\u0131\u011f\u0131n\u0131 OpenResty v\u0259 Lua il\u0259 nec\u0259 geni\u015fl\u0259ndirm\u0259k bar\u0259d\u0259 dan\u0131\u015f\u0131r.<\/em><\/p>\n<p>Ham\u0131ya salam, m\u0259nim ad\u0131m Vladimir Protasov, m\u0259n Parallels-d\u0259 \u00e7al\u0131\u015f\u0131ram. \u00d6z\u00fcm haqq\u0131nda bir az dan\u0131\u015f\u0131m. H\u0259yat\u0131m\u0131n \u00fc\u00e7d\u0259 biri kod yazmaqla ke\u00e7ir. M\u0259n tam m\u0259nas\u0131nda proqram\u00e7\u0131yam: b\u0259z\u0259n yuxuda kod g\u00f6r\u00fcr\u0259m. H\u0259yat\u0131m\u0131n d\u00f6rdd\u0259 biri \u2014 istehsal inki\u015faf\u0131na, birba\u015fa istehsala ged\u0259n kod yazma\u011fa s\u0259rf olunub. Yazd\u0131\u011f\u0131m kodla b\u0259zil\u0259riniz istifad\u0259 edirsiniz, amma bunun f\u0259rqind\u0259 olmaya bil\u0259rsiniz.<\/p>\n<p>Anlay\u0131n ki, h\u0259r \u015fey n\u0259 q\u0259d\u0259r pis idi. M\u0259n ki\u00e7ik bir junior olanda, m\u0259n\u0259 iki terabaytl\u0131q bazalar verildi. \u0130ndi burada ham\u0131 highload-d\u0131r. Konfranslara gedirdim, soru\u015furdum: \"Dostlar, sizd\u0259 big data var, h\u0259r \u015fey superdi? Sizd\u0259 bazalar\u0131n\u0131z n\u0259 q\u0259d\u0259rdir?\" M\u0259n\u0259 deyirdil\u0259r: \"Bizd\u0259 100 gigabayt!\" M\u0259n d\u00fc\u015f\u00fcn\u00fcrd\u00fcm: \"Super, 100 gigabayt!\" V\u0259 \u00f6z\u00fcm i\u00e7imd\u0259 d\u00fc\u015f\u00fcn\u00fcrd\u00fcm ki, nec\u0259 edim, \u00fcz ifad\u0259mi d\u0259yi\u015fm\u0259yim. D\u00fc\u015f\u00fcn\u00fcrs\u0259n ki, b\u0259li, dostlar \u0259lad\u0131r, sonra geri d\u00f6nd\u00fcy\u00fcnd\u0259 bu \u00e7ox terabaytl\u0131q bazalarla m\u0259\u015f\u011ful olursan. V\u0259 bu \u2014 junior olaraq. \u0130nan\u0131n, bunun n\u0259 d\u0259r\u0259c\u0259d\u0259 \u015fok oldu\u011funu t\u0259s\u0259vv\u00fcr ed\u0259 bil\u0259rsinizmi?<\/p>\n<p>M\u0259n 20-d\u0259n \u00e7ox proqramla\u015fd\u0131rma dili bilir\u0259m. Bunlar i\u015f prosesind\u0259 \u00f6yr\u0259nm\u0259li oldu\u011fum \u015feyl\u0259rdir. S\u0259n\u0259 Erlang, C, C++, Lua, Python, Ruby kodu verirl\u0259r v\u0259 s\u0259n bunlar\u0131n ham\u0131s\u0131n\u0131 yazmal\u0131 olursan. Y\u0259ni, buna m\u0259cbur idim. Tam say\u0131n\u0131 d\u0259qiq hesablam\u0131\u015fam, amma 20 civar\u0131nda bir \u015fey itdi.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nH\u0259r k\u0259sin Parallels-in n\u0259 oldu\u011funu v\u0259 bizim n\u0259l\u0259r etdiyimizi bildiyi \u00fc\u00e7\u00fcn, bizim n\u0259 q\u0259d\u0259r super oldu\u011fumuzu dem\u0259y\u0259c\u0259m. Sad\u0259c\u0259, d\u00fcnya \u00fczr\u0259 13 ofisimiz, 300-d\u0259n \u00e7ox \u0259m\u0259kda\u015f\u0131m\u0131z var, Moskva, Tallin v\u0259 Maltada inki\u015faf etdiririk. \u0130st\u0259s\u0259n, Maltaya k\u00f6\u00e7\u00fcb, q\u0131\u015fda soyuq olduqda g\u00fcn\u0259\u015fd\u0259 isinm\u0259y\u0259 ged\u0259 bil\u0259rs\u0259n.<\/p>\n<p>X\u00fcsusil\u0259 bizim departament Python 2-d\u0259 yaz\u0131r. Biz i\u015fl\u0259 m\u0259\u015f\u011fuluq, modaya uy\u011fun olan texnologiyalar\u0131 t\u0259tbiq etm\u0259y\u0259 vaxt\u0131m\u0131z yoxdur, buna g\u00f6r\u0259 d\u0259 \u0259ziyy\u0259t \u00e7\u0259kirik. Django istifad\u0259 edirik, \u00e7\u00fcnki onda h\u0259r \u015fey var, laz\u0131ms\u0131z olan\u0131 is\u0259 \u00e7\u0131xard\u0131q. H\u0259m\u00e7inin MySQL, Redis v\u0259 NGINX istifad\u0259 edirik. \u018flav\u0259 olaraq, ba\u015fqa bir \u00e7ox cool \u015feyl\u0259rimiz var. MongoDB d\u0259 var, dov\u015fanlar\u0131m\u0131z var, n\u0259l\u0259rimiz yoxdur \u2014 amma bu m\u0259nim i\u015fim deyil, m\u0259n d\u0259 bununla m\u0259\u015f\u011ful olmuram.<\/p>\n<h1>OpenResty<\/h1>\n<p>\n\u00d6z\u00fcm haqq\u0131nda dan\u0131\u015fd\u0131m. G\u0259lin, bu g\u00fcn n\u0259 bar\u0259d\u0259 dan\u0131\u015faca\u011f\u0131m\u0131 ara\u015fd\u0131raq:<\/p>\n<ul>\n<li>OpenResty n\u0259dir v\u0259 onunla n\u0259 edirl\u0259r?<\/li>\n<li>Niy\u0259 yeni bir velosiped icad etm\u0259liyik, \u0259g\u0259r Python, NodeJS, PHP, Go v\u0259 dig\u0259r m\u00f6ht\u0259\u015f\u0259m \u015feyl\u0259rimiz var v\u0259 ham\u0131 bunlardan m\u0259mnundur?<\/li>\n<li>V\u0259 bir az g\u00fcnd\u0259lik h\u0259yat n\u00fcmun\u0259l\u0259ri. Dan\u0131\u015f\u0131\u011f\u0131m\u0131n 3.5 saatl\u0131q oldu\u011fu \u00fc\u00e7\u00fcn onu \u00e7ox k\u0259sm\u0259li oldum, ona g\u00f6r\u0259 n\u00fcmun\u0259l\u0259r az olacaq.<\/li>\n<\/ul>\n<p>\nOpenResty - bu NGINX-d\u0131r. Bunun say\u0259sind\u0259 biz tam m\u00fcasir bir veb server\u0259 sahibik ki, o, yax\u015f\u0131 yaz\u0131l\u0131b v\u0259 s\u00fcr\u0259tl\u0259 i\u015fl\u0259yir. D\u00fc\u015f\u00fcn\u00fcr\u0259m ki, \u0259ks\u0259rimiz NGINX-i istehsalda istifad\u0259 edirik. Siz ham\u0131n\u0131z bilirsiniz ki, o, s\u00fcr\u0259tlidir v\u0259 \u0259lad\u0131r. Orada s\u00fcr\u0259tli asinxron giri\u015f\/\u00e7\u0131x\u0131\u015f yarad\u0131l\u0131b, buna g\u00f6r\u0259 d\u0259 Python-da oldu\u011fu kimi \u00f6z\u00fcm\u00fcz\u0259 d\u00f6ng\u00fc yaratma\u011fa ehtiyac yoxdur. Gevent \u0259lad\u0131r, fantastikdir, amma \u0259g\u0259r siz C kodu yaz\u0131b v\u0259 orada n\u0259yins\u0259 s\u0259hv getdiyini g\u00f6rs\u0259niz, gevent il\u0259 bunu d\u00fcz\u0259ltm\u0259k sizi d\u0259li ed\u0259 bil\u0259r. M\u0259nim bu bar\u0259d\u0259 t\u0259cr\u00fcb\u0259m olmu\u015fdu: orada n\u0259yin s\u0259hv oldu\u011funu ba\u015fa d\u00fc\u015fm\u0259k \u00fc\u00e7\u00fcn tam iki g\u00fcn laz\u0131m oldu. \u018fg\u0259r kims\u0259 bir ne\u00e7\u0259 h\u0259ft\u0259 \u0259vv\u0259l buna baxmasayd\u0131, problemi tapmasayd\u0131, internetd\u0259 payla\u015fmasayd\u0131 v\u0259 Google bunu tapmasayd\u0131, biz h\u0259qiq\u0259t\u0259n d\u0259li olard\u0131q.<\/p>\n<p>NGINX-d\u0259 art\u0131q ke\u015fi v\u0259 statik m\u0259zmun var. Siz bunu nec\u0259 d\u00fczg\u00fcn etm\u0259k bar\u0259d\u0259 narahat olma\u011fa ehtiyac\u0131n\u0131z yoxdur ki, bir yerd\u0259 yava\u015flamas\u0131n, bir yerd\u0259 deskriptorlar\u0131n\u0131z\u0131 itirm\u0259y\u0259. Nginx-in yerl\u0259\u015fdirilm\u0259si \u00e7ox rahatd\u0131r, sizin hans\u0131 se\u00e7imi etm\u0259yiniz bar\u0259d\u0259 d\u00fc\u015f\u00fcnm\u0259y\u0259 ehtiyac\u0131n\u0131z yoxdur - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx quruldu, adminl\u0259r\u0259 verildi, onlar bununla nec\u0259 i\u015fl\u0259y\u0259c\u0259yini bilirl\u0259r. Nginx, m\u00fcraci\u0259tl\u0259ri strukturla\u015fd\u0131r\u0131lm\u0131\u015f \u015f\u0259kild\u0259 emal edir. Bu bar\u0259d\u0259 bir az sonra dan\u0131\u015faca\u011fam. Q\u0131sa olaraq, onun bir fazas\u0131 var - o, m\u00fcraci\u0259ti q\u0259bul edir, emal edir v\u0259 istifad\u0259\u00e7iy\u0259 m\u0259zmunu t\u0259qdim edir.<\/p>\n<p>Nginx \u0259lad\u0131r, amma bir problem var: meydan\u00e7as\u0131 b\u00fct\u00fcn bu \u0259la x\u00fcsusiyy\u0259tl\u0259r\u0259 malik olmas\u0131na baxmayaraq kifay\u0259t q\u0259d\u0259r \u00e7evik deyil, bununla yana\u015f\u0131, konfiqurasiya oluna bil\u0259n. Bu g\u00fcc he\u00e7 yet\u0259rli deyil. Buna g\u00f6r\u0259 d\u0259 Taobao-dan olanlar bir vaxtlar, y\u0259qin ki, 8 il \u0259vv\u0259l, ora Lua daxil etdil\u0259r. Bu n\u0259 verir?<\/p>\n<ul>\n<li><strong>\u00d6l\u00e7\u00fc<\/strong>. O, ki\u00e7ikdir. LuaJIT t\u0259xmin\u0259n 100-200 kilobayt yadda\u015f \u00fcst\u00fcnd\u0259 y\u00fck saxlay\u0131r v\u0259 performans \u00fc\u00e7\u00fcn minimal y\u00fck g\u0259tirir.<\/li>\n<li><strong>S\u00fcr\u0259t<\/strong>. LuaJIT interpretatoru bir \u00e7ox hallarda C-y\u0259 yax\u0131n olur, b\u0259z\u0259n Java-dan geri qal\u0131r, b\u0259z\u0259n is\u0259 onu \u00fcst\u0259l\u0259yir. Bir m\u00fcdd\u0259t o, \u0259n m\u00fck\u0259mm\u0259l JIT kompilatoru say\u0131l\u0131rd\u0131. \u0130ndi daha m\u00fck\u0259mm\u0259l olanlar var, amma onlar \u00e7ox a\u011f\u0131rd\u0131r, m\u0259s\u0259l\u0259n, V8. B\u0259zi JS interpretatorlar\u0131 v\u0259 Java-n\u0131n HotSpot-u b\u0259zi n\u00f6qt\u0259l\u0259rd\u0259 daha s\u00fcr\u0259tli ola bil\u0259r, amma b\u0259zi yerl\u0259rd\u0259 h\u0259l\u0259 d\u0259 gerid\u0259 qal\u0131rlar.<\/li>\n<li><strong>\u00d6yr\u0259nm\u0259k asanl\u0131\u011f\u0131<\/strong>. \u018fg\u0259r sizin, m\u0259s\u0259l\u0259n, Perl-d\u0259 kod bazan\u0131z varsa v\u0259 siz Booking deyilsinizs\u0259, Perl proqram\u00e7\u0131lar\u0131 tapmaq \u00e7\u0259tindir. \u00c7\u00fcnki onlar\u0131n say\u0131 azd\u0131r, ham\u0131s\u0131n\u0131 g\u00f6t\u00fcr\u00fcbl\u0259r, onlar\u0131 \u00f6yr\u0259tm\u0259k uzun v\u0259 \u00e7\u0259tindir. \u018fg\u0259r siz ba\u015fqa bir \u015feyd\u0259 olan proqram\u00e7\u0131lara ehtiyac\u0131n\u0131z varsa, b\u0259lk\u0259 onlar\u0131 da yenid\u0259n \u00f6yr\u0259tm\u0259li v\u0259 ya tapmal\u0131s\u0131n\u0131z. Lua il\u0259 h\u0259r \u015fey sad\u0259dir. Lua g\u00fcnd\u0259n \u00fc\u00e7 g\u00fcn \u0259rzind\u0259 h\u0259r hans\u0131 bir junior proqram\u00e7\u0131 t\u0259r\u0259find\u0259n \u00f6yr\u0259nilir. M\u0259nim \u00fc\u00e7\u00fcn bunu ba\u015fa d\u00fc\u015fm\u0259k t\u0259xmin\u0259n iki saat laz\u0131m oldu. \u0130ki saatdan sonra art\u0131q istehsalda kod yaz\u0131rd\u0131m. Bir h\u0259ft\u0259 sonra is\u0259 o, birba\u015fa istehsala g\u00f6nd\u0259rildi.<\/li>\n<\/ul>\n<p>\nN\u0259tic\u0259d\u0259 bu bel\u0259 g\u00f6r\u00fcn\u00fcr:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nBurada \u00e7ox \u015fey var. OpenResty-d\u0259 bir \u00e7ox modul y\u0131\u011f\u0131lm\u0131\u015fd\u0131r, h\u0259m lua, h\u0259m d\u0259 m\u00fch\u0259rrik modullar\u0131. V\u0259 sizd\u0259 h\u0259r \u015fey haz\u0131rd\u0131r - yerl\u0259\u015fdirin v\u0259 i\u015fl\u0259sin.<\/p>\n<h1>N\u00fcmun\u0259l\u0259r<\/h1>\n<p>\nLirikan\u0131 b\u0131rak\u0131n, koda ge\u00e7elim. \u0130\u015fte k\u00fc\u00e7\u00fck bir Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBurada ne var? Bu, enginelerin yerle\u015fimidir. Biz sorun etmiyoruz, kendi y\u00f6nlendirmemizi yazm\u0131yoruz, haz\u0131r bir \u015fey alm\u0131yoruz - zaten NGINX'te var, rahat ve tembel ya\u015f\u0131yoruz.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 bu, i\u00e7eri\u011fi bir Lua beti\u011fi arac\u0131l\u0131\u011f\u0131yla sundu\u011fumuzu s\u00f6yleyen bir blok. Enginelerin de\u011fi\u015fkenini al\u0131yoruz <code>remote_addr<\/code> ve bunu <code>string.format<\/code>. Bu, t\u0131pk\u0131 <code>sprintf<\/code>, ama sadece Lua'da, sadece do\u011fru olan\u0131. Ve istemciye veriyoruz.<\/p>\n<p>Sonu\u00e7 olarak bu \u015f\u00f6yle g\u00f6r\u00fcnecek:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAma ger\u00e7ek d\u00fcnyaya d\u00f6nersek. \u00dcretimde kimse Hello World'\u00fc yay\u0131nlamaz. Genelde uygulamam\u0131z veritaban\u0131na veya ba\u015fka bir yere gider ve b\u00fcy\u00fck bir k\u0131sm\u0131 yan\u0131t bekler.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSadece oturuyor ve bekliyor. Bu pek iyi de\u011fil. 100.000 kullan\u0131c\u0131 geldi\u011finde, \u00e7ok zorlan\u0131yoruz. Bu y\u00fczden \u00f6rnek olarak basit bir uygulama yapal\u0131m. Kediler gibi resimler arayal\u0131m. Ama sadece aramayaca\u011f\u0131z, anahtar kelimeleri geni\u015fletece\u011fiz ve e\u011fer kullan\u0131c\u0131 'kedici' ararsa, ona kedileri, t\u00fcyl\u00fcleri ve benzerlerini bulaca\u011f\u0131z. \u0130lk olarak, arama verilerini arka u\u00e7ta almam\u0131z gerekiyor. G\u00f6r\u00fcn\u00fcm\u00fc \u015f\u00f6yle:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u0130ki sat\u0131r, GET parametrelerini alman\u0131z\u0131 sa\u011flar, hi\u00e7bir zorluk yok. Sonra, diyelim ki anahtar kelimeler ve uzant\u0131lar konusunda bir tabloya sahip olan veritaban\u0131m\u0131zdan bu bilgiyi normal bir SQL sorgusuyla al\u0131yoruz. Hepsi basit. Bu g\u00f6r\u00fcn\u00fcm \u015f\u00f6yle:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00fct\u00fcphaneyi ba\u011fl\u0131yoruz <code>resty.mysql<\/code>, zaten paketimizde mevcut. Hi\u00e7bir \u015fey y\u00fcklememize gerek yok, hepsi haz\u0131r. Nas\u0131l ba\u011flanaca\u011f\u0131m\u0131z\u0131 belirtiyoruz ve SQL sorgusunu yap\u0131yoruz:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nBurada biraz korkutucu ama her \u015fey \u00e7al\u0131\u015f\u0131yor. Buradaki 10 - limittir. 10 kay\u0131t \u00e7ekiyoruz, tembeliz, daha fazlas\u0131n\u0131 g\u00f6stermek istemiyoruz. SQL'de limit i\u00e7in unuttum.<\/p>\n<p>Sonras\u0131nda t\u00fcm sorgulara g\u00f6re resimleri buluyoruz. Bir dizi sorgu topluyoruz ve 'reqs' adl\u0131 bir Lua tablosunu dolduruyoruz ve <code>ngx.location.capture_multi<\/code>Bu sorgular paralel gidiyor ve bize yan\u0131tlar d\u00f6n\u00fcyor. \u0130\u015flem s\u00fcresi, en yava\u015f yan\u0131t\u0131n s\u00fcresine e\u015fittir. E\u011fer hepsi 50 milisaniyede yan\u0131t veriyorsa ve y\u00fczlerce sorgu g\u00f6ndermi\u015fsek, yan\u0131t\u0131m\u0131z 50 milisaniye i\u00e7inde gelir. <code>Tembel oldu\u011fumuz ve HTTP i\u015fleme ve \u00f6nbellek yazmak istemedi\u011fimiz i\u00e7in, NGINX'i her \u015feyi bizim i\u00e7in yapmaya zorlayaca\u011f\u0131z. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, orada<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nurl\/fetch<\/p>\n<p>istemine bir istek vard\u0131, i\u015fte o: <code>Basit bir<\/code>proxy_pass<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nyap\u0131yoruz, nerede \u00f6nbelle\u011fe alaca\u011f\u0131m\u0131z\u0131, nas\u0131l yapaca\u011f\u0131m\u0131z\u0131 belirtiyoruz ve her \u015fey \u00e7al\u0131\u015f\u0131yor. <code>Ama bu yeterli de\u011fil, kullan\u0131c\u0131ya verileri de geri vermemiz gerekiyor. En basit fikir, her \u015feyi JSON'a serile\u015ftirmek, kolay, iki sat\u0131rda. Content-Type'\u0131 veriyoruz, JSON'\u0131 veriyoruz.<\/code>, g\u00f6st\u0259ririk ki, haraya \u00f6nbelle\u011fe almaq, bunu nec\u0259 etm\u0259k v\u0259 h\u0259r \u015fey i\u015fl\u0259yir.<\/p>\n<p>Amma bu yet\u0259rli deyil, istifad\u0259\u00e7iy\u0259 m\u0259lumatlar\u0131 t\u0259qdim etm\u0259liyik. \u018fn sad\u0259 fikir - bunu JSON format\u0131nda serialize etm\u0259k, asand\u0131r, iki c\u00fcml\u0259lik i\u015fdir. Content-Type t\u0259qdim edirik, JSON-u t\u0259qdim edirik.<\/p>\n<p>Amma bir \u00e7\u0259tinlik var: istifad\u0259\u00e7i JSON-u oxumaq ist\u0259mir. Biz front-end inki\u015faf etdiricil\u0259rini \u00e7\u0259km\u0259liyik. B\u0259z\u0259n bunu \u0259vv\u0259lc\u0259 etm\u0259k ist\u0259mirik. SEO m\u00fct\u0259x\u0259ssisl\u0259ri biz\u0259 dey\u0259c\u0259kl\u0259r ki, \u015f\u0259kill\u0259ri axtar\u0131r\u0131qsa, onlara f\u0259rqi yoxdur. Amma biz onlara h\u0259r hans\u0131 bir m\u0259zmun t\u0259qdim ed\u0259nd\u0259, onlar dey\u0259c\u0259kl\u0259r ki, axtar\u0131\u015f sisteml\u0259ri he\u00e7 n\u0259 indeksl\u0259mir.<\/p>\n<p>Bununla n\u0259 etm\u0259liyik? \u00d6z-\u00f6z\u00fcn\u0259, biz istifad\u0259\u00e7iy\u0259 HTML t\u0259qdim ed\u0259c\u0259yik. \u018fl il\u0259 yaratmaq - uy\u011fun deyil, buna g\u00f6r\u0259 d\u0259 \u015fablonlardan istifad\u0259 etm\u0259k ist\u0259yirik. Bunun \u00fc\u00e7\u00fcn bir kitabxana var: <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSiz, y\u0259qin ki, OPM bar\u0259d\u0259 \u00fc\u00e7 d\u0259h\u015f\u0259tli h\u0259rfi g\u00f6rd\u00fcn\u00fcz. OpenResty \u00f6z paket meneceril\u0259 g\u0259lir, bunun vasit\u0259sil\u0259 bir \u00e7ox m\u00fcxt\u0259lif modulu qura\u015fd\u0131ra bil\u0259rik, x\u00fcsusil\u0259 d\u0259: <code>lua-resty-template<\/code>. Bu, Django \u015fablonlar\u0131na yax\u0131n olan sad\u0259 bir \u015fablon m\u00fch\u0259rrikidir. Orada kod yaza v\u0259 d\u0259yi\u015f\u0259nl\u0259r daxil ed\u0259 bil\u0259rsiniz.<\/p>\n<p>N\u0259tic\u0259d\u0259 h\u0259r \u015fey t\u0259xmin\u0259n bel\u0259 g\u00f6r\u00fcn\u0259c\u0259k:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nBiz m\u0259lumatlar\u0131 ald\u0131q v\u0259 yenid\u0259n iki s\u0259tird\u0259 \u015fablon render etdik. \u0130stifad\u0259\u00e7i m\u0259mnun, pi\u015fiyi ald\u0131. Biz sor\u011funu geni\u015fl\u0259ndirdiyimiz \u00fc\u00e7\u00fcn pi\u015fiyl\u0259 yana\u015f\u0131, d\u0259niz pi\u015fiyini d\u0259 ald\u0131q. Kim bilir, b\u0259lk\u0259 d\u0259 o, m\u0259hz onu axtar\u0131rd\u0131, amma sor\u011fusunu d\u00fczg\u00fcn ifad\u0259 ed\u0259 bilmirdi.<\/p>\n<p>H\u0259r \u015fey m\u00f6ht\u0259\u015f\u0259mdir, amma biz inki\u015faf m\u0259rh\u0259l\u0259sind\u0259yik v\u0259 h\u0259l\u0259 istifad\u0259\u00e7il\u0259r\u0259 g\u00f6st\u0259rm\u0259k ist\u0259mirik. G\u0259lin, avtorizasiya ed\u0259k. Bunu etm\u0259k \u00fc\u00e7\u00fcn, OpenResty terminologiyas\u0131nda NGINX-in sor\u011funu nec\u0259 i\u015fl\u0259diyin\u0259 baxaq:<\/p>\n<ul>\n<li>Birinci m\u0259rh\u0259l\u0259 - <strong>access<\/strong>, istifad\u0259\u00e7i sad\u0259c\u0259 g\u0259lib v\u0259 biz onu ba\u015fl\u0131qlara, IP \u00fcnvan\u0131na v\u0259 dig\u0259r m\u0259lumatlara g\u00f6r\u0259 qiym\u0259tl\u0259ndirdik. \u018fg\u0259r biz\u0259 xo\u015f g\u0259lm\u0259s\u0259, onu d\u0259rhal ba\u011flaya bil\u0259rik. Bu, avtorizasiya \u00fc\u00e7\u00fcn istifad\u0259 oluna bil\u0259r, ya da \u0259g\u0259r biz\u0259 \u00e7ox sayda sor\u011fu g\u0259lirs\u0259, biz onlar\u0131 bu m\u0259rh\u0259l\u0259d\u0259 asanl\u0131qla k\u0259s\u0259 bil\u0259rik.<\/li>\n<li><strong>rewrite<\/strong>. Sor\u011funun b\u0259zi m\u0259lumatlar\u0131n\u0131 yenid\u0259n yaz\u0131r\u0131q.<\/li>\n<li><strong>content<\/strong>. \u0130stifad\u00e7iye m\u0259zmun t\u0259qdim edirik.<\/li>\n<li><strong>headers filter<\/strong>. Cavab ba\u015fl\u0131qlar\u0131n\u0131 d\u0259yi\u015fdiririk. \u018fg\u0259r biz istifad\u0259 etdirs\u0259k, <code>Ama bu yeterli de\u011fil, kullan\u0131c\u0131ya verileri de geri vermemiz gerekiyor. En basit fikir, her \u015feyi JSON'a serile\u015ftirmek, kolay, iki sat\u0131rda. Content-Type'\u0131 veriyoruz, JSON'\u0131 veriyoruz.<\/code>, biz istifad\u0259\u00e7iy\u0259 verm\u0259zd\u0259n \u0259vv\u0259l b\u0259zi ba\u015fl\u0131qlar\u0131 yenid\u0259n yaza bil\u0259rik.<\/li>\n<li><strong>body filter<\/strong>. B\u0259dii d\u0259yi\u015fdirm\u0259k m\u00fcmk\u00fcnd\u00fcr.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 loglama. Elasticsearch-a \u0259lav\u0259 t\u0259b\u0259q\u0259 olmadan log yazmaq m\u00fcmk\u00fcnd\u00fcr.<\/li>\n<\/ul>\n<p>\nBizim avtorizasiyam\u0131z bel\u0259 g\u00f6r\u00fcn\u0259c\u0259k:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nBunu daha \u0259vv\u0259l t\u0259svir etdiyimiz <code>location<\/code>, daxil ed\u0259c\u0259yik v\u0259 ora bel\u0259 bir kod yerl\u0259\u015fdir\u0259c\u0259yik:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nBiz cookie token-imizin olub-olmad\u0131\u011f\u0131n\u0131 yoxlay\u0131r\u0131q. \u018fg\u0259r yoxdursa, avtorizasiyaya y\u00f6nl\u0259ndiririk. \u0130stifad\u0259\u00e7il\u0259r a\u011f\u0131ll\u0131d\u0131r v\u0259 cookie token-in yerl\u0259\u015fdirilm\u0259si laz\u0131m oldu\u011funu ba\u015fa d\u00fc\u015f\u0259 bil\u0259rl\u0259r. Buna g\u00f6r\u0259 d\u0259, onu Redis-d\u0259 d\u0259 saxlayaca\u011f\u0131q:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nRedis-d\u0259 i\u015fl\u0259m\u0259k \u00fc\u00e7\u00fcn kod \u00e7ox sad\u0259dir v\u0259 dig\u0259r dill\u0259rd\u0259n he\u00e7 bir f\u0259rqi yoxdur. Eyni zamanda, burada v\u0259 orada b\u00fct\u00fcn giri\u015f\/\u00e7\u0131x\u0131\u015f bloklanmayan \u015f\u0259kild\u0259dir. Synchronous kod yaz\u0131rs\u0131n\u0131zsa, asinxron i\u015fl\u0259yir. Gevent il\u0259 b\u0259nz\u0259yir, yaln\u0131z yax\u015f\u0131 haz\u0131rlanm\u0131\u015fd\u0131r.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nG\u0259lin, avtorizasiyan\u0131 ed\u0259k:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSor\u011fu b\u0259d \u0259zm\u0259y\u0259 ba\u015flamaq laz\u0131m oldu\u011funa deyirik. POST-argumentl\u0259ri al\u0131r\u0131q, istifad\u0259\u00e7i ad\u0131 v\u0259 \u015fifr\u0259nin do\u011fru oldu\u011funa yoxlay\u0131r\u0131q. \u018fg\u0259r yanl\u0131\u015flarsa, avtorizasiyaya y\u00f6nl\u0259ndiririk. Amma d\u00fczg\u00fcnl\u0259rs\u0259, token-i Redis-\u0259 yaz\u0131r\u0131q:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nCookie qoyma\u011f\u0131 unutmay\u0131n, bu da iki x\u0259ttd\u0259 edilir:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: NGINX-i tam i\u015fl\u0259k t\u0259tbiq serverin\u0259 \u00e7evirm\u0259k\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSad\u0259, n\u0259z\u0259ri bir n\u00fcmun\u0259. Biz \u0259lb\u0259tt\u0259 ki, insanlara pi\u015fikl\u0259r g\u00f6st\u0259r\u0259n bir xidm\u0259t etm\u0259yi d\u00fc\u015f\u00fcnm\u00fcr\u00fck. Amma kim bilir? Buna g\u00f6r\u0259, istehsalda ed\u0259 bil\u0259c\u0259yimiz \u015feyl\u0259r\u0259 n\u0259z\u0259r salaq.<\/p>\n<ul>\n<li><strong>Minimalist backend<\/strong>. B\u0259z\u0259n backend-\u0259 yaln\u0131z bir az m\u0259lumat verm\u0259k laz\u0131m olur: b\u0259z\u0259n tarix \u0259lav\u0259 etm\u0259k, b\u0259z\u0259n bir siyah\u0131 g\u00f6st\u0259rm\u0259k, saytda n\u0259 q\u0259d\u0259r istifad\u0259\u00e7i oldu\u011funu bildirm\u0259k, say\u011fac v\u0259 ya statistika qo\u015fmaq laz\u0131md\u0131r. Bel\u0259 ki\u00e7ik \u015feyl\u0259ri etm\u0259k \u00e7ox asand\u0131r. Bel\u0259likl\u0259, bunu tez, asan v\u0259 g\u00f6z\u0259l etm\u0259k olar.\n<\/li>\n<li><strong>M\u0259lumatlar\u0131n preporsessinqi<\/strong>. B\u0259z\u0259n s\u0259hif\u0259miz\u0259 reklam yerl\u0259\u015fdirm\u0259k ist\u0259yirik v\u0259 bu reklamlara API sor\u011fular\u0131 vasit\u0259si il\u0259 daxil oluruq. Bunu burada etm\u0259k \u00e7ox asand\u0131r. Bizim backend-imizi y\u00fckl\u0259mirik, \u00e7\u00fcnki o art\u0131q a\u011f\u0131r i\u015fl\u0259yir. Ba\u015fqa yerl\u0259rd\u0259n g\u00f6t\u00fcr\u0259 bil\u0259rik. Biz b\u0259lk\u0259 d\u0259 b\u0259zi JS-l\u0259ri birl\u0259\u015fdir\u0259 v\u0259 ya \u0259ksin\u0259 ay\u0131ra bil\u0259rik, istifad\u0259\u00e7iy\u0259 verm\u0259zd\u0259n \u0259vv\u0259l bir \u015feyl\u0259ri preporsess ed\u0259 bil\u0259rik.\n<\/li>\n<li><strong>Mikro xidm\u0259t \u00fc\u00e7\u00fcn fasad<\/strong>. Bu da \u00e7ox yax\u015f\u0131 bir n\u00fcmun\u0259dir, m\u0259n bunu h\u0259yata ke\u00e7irmi\u015f\u0259m. M\u0259n \u0259vv\u0259ll\u0259r Tenzor \u015firk\u0259tind\u0259 \u00e7al\u0131\u015fm\u0131\u015fd\u0131m, hans\u0131 ki, elektron hesabatl\u0131l\u0131qla m\u0259\u015f\u011fuldur v\u0259 \u00f6lk\u0259d\u0259ki h\u00fcquqi \u015f\u0259xsl\u0259rin yar\u0131s\u0131na yax\u0131n hesabat t\u0259qdim edir. Biz bu xidm\u0259ti yaratd\u0131q, burada eyni mexanizmd\u0259n istifad\u0259 edilm\u0259kl\u0259 bir \u00e7ox \u015feyl\u0259r edildi: mar\u015frutla\u015fd\u0131rma, autentifikasiya v\u0259 dig\u0259r \u015feyl\u0259r.<br \/>\nOpenResty, mikro xidm\u0259tl\u0259riniz \u00fc\u00e7\u00fcn yap\u0131\u015fd\u0131r\u0131c\u0131 olaraq istifad\u0259 edil\u0259 bil\u0259r, bu, h\u0259r \u015fey\u0259 birg\u0259 giri\u015f v\u0259 birg\u0259 interfeys t\u0259min ed\u0259c\u0259k. Mikro xidm\u0259tl\u0259riniz burada Node.js, burada PHP, burada Python, burada da Erlang-da bir \u015fey ola bil\u0259r, biz anlay\u0131r\u0131q ki, eyni kodu h\u0259r yerd\u0259 yenid\u0259n yazmaq ist\u0259mirik. Buna g\u00f6r\u0259 OpenResty-ni \u00f6n t\u0259r\u0259f\u0259 \u0259lav\u0259 ed\u0259 bil\u0259rik.<\/p>\n<\/li>\n<li><strong>Statistika v\u0259 analitika<\/strong>. Ad\u0259t\u0259n NGINX giri\u015fd\u0259 olur v\u0259 b\u00fct\u00fcn sor\u011fular onun vasit\u0259sil\u0259 ke\u00e7ir. M\u0259hz burada \u00e7ox rahat toplaya bil\u0259rsiniz. H\u0259tta bir \u015feyl\u0259ri d\u0259rhal hesablaya v\u0259 n\u0259s\u0259 g\u00f6nd\u0259r\u0259 bil\u0259rsiniz, m\u0259s\u0259l\u0259n, Elasticsearch, Logstash v\u0259 ya sad\u0259c\u0259 loga yaz\u0131b sonra n\u0259s\u0259s\u0259 g\u00f6nd\u0259r\u0259 bil\u0259rsiniz.\n<\/li>\n<li><strong>\u00c7ox istifad\u0259\u00e7i sisteml\u0259ri<\/strong>. M\u0259s\u0259l\u0259n, onlayn oyunlar\u0131 h\u0259yata ke\u00e7irm\u0259k d\u0259 \u00e7ox yax\u015f\u0131d\u0131r. Bu g\u00fcn Keyptaundak\u0131 Aleksandr Glad\u0131\u015f, OpenResty vasit\u0259sil\u0259 \u00e7ox istifad\u0259\u00e7i oyununu nec\u0259 tez prototipl\u0259\u015fdirm\u0259k bar\u0259d\u0259 dan\u0131\u015facaq.\n<\/li>\n<li><strong>Sor\u011fular\u0131n filtrasyonu (WAF)<\/strong>. \u0130ndi veb t\u0259tbiqi firewall-lar\u0131 yaratmaq d\u0259bd\u0259dir, onlar\u0131 t\u0259qdim ed\u0259n bir \u00e7ox xidm\u0259t var. OpenResty vasit\u0259sil\u0259 \u00f6z veb t\u0259tbiqi firewall-\u0131n\u0131z\u0131 yaratmaq m\u00fcmk\u00fcnd\u00fcr ki, bu da t\u0259l\u0259bl\u0259riniz\u0259 uy\u011fun olaraq sor\u011fular\u0131 asanl\u0131qla v\u0259 rahatl\u0131qla filtrl\u0259m\u0259y\u0259 imkan verir. \u018fg\u0259r siz Python-dans\u0131n\u0131zsa, o zaman PHP-nin he\u00e7 bir yerd\u0259 konsoldan ba\u015flatmad\u0131n\u0131zsa, siz\u0259 he\u00e7 vaxt injekt olunmayaca\u011f\u0131n\u0131 ba\u015fa d\u00fc\u015fd\u00fcy\u00fcn\u00fcz\u00fc bilirsiniz. Siz MySQL v\u0259 Python-a maliksiniz. Burada b\u0259lk\u0259 d\u0259 hans\u0131sa directory traversal c\u0259hdi olacaqd\u0131r v\u0259 bazaya bir \u015fey injekt etm\u0259k ist\u0259y\u0259rl\u0259r. Buna g\u00f6r\u0259 d\u0259, qeyri-adi sor\u011fular\u0131 tez v\u0259 ucuz \u015f\u0259kild\u0259, d\u0259rhal \u00f6n t\u0259r\u0259fd\u0259 filtrl\u0259m\u0259k m\u00fcmk\u00fcnd\u00fcr.\n<\/li>\n<li><strong>\u0130cma.<\/strong> OpenResty NGINX-in \u00fcz\u0259rind\u0259 quruldu\u011fu \u00fc\u00e7\u00fcn \u0259lav\u0259 bir bonusu var - bu <strong>NGINX icmas\u0131<\/strong>. Bu \u00e7ox b\u00f6y\u00fckd\u00fcr v\u0259 sizin ilkin olaraq qar\u015f\u0131la\u015faca\u011f\u0131n\u0131z bir \u00e7ox sual art\u0131q NGINX icmas\u0131 t\u0259r\u0259find\u0259n h\u0259ll edilmi\u015fdir.\n<p><strong>Lua inki\u015faf etdiricil\u0259ri<\/strong>. D\u00fcn\u0259n HighLoad++ t\u0259dris g\u00fcn\u00fcn\u0259 g\u0259l\u0259n u\u015faqlarla dan\u0131\u015fd\u0131m v\u0259 e\u015fitdim ki, Lua-da yaln\u0131z Tarantool yaz\u0131lm\u0131\u015fd\u0131r. Bu do\u011fru deyil, Lua-da \u00e7ox \u015fey yaz\u0131l\u0131b. M\u0259s\u0259l\u0259n: OpenResty, XMPP-server Prosody, oyun m\u00fch\u0259rriki Love2D, Lua Warcraft-da v\u0259 dig\u0259r yerl\u0259rd\u0259 skript olunur. Lua inki\u015faf etdiricil\u0259ri \u00e7oxdur, onlar\u0131n geni\u015f v\u0259 cavabdeh icmas\u0131 var. Lua il\u0259 ba\u011fl\u0131 b\u00fct\u00fcn suallar\u0131m bir ne\u00e7\u0259 saat \u0259rzind\u0259 h\u0259ll olundu. Po\u00e7t siyah\u0131s\u0131na yazanda, bir ne\u00e7\u0259 d\u0259qiq\u0259 i\u00e7ind\u0259 art\u0131q bir \u00e7ox cavablar olur, n\u0259yi nec\u0259 etdiyini, n\u0259yi n\u0259y\u0259 g\u00f6r\u0259 oldu\u011funu yaz\u0131rlar. Bu, \u00e7ox g\u00f6z\u0259ldir. T\u0259\u0259ss\u00fcf ki, h\u0259r yerd\u0259 bel\u0259 xeyirxah bir icma yoxdur.<br \/>\nOpenResty il\u0259 ba\u011fl\u0131 GitHub var, orada h\u0259r hans\u0131 bir problem oldu\u011fu halda issue a\u00e7maq m\u00fcmk\u00fcnd\u00fcr. Google Groups-da m\u00fczakir\u0259 \u00fc\u00e7\u00fcn bir po\u00e7t siyah\u0131s\u0131 var, \u00fcmumi m\u0259s\u0259l\u0259l\u0259ri m\u00fczakir\u0259 etm\u0259k \u00fc\u00e7\u00fcn, \u00e7in dilind\u0259 d\u0259 po\u00e7t siyah\u0131s\u0131 var - b\u0259lk\u0259 d\u0259 ingilis dilini bilmir, amma \u00e7in dilini bilirsiniz.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Yekunlar<\/h1>\n<p><\/p>\n<ul>\n<li>\u00dcmid edir\u0259m ki, OpenResty-nin \u00e7ox rahat bir \u00e7\u0259r\u00e7iv\u0259 oldu\u011funu anlada bilmi\u015f\u0259m, veb \u00fc\u00e7\u00fcn optimalla\u015fd\u0131r\u0131lm\u0131\u015fd\u0131r.<\/li>\n<li>Onun a\u015fa\u011f\u0131 giri\u015f \u0259\u015fi var, \u00e7\u00fcnki kod yazd\u0131\u011f\u0131m\u0131z \u015fey\u0259 b\u0259nz\u0259yir, dil olduqca sad\u0259 v\u0259 minimalisizdir.<\/li>\n<li>Asinxron I\/O t\u0259qdim edir, geri \u00e7a\u011f\u0131rmalar olmadan, bizim NodeJS-d\u0259 b\u0259z\u0259n nec\u0259 yazd\u0131\u011f\u0131m\u0131z l\u0259zz\u0259t \u00e7irkliliyi olmayacaq.<\/li>\n<li>Onun asan yerl\u0259\u015fdirilm\u0259si var, \u00e7\u00fcnki yaln\u0131z laz\u0131m olan modulu olan NGINX v\u0259 bizim kodumuz t\u0259l\u0259b olunur v\u0259 h\u0259r \u015fey d\u0259rhal i\u015fl\u0259m\u0259y\u0259 ba\u015flay\u0131r.<\/li>\n<li>B\u00f6y\u00fck v\u0259 cavabdeh icma.<\/li>\n<\/ul>\n<p>\nMar\u015frutla\u015fd\u0131rman\u0131n nec\u0259 edildiyini \u0259trafl\u0131 izah etm\u0259dim, o \u00e7ox uzun bir hekay\u0259 olard\u0131.<\/p>\n<p>Diqq\u0259tiniz \u00fc\u00e7\u00fcn t\u0259\u015f\u0259kk\u00fcr edir\u0259m!<\/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=\"Videonu izl\u0259yin\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<em><noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2016\/abstracts\/2432.html\">Vladimir Protasov - OpenResty: NGINX-i tam funksiyal\u0131 t\u0259tbiq serverin\u0259 \u00e7eviririk<\/a><\/noindex><\/em><br \/>\n<br \/>M\u0259nb\u0259: <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.0.1 - 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\/az\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"az_AZ\" \/>\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\/az\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-25T17:45:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47OpenResty: NGINX-i tam funksiyal\u0131 t\u0259tbiq serverin\u0259 \u00e7eviririk | ProHoster","description":"Yenid\u0259n transkriptimizi d\u0259rc edirik.","canonical_url":"https:\/\/prohoster.info\/az\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"az_AZ","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\/az\/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\/az\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}