{"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: muudame NGINX t\u00e4ielikuks rakenduste serveriks","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Avaldame taas konverentsi ettekande kokkuv\u00f5tte <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, mis toimus Moskva oblastis Skolkovo 7\u20138 novembril m\u00f6\u00f6dunud aastal. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protassov<\/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 Protassov, t\u00f6\u00f6tan Parallelsis. R\u00e4\u00e4gin natuke endast. Oma elust kolm neljandikku olen kirjutanud koodi. Olen saanud programmi kirjutajaiks luude ja lihaste, isegi unes n\u00e4en koodi. \u00dcks neljandik elust on t\u00f6\u00f6stuslik arendus, koodi kirjutamine, mis l\u00e4heb otse tootmisse. Kood, mida m\u00f5ned teist kasutavad, aga ei kahtlegi selles.<\/p>\n<p>Ette m\u00f5istaks, kui halb see k\u00f5ik oli. Kui ma olin noor algaja, tulin ma siia ja mulle anti \u00fcle kaheterabaidised andmebaasid. N\u00fc\u00fcd on siin k\u00f5igil highload. K\u00e4isin konverentsidel ja k\u00fcsisin: \"Kuttid, r\u00e4\u00e4kige, teil on big data, k\u00f5ik on lahe? Kui palju teil seal andmebaasi on?\" Nad vastasid: \"Meil on 100 gigabaiti!\" Ma m\u00f5tlesin: \"Lahe, 100 gigabaiti!\" Kuid samas m\u00f5tlesin, kuidas oma n\u00e4gu mitte reeta. Arvad, et jah, poisid on \u00e4gedad, ja siis tuled tagasi ning tegeled nende mitme terabaidisete andmebaasidega. Ja see oli siis, kui olin algaja. Kas suudate ette kujutada, kui suur see \u0161okk oli?<\/p>\n<p>Ma oskan rohkem kui 20 programmeerimiskeelt. See on midagi, millega pidin t\u00f6\u00f6s tegelema. Sulle antakse kood Erlangis, C-s, C++-s, Luas, Pythoni, Ruby v\u00f5i millegi muu peal, ja siis pead sa sellega k\u00f5ik hakkama saama. Kokkuv\u00f5ttes tuli sellega tegeleda. T\u00e4pselt arvestada ei \u00f5nnestunud, aga number kadus kuskil 20 juurde.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKuna k\u00f5ik kohal viibijad teavad, mis on Parallels ja millega me tegeleme, ei hakka ma r\u00e4\u00e4kima, kui lahedad me oleme v\u00f5i mida teeme. \u00dctlen ainult, et meil on 13 kontorit \u00fclemaailmselt, \u00fcle 300 t\u00f6\u00f6taja, arendus Moskvas, Tallinnas ja Maltal. Soovi korral v\u00f5ib minna ja kolida Maltale, kui talvel on k\u00fclm ja on vaja sooja saada.<\/p>\n<p>Konkreetne meie osakond kirjutab Python 2-ga. Me tegeleme \u00e4ri k\u00fcsimustega ja meil ei ole aega moetehnoloogiate rakendamiseks, seega kannatame. Meil on Django, sest see sisaldab k\u00f5ike vajalikku, ning k\u00f5ik liigne oleme v\u00e4lja visanud. Samuti MySQL, Redis ja NGINX. Meil on ka palju muid huvitavaid asju. Meil on MongoDB, meil jooksevad k\u00fc\u00fclikud, meil on k\u00f5ik v\u00f5imalik - aga see ei ole minu valdkond ja ma ei tegele sellega.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nOma kohta r\u00e4\u00e4kisin. Vaatame, millest ma t\u00e4na r\u00e4\u00e4gin:<\/p>\n<ul>\n<li>Mis on OpenResty ja milleks seda kasutatakse?<\/li>\n<li>Miks leiutada veel \u00fcks ratta, kui meil on Python, NodeJS, PHP, Go ja muud vinged asjad, millega k\u00f5ik rahul on?<\/li>\n<li>Ja natuke elulisi n\u00e4iteid. Mul tuli oma ettekannet tugevalt l\u00fchendada, sest see venis 3,5 tunniseks, seega n\u00e4iteid j\u00e4\u00e4b v\u00e4heks.<\/li>\n<\/ul>\n<p>\nOpenResty \u2014 see NGINX. T\u00e4nu sellele on meil t\u00e4ielik veebiserver, mis on h\u00e4sti kirjutatud ja t\u00f6\u00f6tab kiiresti. Arvan, et enamus meist kasutab NGINX-i tootmisre\u017eiimis. Te k\u00f5ik teate, et see on kiire ja \u00e4ge. Selles on tehtud suurep\u00e4rane s\u00fcnkroonne sisend\/v\u00e4ljund, seega ei pea me midagi leiutama nagu Pythonis, kus on leiutatud gevent. Gevent on \u00e4ge, t\u00f5eliselt hea, kuid kui kirjutate C koodi ja midagi l\u00e4heb valesti, siis saate geventi debugeerides hulluks. Mul oli selline kogemus: v\u00f5ttis lausa kaks p\u00e4eva, et aru saada, mis tegelikult valesti l\u00e4ks. Kui keegi poleks eelnevalt paar n\u00e4dalat uurinud, probleemile j\u00e4lile j\u00f5udnud, Internetis kirjutama hakanud ning Google ei oleks seda leidnud, siis oleksime t\u00e4ielikult hullu l\u00e4inud.<\/p>\n<p>NGINX sisaldab juba vahem\u00e4lu ja staatilist sisu. Te ei pea muretsema, kuidas seda \u00f5igesti teha, et see kuskil ei viivitu ja te ei kaotaks descriptor\u2019e. Nginx'i seadistamine on v\u00e4ga mugav, teil ei pea olema mures, mida valida - WSGI, PHP-FPM, Gunicorn v\u00f5i Unicorn. Nginx on paigaldatud, adminnid saavad temaga hakkama, nad teavad, kuidas sellega t\u00f6\u00f6tada. Nginx t\u00f6\u00f6tleb p\u00e4ringuid struktureeritult. R\u00e4\u00e4gin sellest veidi hiljem. L\u00fchidalt, sellel on faas, kus ta v\u00f5tab vastuvaate, siis t\u00f6\u00f6tleb ja seej\u00e4rel edastab sisu kasutajale.<\/p>\n<p>Nginx on suurep\u00e4rane, kuid \u00fcks probleem on: see ei ole piisavalt paindlik isegi k\u00f5igi nende lahedate funktsioonide juures, mida on konfi sisse ehitatud. Sellest v\u00f5imsusest j\u00e4\u00e4b puudu. Seet\u00f5ttu integreerisid Taobao arendajad umbes seitse aastat tagasi sinna Lua. Mis see annab?<\/p>\n<ul>\n<li><strong>Suurus<\/strong>. See on v\u00e4ike. LuaJIT p\u00f5hjustab umbes 100-200 kilobaiti m\u00e4lu \u00fclekulu ja minimaalset j\u00f5udluse \u00fclekulu.<\/li>\n<li><strong>Kiirus<\/strong>. LuaJIT interpretator on paljuski sarnane C-le, m\u00f5nel juhul kaotab Java'le ja m\u00f5nel juhul aga juba saavutab samasuguseid tulemusi. \u00dche perioodi jooksul peeti seda tipptasemel lahenduseks, parimaks JIT-kompileerijaks. N\u00fc\u00fcd on olemas paremusi, kuid need on v\u00e4ga rasked, n\u00e4iteks V8. M\u00f5ned JavaScripti t\u00f5lgendid ja Java HotSpot on m\u00f5nes punktis kiirem, aga teistes kohtades j\u00e4\u00e4vad nad endiselt alla.<\/li>\n<li><strong>Lihtsus \u00f5ppimisel<\/strong>. Kui teil on n\u00e4iteks Perl-koodibaas ja te pole Booking, siis ei leia te Perl programmeerijaid. Sest neid pole, k\u00f5ik on kadunud ja nende \u00f5petamine v\u00f5tab kaua aega. Kui soovite programmeerijaid m\u00f5nel teisel platvormil, peate neid v\u00f5ib-olla ka \u00fcmber \u00f5petama v\u00f5i leidma. Lua puhul on k\u00f5ik lihtne. Lua on igale algajale kolme p\u00e4evaga selge. Mul kulus umbes kaks tundi, et aru saada. Kahe tunni p\u00e4rast juba kirjutasin tootmisfailidesse. Umbes n\u00e4dala p\u00e4rast l\u00e4ks see t\u00f5eliselt tootmisse.<\/li>\n<\/ul>\n<p>\nTulemuseks n\u00e4eb see v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSiin on palju asju. OpenResty on koondanud palju mooduleid, nii Lua mooduleid kui ka nginx mooduleid. K\u00f5ik on valmis \u2014 laadi \u00fcles ja t\u00f6\u00f6tab.<\/p>\n<h1>N\u00e4ited<\/h1>\n<p>\nPiisavalt luulest, liikuge koodi juurde. Siin on v\u00e4ike Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMida siit leida v\u00f5ib? See on NGINX'i asukoht. Me ei muretse, ei kirjuta oma marsruute, ei v\u00f5ta mingit valmis varianti \u2013 meil on juba NGINX'is, me elame h\u00e4sti ja laiskalt.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 see on plokk, mis \u00fctleb, et anname sisu edasi Lua-skriptiga. V\u00f5tame NGINX'i muutuja <code>remote_addr<\/code> ja sisestame selle <code>string.format<\/code>. See on sama, mis <code>sprintf<\/code>, ainult Lua's, ainult korrektne. Ja anname kliendile edasi.<\/p>\n<p>Tulemuseks n\u00e4eb see v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAga naaseme reaalsesse maailma. Tooteversioonile ei t\u00f5steta \u00fcles Hello World'i. Meie rakendus k\u00e4ib tavaliselt andmebaasi v\u00f5i mujale ja veedab suure osa ajast vastust oodates.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLihtsalt istub ja ootab. See ei ole k\u00f5ige parem. Kui tuleb 100 000 kasutajat, on meil v\u00e4ga raske. Seega loome n\u00e4itena lihtsa rakenduse. Otsime pilte, n\u00e4iteks kasse. Kuid me ei otsi lihtsalt, vaid laiendame otsingus\u00f5nu ja kui kasutaja otsib 'kutsikaid', siis leiame talle kasse, karvaseid ja muud. Esiteks peame saama taotluse andmed tagaplaanil. See n\u00e4eb v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKaks rida v\u00f5imaldavad sul h\u00f5lpsasti GET-parameetreid hankida, mingeid komplikatsioone pole. Edasi saame n\u00e4iteks andmebaasist v\u00f5tme ja laiendi p\u00f5hjal selle info tavalise SQL-p\u00e4ringuga. K\u00f5ik on lihtne. See n\u00e4eb v\u00e4lja selline:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" 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 meil juba komplektis on. 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: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSiin on natuke hirmutav, kuid k\u00f5ik t\u00f6\u00f6tab. Siin 10 \u2013 see on piirang. Me saame 10 rekordit, oleme laisad, ei taha rohkem n\u00e4idata. SQL-is unustasin ma piirangust.<\/p>\n<p>Edasi otsime pilte k\u00f5igi p\u00e4ringute jaoks. Me kogume hulga p\u00e4ringuid ja t\u00e4idame Lua-tabeli, mis kannab nime <code>reqs<\/code>, ja teeme <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00f5ik need p\u00e4ringud saadetakse paralleelselt, ja me saame vastused tagasi. T\u00f6\u00f6aeg on v\u00f5rdsustatud k\u00f5ige aeglasema vastuse ajaga. Kui k\u00f5ik l\u00e4hevad v\u00e4lja 50 millisekundi jooksul ja me saatsime sada p\u00e4ringut, siis saab vastus meieni 50 millisekundi jooksul.<\/p>\n<p>Kuna me oleme laisad ja ei taha kirjutada HTTP t\u00f6\u00f6tlemist ja vahem\u00e4lu, paneme NGINX-i meie eest k\u00f5ike tegema. Kuidas n\u00e4gite, seal oli p\u00e4ring <code>url\/fetch<\/code>, see ongi:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTeeme lihtsa <code>proxy_pass<\/code>, me seame, kuhu vahem\u00e4lu salvestada, kuidas seda teha, ja meil on k\u00f5ik t\u00f6\u00f6tab.<\/p>\n<p>Aga sellest ei piisa, me peame veel andmed kasutajale edastama. Lihtsaim m\u00f5te on k\u00f5ik seriseerida JSON formaati, lihtsalt, kahel real. Edastame Content-Type, edastame JSON.<\/p>\n<p>Aga on \u00fcks keerukus: kasutaja ei taha JSONi lugeda. Tuleb meelitada frontend-arendajaid. M\u00f5nikord ei taha me seda kohe teha. Ja SEO spetsialistid \u00fctlevad, et kui me otsime pilte, siis see ei ole nende jaoks oluline. Aga kui me anname neile mingit sisu, siis nad \u00fctlevad, et meie otsijad ei indekseeri midagi.<\/p>\n<p>Mida sellega teha? Loomulikult anname kasutajale HTMLi. K\u00e4sitsi genereerimine ei ole mugav, seega tahame kasutada malli. Selleks on olemas teek <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTe olete ilmselt n\u00e4inud kolme kohutavat t\u00e4hte OPM. OpenResty tuleb koos oma paketihalduriga, kust saab paigaldada veel hulk erinevaid mooduleid, sealhulgas <code>lua-resty-template<\/code>. See on lihtne mallimootor, mis on sarnane Django mallidele. Seal saab kirjutada koodi ja teha muutujate asendusi.<\/p>\n<p>Kokkuv\u00f5ttes n\u00e4eb k\u00f5ik v\u00e4lja umbes nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMe kogusime andmed ja genereerisime malli taas kahe reana. Kasutaja on rahul, sai kassipojad. Kuna me laiendasime p\u00e4ringut, sai ta kassipoegade lisaks ka merikassi. Kes teab, v\u00f5ib-olla otsis ta just seda, kuid ei osanud k\u00fcsida.<\/p>\n<p>K\u00f5ik on suurep\u00e4rane, aga me oleme ju arenduses ega soovi veel kasutajatele n\u00e4idata. Teeme autentimise. Selleks vaatame, kuidas NGINX k\u00e4sitleb p\u00e4ringut OpenResty m\u00f5istes:<\/p>\n<ul>\n<li>Esimene faas\u00a0\u2014 <strong>access<\/strong>, kui kasutaja alles saabus ja me vaatasime teda p\u00e4iste, IP-aadressi ja muude andmete j\u00e4rgi. Saame kohe v\u00e4lja l\u00fclitada, kui ta meile ei meeldi. Seda saab kasutada autentimiseks v\u00f5i kui me saame v\u00e4ga palju p\u00e4ringuid, saame neid kergesti selles faasis katkestada.<\/li>\n<li><strong>rewrite<\/strong>. Kirjutame m\u00f5ningaid p\u00e4ringu andmeid \u00fcmber.<\/li>\n<li><strong>content<\/strong>. Anname kasutajale sisu.<\/li>\n<li><strong>headers filter<\/strong>. Asendame vastuse p\u00e4iseid. Kui oleme kasutanud <code>proxy_pass<\/code>, saame m\u00f5ningaid p\u00e4iseid \u00fcle kirjutada enne, kui kasutajale edastame.<\/li>\n<li><strong>body filter<\/strong>. Saame keha asendada.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 logimine. Saame kirjutada logisid elasticsearchi ilma t\u00e4iendava kihita.<\/li>\n<\/ul>\n<p>\nMeie autentimise protsess n\u00e4eb v\u00e4lja umbes nii:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nLisame selle <code>asukohta<\/code>, mille me eelnevalt kirjeldasime, ja paneme sinna j\u00e4rgmise koodi:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKontrollime, kas meil on cookie token. Kui ei ole, suuname autentimisele. Kasutajad on leidlikud ja v\u00f5ivad aimata, et tuleb seada cookie token. Seet\u00f5ttu salvestame selle ka Redis-sse:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKood Redis-i kasutamiseks on v\u00e4ga lihtne ja ei erine teistest keeltest. K\u00f5ik sisend\/v\u00e4ljastus seal ja siin ei ole blokeeriv. Kui kirjutate s\u00fcnkroonselt, t\u00f6\u00f6tab see as\u00fcnkroonselt. Umbes nagu gevent, ainult et h\u00e4sti teostatud.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeeme n\u00fc\u00fcd autentimise:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u00dctleme, et meil on vaja lugeda p\u00e4ringu keha. Saame POST-argumendid, kontrollime, et kasutajanimi ja parool on \u00f5iged. Kui need on vale, suuname autentimisele. Kui need on \u00f5iged, salvestame tokeni Redis-sse:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u00c4rge unustage seada cookie-it, see tehakse ka kahe reaga:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: muudame NGINX t\u00e4ielikuks rakenduste serveriks\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e4ide on lihtne ja teoreetiline. Me ei plaani teenust, mis n\u00e4itab inimestele kasside fotosid. Kuigi kes teab. Seet\u00f5ttu vaatame, mida saame tootmises teha.<\/p>\n<ul>\n<li><strong>Minimalistlik tagaplaan<\/strong>. Aeg-ajalt on meil vaja backend'ile anda vaid natuke andmeid: kuskil tuleb kuup\u00e4ev sisestada, kuskil peab mingi nimekiri v\u00e4lja tooma, \u00f6elda, kui palju kasutajaid on praegu saidil, kinnitada loendur v\u00f5i statistika. Midagi niisugust. V\u00e4iksemaid t\u00fckke on v\u00e4ga lihtne teha. Nii saab kiiresti, lihtsalt ja suurep\u00e4raselt hakkama.\n<\/li>\n<li><strong>Andmete eelt\u00f6\u00f6tlemine<\/strong>. Aeg-ajalt soovime oma lehek\u00fcljele reklaami lisada, ja seda reklaami me v\u00f5tame API-p\u00e4ringutega. Sellist on siinkohal v\u00e4ga lihtne teha. Me ei koorma oma backend'it, mis juba niigi raskelt t\u00f6\u00f6tab. Saame seda lihtsalt kokku panna. Saame luua m\u00f5ningaid JS-e v\u00f5i vastupidi, lahti v\u00f5tta, midagi eelt\u00f6\u00f6tleda enne, kui kasutajale edastame.\n<\/li>\n<li><strong>Mikroteenuse fassaad<\/strong>. See on samuti v\u00e4ga hea juhtum, mille ma ise ellu viisin. Enne seda t\u00f6\u00f6tasin firmas Tenzor, mis tegeleb elektroonilise arvestuse ja tagab aruandluse umbes poolele juriidilistele isikutele riigis. Meie l\u00f5ime teenuse, kus selle sama mehhanismi abil on tehtud palju asju: marsruutimine, autoriseerimine ja muu.<br \/>\nOpenResty on ideaalne liim teie mikroteenuste jaoks, pakkudes \u00fchtset juurdep\u00e4\u00e4su ja liidest. Kuna mikroteenused v\u00f5ivad olla kirjutatud erinevates keeltes, nagu Node.js, PHP, Python ja isegi Erlang, soovime v\u00e4ltida koodi korduvat kirjutamist erinevates kohtades. Seet\u00f5ttu saab OpenResty paigutada esik\u00fcljele.<\/p>\n<\/li>\n<li><strong>Statistika ja anal\u00fc\u00fctika<\/strong>. \u00dcldiselt t\u00f6\u00f6tab NGINX sisendisse, ja k\u00f5ik p\u00e4ringud l\u00e4hevad selle kaudu. Just siin on mugav kokku koguda. Saame kohe midagi arvutada ja saata n\u00e4iteks Elasticsearchi, Logstashi v\u00f5i lihtsalt salvestada logisse ja hiljem mujale edastada.\n<\/li>\n<li><strong>Mitme kasutaja s\u00fcsteemid<\/strong>. N\u00e4iteks online-m\u00e4ngude loomine on samuti v\u00e4ga t\u00f5hus. T\u00e4na Cape Townis r\u00e4\u00e4gib Alexander Gladish, kuidas kiiresti protot\u00fc\u00fcpida mitme kasutajaga m\u00e4ngu OpenRestyi abil.\n<\/li>\n<li><strong>P\u00e4ringute filtreerimine (WAF)<\/strong>. Praegu on moes kasutada erinevaid veebirakenduste tulem\u00fc\u00fcre, neid pakuvad mitmed teenused. OpenResty abil saate luua enda veebirakenduste tulem\u00fc\u00fcri, mis filtreerib p\u00e4ringud teie n\u00f5udmiste j\u00e4rgi lihtsalt ja mugavalt. Kui teil on Python, siis m\u00f5istate, et PHP ei saa kindlasti manustada, kui te seda konsoolis kuskil ei esitata. Te teate, et teil on MySQL ja Python. T\u00f5en\u00e4oliselt v\u00f5idakse siin proovida m\u00f5nda katalogi\u00fcleminekut ja midagi andmebaasi manustada. Seet\u00f5ttu saab kahtlased p\u00e4ringud kiiresti ja odavalt filtreerida otse eesliinil.\n<\/li>\n<li><strong>\u00dchendus.<\/strong> Kuna OpenResty p\u00f5hineb NGINX-il, siis on tal eelis \u2014 see <strong>NGINX-i kogukond<\/strong>. See on v\u00e4ga suur ning suurem osa k\u00fcsimusi, mis v\u00f5ivad teil alguses tekkida, on juba NGINX-i kogukonna poolt lahendatud.\n<p><strong>Lua-arendajad<\/strong>. Eile r\u00e4\u00e4kisin kolleegidega, kes osalesid HighLoad++ \u00f5ppep\u00e4eval, ja kuulsin, et ainult Tarantool on kirjutatud Lua-s. See ei ole t\u00f5si, Lua-s on palju rohkem asju. N\u00e4iteks: OpenResty, XMPP-server Prosody, m\u00e4ngumootor Love2D, Lua scriptide kirjutamine Warcraftis ja mujal. Lua arendajaid on palju, nende kogukond on suur ja abivalmis. K\u00f5ik mu k\u00fcsimused Lua kohta lahendati m\u00f5ne tunni jooksul. Kui kirjutan postitusloendisse, saab juba m\u00f5ne minutiga hulgaliselt vastuseid, kus seletatakse, mis ja kuidas. See on t\u00f5eliselt suur asi. Kahjuks ei ole igal pool nii sooja ja avatud kogukonda.<br \/>\nOpenResty kohta on GitHub, seal saab avada issue, kui midagi katki l\u00e4heb. On olemas postitusloend Google Groups'is, kus saab arutada \u00fcldisi k\u00fcsimusi, ja on ka hiinakeelne postitusloend \u2014 v\u00f5ib-olla ei valda te inglise keelt, aga hiina keel on tuttav.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Kokkuv\u00f5te<\/h1>\n<p><\/p>\n<ul>\n<li>Loodan, et suutsin edastada, et OpenResty on v\u00e4ga mugav raamistik, mis on loodud veebi jaoks.<\/li>\n<li>Sellel on madal sissejuhatuse k\u00fcnnis, kuna kood sarnaneb sellega, millega me kirjutame, keel on \u00fcsna lihtne ja minimalistik.<\/li>\n<li>See pakub as\u00fcnkroonset I\/O ilma callback'ideta, meil ei ole h\u00f5lpu, nagu me m\u00f5nikord kirjutame NodeJS-is.<\/li>\n<li>Tegutseme kiiresti, kuna vajame ainult NGINX-i koos vajaliku mooduliga ja meie koodi ning k\u00f5ik t\u00f6\u00f6tab kohe.<\/li>\n<li>Suur ja aktiivne kogukond.<\/li>\n<\/ul>\n<p>\nMa ei ole \u00fcksikasjalikult selgitanud, kuidas marsruutimine toimub; see osutus liiga pikaks jutuks.<\/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=\"Vaata 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 \u2014 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 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\/et\/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=\"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 \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\/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 uuesti konverentsi HighLoad++ 2016 ettekande transkriptsiooni, mis toimus mullu 7.\u20138. novembril Moskva piirkonnas Skolkovo. Vladimir Protasov r\u00e4\u00e4gib, kuidas laiendada NGINX-i funktsionaalsust OpenResty ja Lua abil. Tere k\u00f5igile, mina olen Vladimir Protasov, t\u00f6\u00f6tan Parallelsis. R\u00e4\u00e4gin natuke endast. Kolm neljandikku oma elust olen ma veetnud koodi kirjutades. Hakkasin","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 \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\/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"},"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}]}}