{"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\/et\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Me taas avaldame konverentsi ettekande transkriptsiooni <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016. aastal, mis toimus Moskva l\u00e4histel Skolkovo 7\u20138. novembril m\u00f6\u00f6dunud aastal. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> r\u00e4\u00e4gib, kuidas laiendada NGINX-i funktsionaalsust OpenResty ja Lua abil.<\/em><\/p>\n<p>Tere k\u00f5igile, minu nimi on Vladimir Protasov, ma t\u00f6\u00f6tan Parallelsis. R\u00e4\u00e4gin veidi endast. Kolm neljandikku oma elust olen ma kirja pannud koodi. Olen t\u00f5eline programmeerija: m\u00f5nikord n\u00e4en ma unes koodi. \u00dcks neljandik elust \u2014 t\u00f6\u00f6stuslik arendus, koodi kirjutamine, mis l\u00e4heb otse tootmisse. Kood, millega m\u00f5ned teist kasutavad, aga ei pruugi sellest teadlikud olla.<\/p>\n<p>Et te m\u00f5istaksite, kui halb see k\u00f5ik oli. Kui olin noor algaja, tulin kohale ja mulle anti kahesaja terabaidi andmebaasid. N\u00fc\u00fcd on k\u00f5igil siin highload. K\u00e4isin konverentsidel ja k\u00fcsisin: \u00abKuidas, r\u00e4\u00e4gi, teil on big data, k\u00f5ik on lahe? Kui suur on teie andmebaas?\u00bb Nad vastasid: \u00abMeil on 100 gigabaiti!\u00bb Ma \u00fctlesin: \u00abLahe, 100 gigabaiti!\u00bb Samas m\u00f5tlesin, kuidas s\u00e4ilitada rahulik n\u00e4gu. M\u00f5tled, et jah, need t\u00fc\u00fcbid on \u00e4gedad, ja siis tuled tagasi ja tegeled nende mitme terabaidi andmebaasidega. Ja see k\u00f5ik \u2014 olles algaja. Kas te oskate ette kujutada, kui suur see l\u00f6\u00f6k oli?<\/p>\n<p>Ma tunnen \u00fcle 20 programmeerimiskeele. See on see, millega pidin t\u00f6\u00f6 k\u00e4igus kokku puutuma. Sulle antakse koodi Erlangis, C-s, C++-s, Luas, Pythonis, Ruby's jne, ja sa pead sellega hakkama saama. \u00dches\u00f5naga, pidin. T\u00e4pset arvu kokku lugeda ei \u00f5nnestunud, aga kuskil 20 on kaotsi l\u00e4inud.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKuna k\u00f5ik kohalolijad teavad, mis on Parallels ja millega me tegeleme, ei hakka ma r\u00e4\u00e4kima, kui \u00e4gedad me oleme ja mida teeme. R\u00e4\u00e4gin ainult, et meil on 13 kontorit \u00fcle maailma, rohkem kui 300 t\u00f6\u00f6tajat, arendus Tallinnas, Moskvas ja Maltal. Soovi korral saab Maltale kolida, kui talvel on k\u00fclm ja tahad end soojendada.<\/p>\n<p>Meie osakond kirjutab Python 2-s. Me tegeleme \u00e4rihuvidega ja meil pole aega modernsete tehnoloogiate juurutamiseks, seet\u00f5ttu kannatame. Meil on Django, sest seal on k\u00f5ik olemas, ja \u00fcleliigse viskame minema. Samuti MySQL, Redis ja NGINX. Meil on ka palju muid lahedaid asju. Meil on MongoDB, meie vahel jooksevad k\u00fc\u00fclikud, meil on k\u00f5ike \u2014 aga see ei ole minu osa ja sellega ma ei tegele.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nOma kohta r\u00e4\u00e4kisin. Olgem n\u00fc\u00fcd selged, millest ma t\u00e4na r\u00e4\u00e4gin:<\/p>\n<ul>\n<li>Mis on OpenResty ja millega seda s\u00fc\u00fcakse?<\/li>\n<li>Miks v\u00e4lja m\u00f5tlema veel \u00fchte jalgratast, kui meil on olemas Python, NodeJS, PHP, Go ja muud \u00e4gedad asjad, millega k\u00f5ik on rahul?<\/li>\n<li>Veidi elulisi n\u00e4iteid. Mul tuli esitluse mahtu m\u00e4rgatavalt v\u00e4hendada, kuna see venis koguni 3,5 tunni pikkuseks, seega n\u00e4iteid j\u00e4\u00e4b v\u00e4hemaks.<\/li>\n<\/ul>\n<p>\nOpenResty on NGINX. T\u00e4nu sellele on meil t\u00e4ie\u00f5iguslik veebiserver, mis on kenasti kirjutatud ja t\u00f6\u00f6tab kiiresti. Ma arvan, et enamik meist kasutab NGINX-i tootmises. Te k\u00f5ik teate, et see on kiire ja \u00e4ge. Sellel on suurep\u00e4rane s\u00fcnkrone sisend\/v\u00e4ljund, seega ei pea me mitut jalgratast leiutama nagu Pythonis, kus gevent on leiutatud. Gevent on \u00e4ge, aga kui kirjutate C-keelt ja midagi l\u00e4heb valesti, siis geventi t\u00f5rgete leidmine ajab teid hulluks. Mul oli kogemus, kus kulus lausa kaks p\u00e4eva, et m\u00f5ista, mis valesti l\u00e4ks. Kui keegi poleks eelnevalt n\u00e4dalaid kaevanud, probleemi leidnud, sellest Internetis kirjutanud ja Google seda leidnud, siis oleksime t\u00e4iesti hullu l\u00e4inud.<\/p>\n<p>NGINX-is on juba olemas vahem\u00e4lu ja staatiline sisu. Te ei pea muretsema selle \u00fcle, kuidas seda korralikult teha, et kuskil ei tekiks takistusi ja et te ei kaotaks kirjeldusi. Nginx-i on v\u00e4ga mugav kasutada, teil ei pea olema peamurdmist selle \u00fcle, mida valida - WSGI, PHP-FPM, Gunicorn, Unicorn. Paigaldage Nginx, andke adminstratsioonile, nad teavad, kuidas sellega t\u00f6\u00f6tada. Nginx t\u00f6\u00f6tleb p\u00e4ringud struktureeritult. R\u00e4\u00e4gin sellest veidi hiljem. L\u00fchidalt on sellel faas, kui see vastuv\u00f5tt, teine faas, kui see t\u00f6\u00f6tleb, ja kolmas, kui see edastab sisu kasutajale.<\/p>\n<p>Nginx on \u00e4ge, kuid on \u00fcks probleem: see ei ole piisavalt paindlik isegi k\u00f5ikide nende \u00e4gedate funktsioonide puhul, mida arendajad on seadistusse lisanud. Seda v\u00f5imu on liiga v\u00e4he. Seet\u00f5ttu integreerisid Taobao arendajad sinna kunagi ammu, umbes kaheksa aastat tagasi, Lua. Mida see annab?<\/p>\n<ul>\n<li><strong>Suurus<\/strong>. See on v\u00e4ike. LuaJIT annab umbes 100-200 kilobaiti m\u00e4lu \u00fclekaalu ja minimaalset j\u00f5udluse \u00fclekaalu.<\/li>\n<li><strong>Kiirus<\/strong>. LuaJIT t\u00f5lkija on paljudes olukordades C l\u00e4hedane, m\u00f5nedes olukordades j\u00e4\u00e4b see Java-le alla ja m\u00f5nedes olukordades \u00fcletab selle. Teatud aja jooksul peeti seda parimaks, \u00e4gedaimaks JIT-kompilaatoriks. Praegu on olemas veelgi \u00e4gedamaid, kuid need on v\u00e4ga rasked, n\u00e4iteks sama V8. M\u00f5ned JS t\u00f5lkijad ja Java HotSpot on m\u00f5nes punktis kiiremad, kuid teistes kohtades j\u00e4\u00e4vad endiselt alla.<\/li>\n<li><strong>Lihtsus omandamisel<\/strong>. Kui teie koodibaas on n\u00e4iteks Perl, ja te ei ole Booking, siis te ei leia Perl programmeerijaid. Sest neid ei ole, k\u00f5ik on nad \u00e4ra viidud ja nende \u00f5petamine on pikaldane ja keeruline. Kui soovite programmeerijaid millegi muu jaoks, siis v\u00f5ib-olla tuleb ka neid \u00fcmber koolitada v\u00f5i leida. Lua puhul on k\u00f5ik lihtne. Lua \u00f5pib \u00fcksk\u00f5ik milline algaja kolme p\u00e4evaga. Mul kulus umbes kaks tundi, et selgeks saada. Kaks tundi hiljem kirjutasin ma juba tootmises koodi.<\/li>\n<\/ul>\n<p>\nTulemus v\u00e4lja n\u00e4eb nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSiin on palju asju. OpenResty's on kogutud hulk mooduleid, nii Luaga kui ka NGINXiga. Ja teil on k\u00f5ik valmis - s\u00f5lmitud ja t\u00f6\u00f6tab.<\/p>\n<h1>N\u00e4ited<\/h1>\n<p>\nL\u00f5petame luule, liikuge koodi juurde. Siin on v\u00e4ike Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMida siin on? See on NGINXi location. Me ei vaeva end, me ei kirjuta oma suunamist ega kasuta mingit valmis - meil on juba NGINXis olemas, elame h\u00e4sti ja laiskade elu.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 see on plokk, mis \u00fctleb, et anname conteneti edasi Lua skripti abil. V\u00f5tame NGINXi muutuja <code>remote_addr<\/code> ja paneme selle sisse <code>string.format<\/code>. See on sama, mis <code>sprintf<\/code>, ainult et Lua-s, ainult \u00f5ige. Ja anname selle kliendile.<\/p>\n<p>Tulemus n\u00e4eb v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAga naaseme reaalsesse maailma. Tootmises ei saa keegi Hello World'i. Meie rakendus k\u00e4ib enamasti andmebaasi v\u00f5i mujale ja suure osa ajast ootab vastust.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLihtsalt istub ja ootab. See ei ole v\u00e4ga hea. Kui tuleb 100 000 kasutajat, siis on meil v\u00e4ga raske. Seet\u00f5ttu looge n\u00e4iteks lihtne rakendus. Otsime pilte, n\u00e4iteks kasse. Ainult et me ei otsi lihtsalt, vaid laiendame m\u00e4rks\u00f5nu ja kui kasutaja otsib 'kutsikaid', siis leiame me kassid, karvased ja muud. Esiteks peame saama taotluse andmed tagak\u00fcljel. See n\u00e4eb v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKaks rida v\u00f5imaldavad teil GET-parameetreid k\u00e4tte saada, ei mingeid raskusi. Edasi saame n\u00e4iteks andmebaasist m\u00e4rks\u00f5na ja laienduse tabelist selle teabe tavalise SQL-p\u00e4ringuga. K\u00f5ik on lihtne. See n\u00e4eb v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00dchendame raamatukogu <code>resty.mysql<\/code>, mis on meil juba komplektis. Me ei pea midagi installima, k\u00f5ik on valmis. N\u00e4itame, kuidas \u00fchenduda ja teeme SQL-p\u00e4ringu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSiin on natuke hirmutav, aga k\u00f5ik toimib. Siin on 10 \u2014 see on limiit. Me v\u00f5tame v\u00e4lja 10 kirjeid, me oleme laiskad, ei taha rohkem n\u00e4idata. SQLis unustasin ma limiidi.<\/p>\n<p>Edasi otsime pilte k\u00f5ikide p\u00e4ringute p\u00f5hjal. Kogume hunniku p\u00e4ringuid ja t\u00e4idame Lua-tabeli, mis on nimetatud <code>reqs<\/code>, ja teeme <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00f5ik need p\u00e4ringud l\u00e4hevad paralleelselt ja me saame vastused tagasi. T\u00f6\u00f6aeg on v\u00f5rdsustatud k\u00f5ige aeglasema vastuse ajaga. Kui k\u00f5ik meie p\u00e4ringud tuleb tagasi 50 millisekundi p\u00e4rast ja me saatsime sada p\u00e4ringut, siis saame vastuse 50 millisekundi p\u00e4rast.<\/p>\n<p>Kuna me oleme laiskad ja ei taha kirjutada HTTP t\u00f6\u00f6tlemist ja vahem\u00e4lu, siis paneme NGINX'i k\u00f5ike meie eest tegema. Nagu te n\u00e4gite, oli seal p\u00e4ring <code>url\/fetch<\/code>, see ongi:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTeeme lihtsa <code>proxy_pass<\/code>, n\u00e4itame, kuhu vahem\u00e4llu salvestada, kuidas seda teha, ja meil k\u00f5ik t\u00f6\u00f6tab.<\/p>\n<p>Aga sellest ei piisa, me peame ka andmed kasutajale andma. K\u00f5ige lihtsam m\u00f5te on see k\u00f5ik JSON'i seriaalida, lihtsalt, kahel reabil. Anname Content-Type, anname JSON'i.<\/p>\n<p>Aga on \u00fcks raskus: kasutaja ei taha lugeda JSON'i. Peame kaasama frontend arendajad. M\u00f5nikord ei taha me seda alguses teha. Ja SEO spetsialistid \u00fctlevad, et kui me otsime pilte, siis neil pole vahet. Aga kui me anname mingit sisu, siis nad \u00fctlevad, et meie otsingumootorid ei indekseeri midagi.<\/p>\n<p>Mida sellega teha? Loomulikult anname kasutajale HTML'i. K\u00e4si-k\u00e4es genereerimine ei ole cool, seega tahame kasutada malle. Selleks on olemas raamatukogu <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTe olete ilmselt n\u00e4inud kolme hirmutavat t\u00e4hte OPM. OpenResty tuleb oma pakihalduriga, mille kaudu saab paigaldada veel palju erinevaid mooduleid, sealhulgas <code>lua-resty-template<\/code>. See on lihtne malle engine, mis on sarnane Django mallidele. Seal saab kirjutada koodi ja teha muutujate asendusi.<\/p>\n<p>Tulemuseks on, et k\u00f5ik n\u00e4eb v\u00e4lja umbes nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMe v\u00f5tsime andmed ja renderdasime malli taas kahe reaga. Kasutaja on \u00f5nnelik, sai kassipojad. Kuna me laiendasime p\u00e4ringut, sai ta kassipoja koos merikassiga. Kes teab, v\u00f5ib-olla otsis ta just teda, aga ei osanud oma p\u00e4ringut \u00f5igesti formuleerida.<\/p>\n<p>K\u00f5ik on h\u00e4sti, aga me oleme arenduses ja ei taha veel kasutajatele n\u00e4idata. Tehkem autentimine. Selleks vaatame, kuidas NGINX t\u00f6\u00f6tleb p\u00e4ringut OpenResty m\u00f5istes:<\/p>\n<ul>\n<li>Esimene faas \u2014 <strong>access<\/strong>, kui kasutaja alles liitus ja me vaatame teda pealkirjade, IP-aadressi ja muude andmete kaudu. Saame ta kohe v\u00e4lja l\u00fclitada, kui ta meile ei meeldi. Seda saab kasutada autoriseerimiseks v\u00f5i kui saame liiga palju p\u00e4ringuid, saame neid h\u00f5lpsasti sellel etapil katkestada.<\/li>\n<li><strong>rewrite<\/strong>. Kirjutame m\u00f5ned p\u00e4ringu andmed \u00fcmber.<\/li>\n<li><strong>content<\/strong>. Anname sisu kasutajale.<\/li>\n<li><strong>pealkirjade filter<\/strong>. Muudame vastuse pealkirju. Kui oleme kasutanud <code>proxy_pass<\/code>, v\u00f5ime kirjutada m\u00f5ned pealkirjad \u00fcmber enne, kui anname need kasutajale.<\/li>\n<li><strong>sisu filter<\/strong>. Saame keha muuta.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 logimine. Saame kirjutada logisid elasticsearchi ilma lisa kihita.<\/li>\n<\/ul>\n<p>\nMeie autoriseerimine n\u00e4eb v\u00e4lja umbes nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nLisame selle sinna <code>asukoht<\/code>, mille me varem kirjeldasime, ja paneme sinna sellise koodi:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKontrollime, kas meil on k\u00fcpsise token. Kui ei, siis suuname autoriseerimise peale. Kasutajad on nutikad ja v\u00f5ivad arvata, et tuleb k\u00fcpsise token paigaldada. Seet\u00f5ttu paneme selle ka Redis'sse:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKood Redisega t\u00f6\u00f6tamiseks on v\u00e4ga lihtne ja ei erine teiste keeltest. Samuti on kogu sisend\/v\u00e4ljund seal ja siin mitteblokeeriv. Kui kirjutate s\u00fcnkrontkoodi, t\u00f6\u00f6tab see as\u00fcnkroonselt. Umbes nagu gevent, ainult h\u00e4sti tehtud.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeeme autoriseerimise:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u00dctleme, et peame lugema p\u00e4ringu keha. Saame POST-argumendid, kontrollime, kas kasutajanimi ja parool on \u00f5iged. Kui ei, siis suuname autoriseerimise peale. Ja kui on \u00f5iged, siis salvestame tokeni Redis'sse:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u00c4rge unustage seada k\u00fcpsist, see tehakse ka kahe reaga:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudetakse NGINX t\u00e4iustatud rakendusserveriks\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLihtne, teoreetiline n\u00e4ide. Me kindlasti ei tee teenust, mis n\u00e4itab inimestele kiisusid. Kuigi kes teab. Seet\u00f5ttu k\u00e4ime l\u00e4bi, mida saab teha tootmisprotsessis.<\/p>\n<ul>\n<li><strong>Minimalistlik backend<\/strong>. M\u00f5nikord vajame backend'ist vaid v\u00e4ga v\u00e4he andmeid: kuskil tuleb kuup\u00e4eva lisada, kuskil tuua v\u00e4lja mingi nimekiri, \u00f6elda, kui palju kasutajaid on praegu saidil, lisada loendaja v\u00f5i statistika. Midagi sarnast v\u00e4ikest. V\u00e4ikesed osad on v\u00e4ga kergesti teostatavad. Sellega saab kiirelt, lihtsalt ja suurep\u00e4raselt hakkama.\n<\/li>\n<li><strong>Andmete eelprotsessimine<\/strong>. Aegiatseme on meil soov sisestada oma lehe reklaami, ja selle saame API-p\u00e4ringutega. Seda saab siit v\u00e4ga lihtsalt teha. Me ei koorma oma tagak\u00fclge, mis samuti raskelt t\u00f6\u00f6tab. Me saame seda siin koguda. Saame kokku panna mingit JS-i v\u00f5i vastupidi, lahti v\u00f5tta ja midagi eelt\u00f6\u00f6delda enne, kui kasutajale v\u00e4lja anname.\n<\/li>\n<li><strong>Mikroteenuse liides<\/strong>. See on samuti v\u00e4ga hea lahendus, mida ma olen ellu viinud. Enne seda t\u00f6\u00f6tasin ettev\u00f5ttes Tenzor, mis tegeleb elektroonilise aruandlusega ja tagab aruandluse umbes poolele juriidilistele isikutele riigis. Me tegime teenuse, kus paljusid asju on tehtud sama mehhanismi abil: marsruutimine, autoriseerimine ja muud.<br \/>\nOpenResty't saab kasutada teie mikroteenuste liimimiseks, mis tagab \u00fchtse juurdep\u00e4\u00e4su k\u00f5igile ja \u00fchtse liidese. Kuna mikroteenused v\u00f5ivad olla kirjutatud nii, et siin on Node.js, seal on PHP, seal Python ja kuskil on t\u00fckk Erlang, m\u00f5istame, et me ei soovi sama koodi igale poole uuesti kirjutada. Seet\u00f5ttu saab OpenResty't paigutada ette.<\/p>\n<\/li>\n<li><strong>Statistika ja anal\u00fc\u00fcs<\/strong>. Tavaliselt on NGINX sissep\u00e4\u00e4sus ja k\u00f5ik p\u00e4ringud l\u00e4hevad l\u00e4bi selle. Just siin on v\u00e4ga mugav midagi kokku koguda. Saab kohe midagi v\u00e4lja arvutada ja kuhugi panna, n\u00e4iteks Elasticsearchisse, Logstashi v\u00f5i lihtsalt logisse kirja panna ja siis kuhugi saata.\n<\/li>\n<li><strong>Mitme kasutaja s\u00fcsteemid<\/strong>. N\u00e4iteks, online-m\u00e4nge on samuti v\u00e4ga h\u00e4sti teha. T\u00e4na r\u00e4\u00e4gib Kaplinnas Alexander Gladys, kuidas kiiresti protot\u00fc\u00fcpida mitme m\u00e4ngijaga m\u00e4ngu OpenResty abil.\n<\/li>\n<li><strong>P\u00e4ringute filtreerimine (WAF)<\/strong>. Praegu on moes teha erinevaid veebi rakenduste tulem\u00fc\u00fcre, on palju teenuseid, mis neid pakuvad. OpenResty abil saate enda jaoks luua veebi rakenduste tulem\u00fc\u00fcri, mis lihtsalt ja kergesti filtreerib p\u00e4ringud vastavalt teie n\u00f5udmistele. Kui teil on Python, siis m\u00f5istate, et PHP't ei saa kindlasti sisse s\u00fcstida, kui te, muidugi, ei spawnida seda kuskil konsoolist. Teate, et teil on MySQL ja Python. T\u00f5en\u00e4oliselt v\u00f5ivad siin proovida teha mingit katalooge l\u00e4bivat r\u00fcnnakut ja midagi sisestada andmebaasi. Seet\u00f5ttu saab kahtlased p\u00e4ringud kiiresti ja odavalt kohe ees filtrida.\n<\/li>\n<li><strong>Kogukond.<\/strong> Kuna OpenResty on \u00fcles ehitatud NGINX-i baasil, on sellel boonus - see <strong>NGINXi kogukond<\/strong>See on v\u00e4ga suur ja enamik alguses tekkida v\u00f5ivaid k\u00fcsimusi on juba lahendatud NGINX-i kogukonna poolt.\n<p><strong>Lua arendajad<\/strong>Eile r\u00e4\u00e4kisin poistega, kes tulid HighLoad++ \u00f5ppep\u00e4evale, ja kuulsin, et ainult Tarantool on kirjutatud Luas. See pole t\u00f5si, Luas on kirjutatud palju. N\u00e4iteks: OpenResty, XMPP-server Prosody, m\u00e4ngumootor Love2D, Lua skripteeritakse Warcraftis ja mujal. Lua arendajaid on palju ning neil on suur ja vastutulelik kogukond. K\u00f5ik minu k\u00fcsimused Lua kohta lahendati paaritunniga. Kui kirjutad meililistile, saad sisuliselt m\u00f5ne minuti jooksul hulga vastuseid, kus seletatakse, kuidas ja mis toimub. See on t\u00f5eliselt suurep\u00e4rane. Kahjuks pole igal pool nii lahke ja abivalmis kogukonda.<br \/>\nOpenResty kohta on olemas GitHub, kus saab avada probleemide pilet, kui midagi on katki. On olemas meililist Google Groupsis, kus saab arutada \u00fcldisi k\u00fcsimusi, samuti on olemas hiinakeelne meililist - \u00e4kki sul ei ole inglise keeles oskusi, aga hiina keeles on.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Summary<\/h1>\n<p><\/p>\n<ul>\n<li>Loodan, et suutsin edastada, et OpenResty on v\u00e4ga mugav raamistik, mis on suunatud veebile dem.<\/li>\n<li>Sellel on madal sisenemisk\u00fcnnis, kuna kood sarnaneb sellele, millega me kirjutame, keel on \u00fcsna lihtne ja minimalistlik.<\/li>\n<li>See pakub as\u00fcnkroonset I\/O ilma callback'ideta, meil ei tule segadust nagu vahel NodeJS-is kirjutades.<\/li>\n<li>Sellel on lihtne kasutusele v\u00f5tmine, kuna meil on vaja ainult NGINX-i koos vajaliku mooduliga ja meie kood, ja k\u00f5ik t\u00f6\u00f6tab kohe.<\/li>\n<li>Suur ja vastutulelik kogukond.<\/li>\n<\/ul>\n<p>\nMa ei r\u00e4\u00e4kinud \u00fcksikasjalikult marsruutimisest, see oleks saanud v\u00e4ga pikk jutustus.<\/p>\n<p>Ait\u00e4h t\u00e4helepanu eest!<\/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=\"M\u00e4ngi videot\" 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: muudame NGINX-i t\u00e4ielikuks rakenduste serveriks<\/a><\/noindex><\/em><br \/>\n<br \/>Allikas: <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.1.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\/et\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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: muudame NGINX-i t\u00e4ielikuks rakenduste serveriks | ProHoster","description":"Avaldame taas \u00fclevaate.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}