{"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\/no\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Vi publiserer igjen transkripsjonen av foredraget fra konferansen <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, som fant sted i Skolkovo utenfor Moskva 7-8. november i fjor. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> snakker om hvordan man kan utvide funksjonaliteten til NGINX ved hjelp av OpenResty og Lua.<\/em><\/p>\n<p>Hei alle sammen, jeg heter Vladimir Protasov, og jeg jobber i Parallels. Jeg vil fortelle litt om meg selv. I tre fjerdedeler av livet mitt har jeg drevet med koding. Jeg ble programmerer til beinet, i ordets rette forstand: noen ganger dr\u00f8mmer jeg om kode. Den siste fjerdedelen av livet er industriell utvikling, skriving av kode som g\u00e5r direkte i produksjon. Koden som noen av dere bruker, men som dere ikke er klar over.<\/p>\n<p>For \u00e5 gi dere et inntrykk av hvor d\u00e5rlig det var. Da jeg var en ung junior, kom jeg inn i selskapet, og de ga meg s\u00e5nne to terabyte databaser. Det er n\u00e5 alle her har highload. Jeg var p\u00e5 konferanser, spurte: \u00abHei, fortell meg, har dere big data, er det kult? Hvor mye har dere i databasene?\u00bb De svarte: \u00abVi har 100 gigabyte!\u00bb Jeg sa: \u00abKult, 100 gigabyte!\u00bb Men tenkte for meg selv, hvordan jeg skulle beholde pokerfjeset. Du tenker, ja, disse folkene er kule, og s\u00e5 g\u00e5r du tilbake og sysler med disse multi-terabyte databasene. Og dette varer \u2014 det er \u00e5 v\u00e6re junior. Kan dere forestille dere hvilket slag det er?<\/p>\n<p>Jeg kan mer enn 20 programmeringsspr\u00e5k. Det er noe jeg m\u00e5tte l\u00e6re meg underveis i jobben. Du f\u00e5r kode i Erlang, C, C++, Lua, Python, Ruby, og noe annet, og s\u00e5 m\u00e5 du bare jobbe med det. Det var n\u00f8dvendig. Det eksakte antallet ble jeg ikke i stand til \u00e5 telle, men jeg mistet tellingen etter 20.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSiden alle tilstedev\u00e6rende vet hva Parallels er, og hva vi gj\u00f8r, skal jeg ikke g\u00e5 inn p\u00e5 hvor kule vi er eller hva vi gj\u00f8r. Jeg vil bare si at vi har 13 kontorer over hele verden, mer enn 300 ansatte, utvikling i Moskva, Tallinn, og p\u00e5 Malta. Hvis \u00f8nskelig kan du faktisk flytte til Malta hvis det er kaldt om vinteren og du trenger \u00e5 varme ryggen.<\/p>\n<p>V\u00e5r avdeling skriver konkret i Python 2. Vi driver med virksomhet, og vi har ikke tid til \u00e5 implementere trendy teknologier, s\u00e5 vi lider. Vi bruker Django fordi den har alt, og vi kastet det un\u00f8dvendige. Ogs\u00e5 MySQL, Redis, og NGINX. I tillegg har vi mange andre kule ting. Vi har MongoDB, vi har kaniner som l\u00f8per rundt, vi har s\u00e5 mye rart \u2014 men det er ikke mitt ansvar, og jeg driver ikke med det.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nJeg har snakket om meg selv. La oss finne ut hva jeg skal snakke om i dag:<\/p>\n<ul>\n<li>Hva er OpenResty og hva kan man bruke det til?<\/li>\n<li>Hvorfor oppfinne et nytt hjul n\u00e5r vi allerede har Python, NodeJS, PHP, Go og andre kule ting som alle er forn\u00f8yde med?<\/li>\n<li>Og noen eksempler fra virkeligheten. Jeg m\u00e5tte kutte kraftig ned p\u00e5 presentasjonen min fordi den ble p\u00e5 3,5 timer, s\u00e5 derfor vil det bli f\u00e5 eksempler.<\/li>\n<\/ul>\n<p>\nOpenResty er NGINX. Takket v\u00e6re det har vi en fullt fungerende webserver som er godt skrevet og fungerer raskt. Jeg tror de fleste av oss bruker NGINX i produksjon. Alle vet at den er rask og fantastisk. Den har en imponerende synkron inn\/-utdata, s\u00e5 vi trenger ikke \u00e5 finne opp kruttet p\u00e5 nytt som i Python med gevent. Gevent er fantastisk, men hvis du skriver C-kode, og noe g\u00e5r galt, kan du bli gal av \u00e5 debugge det med gevent. Jeg har erfaring: det tok meg hele to dager \u00e5 finne ut hva som gikk galt. Hvis noen ikke hadde gravd i det i flere uker, ikke funnet problemet, ikke skrevet om det p\u00e5 nettet, og Google ikke hadde funnet det, hadde vi blitt spr\u00f8.<\/p>\n<p>I NGINX er caching og statisk innhold allerede implementert. Du trenger ikke \u00e5 bekymre deg for hvordan du kan gj\u00f8re dette p\u00e5 en ordentlig m\u00e5te, slik at det ikke henger seg opp noe sted, eller at du mister filbeskrivere. NGINX er veldig lett \u00e5 deployere, du trenger ikke \u00e5 tenke p\u00e5 hva du skal bruke \u2013 WSGI, PHP-FPM, Gunicorn, Unicorn. Du installerer NGINX, gir det til administratorene, de vet hvordan de skal h\u00e5ndtere det. NGINX behandler foresp\u00f8rslene strukturert. Jeg skal si litt mer om dette senere. Kort sagt, den har en fase der den nettopp har mottatt foresp\u00f8rselen, en fase der den har behandlet den, og en fase der den leverer innholdet til brukeren.<\/p>\n<p>NGINX er flott, men det er ett problem: den er ikke fleksibel nok, selv med alle de kule funksjonene som folk har puttet inn i konfigurasjonen, til tross for at den kan konfigureres. Denne kraften er ikke tilstrekkelig. Derfor bygde folk fra Taobao for mange \u00e5r siden, omtrent \u00e5tte \u00e5r siden, Lua inn i den. Hva gir det?<\/p>\n<ul>\n<li><strong>St\u00f8rrelse<\/strong>. Den er liten. LuaJIT gir omtrent 100-200 kilobyte overhead i minne og minimal overhead i ytelse.<\/li>\n<li><strong>Hastighet<\/strong>. LuaJIT-tolkeren er i mange situasjoner n\u00e6rt C, i noen situasjoner taper den mot Java, og i andre overg\u00e5r den den. En stund ble den ansett som state of the art, den mest imponerende JIT-kompilatoren. N\u00e5 finnes det mer imponerende, men de er veldig tunge, som for eksempel V8. Noen JavaScript-tolker og Java HotSpot kan v\u00e6re raskere i enkelte tilfeller, men i andre tilfeller taper de fortsatt.<\/li>\n<li><strong>Enkel \u00e5 l\u00e6re<\/strong>. Hvis du har et kodebase i Perl, og du ikke er Booking, vil du ikke finne Perl-programmerere. Fordi de ikke finnes; de har blitt alle tatt, og det tar lang tid \u00e5 l\u00e6re dem. Hvis du vil ha programmerere p\u00e5 noe annet, m\u00e5 du kanskje ogs\u00e5 l\u00e6re dem p\u00e5 nytt eller finne dem. N\u00e5r det gjelder Lua, er det enkelt. Enhver nybegynner kan l\u00e6re Lua p\u00e5 tre dager. Jeg brukte omtrent to timer p\u00e5 \u00e5 forst\u00e5 det. Etter to timer skrev jeg allerede kode i produksjon. Omtrent en uke senere var det allerede i produksjon.<\/li>\n<\/ul>\n<p>\nSom et resultat ser det slik ut:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDet er mye her. I OpenResty har de samlet en haug med moduler, b\u00e5de Lua-baserte og engine-moduler. Og alt er klart \u2014 jeg har deployert det, og det fungerer.<\/p>\n<h1>Eksempler<\/h1>\n<p>\nNok med lyrikk, la oss g\u00e5 til koden. Her er en liten Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHva er her? Dette er en engine-lokasjon. Vi bryr oss ikke, vi skriver ikke v\u00e5r egen routing, vi tar ikke noe klart \u2014 vi har allerede det i NGINX, vi lever godt og lat.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 dette er en blokk som sier at vi leverer innhold ved hjelp av et Lua-skript. Vi tar engine-variabelen <code>remote_addr<\/code> og setter den inn i <code>string.format<\/code>. Det er det samme som <code>sprintf<\/code>, bare p\u00e5 Lua, bare riktig. Og vi gir det til klienten.<\/p>\n<p>Som et resultat vil det se slik ut:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMen la oss g\u00e5 tilbake til den virkelige verden. I produksjon deployerer ingen Hello World. Vanligvis g\u00e5r applikasjonen v\u00e5r til en database eller et annet sted, og store deler av tiden venter vi p\u00e5 respons.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen sitter bare og venter. Dette er ikke s\u00e5 bra. N\u00e5r 100.000 brukere kommer inn, er det veldig tungt for oss. S\u00e5 la oss for eksempelets del lage en enkel applikasjon for \u00e5 s\u00f8ke etter bilder, for eksempel katter. Men vi skal ikke bare s\u00f8ke som det; vi vil utvide n\u00f8kkelordene, og hvis brukeren har s\u00f8kt etter \u00abkattunger\u00bb, skal vi finne katter, fluffy osv. For \u00e5 begynne med, m\u00e5 vi hente foresp\u00f8rseldataene p\u00e5 backend. Slik ser det ut:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTo linjer lar deg hente GET-parametere, ingen problemer. Deretter f\u00e5r vi informasjonen fra databasen med en tabell for n\u00f8kkelord og utvidelser via en vanlig SQL-foresp\u00f8rsel. Alt er enkelt. Slik ser det ut:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi kobler til biblioteket <code>resty.mysql<\/code>, som vi allerede har i pakken. Vi trenger ikke \u00e5 installere noe; alt er klart. Vi spesifiserer hvordan vi skal koble til og lager SQL-foresp\u00f8rselen:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDet er litt skummelt her, men alt fungerer. Her er 10 - det er grensen. Vi henter 10 oppf\u00f8ringer, vi er late og \u00f8nsker ikke \u00e5 vise mer. Jeg glemte \u00e5 nevne grensen i SQL.<\/p>\n<p>Videre finner vi bilder basert p\u00e5 alle foresp\u00f8rslene. Vi samler en bunke foresp\u00f8rsel og fyller en Lua-tabell som heter <code>reqs<\/code>, og gj\u00f8r <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlle disse foresp\u00f8rslene g\u00e5r parallelt, og vi f\u00e5r svar tilbake. Behandlingstiden er lik tiden til det langsomste svaret. Hvis vi f\u00e5r alle svarene innen 50 millisekunder, og vi sendte ut hundre foresp\u00f8rsel, da kommer svaret v\u00e5rt etter 50 millisekunder.<\/p>\n<p>Siden vi er late og ikke \u00f8nsker \u00e5 skrive HTTP-behandling og caching, lar vi NGINX gj\u00f8re alt dette for oss. Som du s\u00e5, var det en foresp\u00f8rsel til <code>url\/fetch<\/code>, her er den:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi gj\u00f8r en enkel <code>proxy_pass<\/code>, angir hvor vi skal cache, hvordan vi skal gj\u00f8re det, og da fungerer alt.<\/p>\n<p>Men dette er ikke nok, vi m\u00e5 ogs\u00e5 gi data til brukeren. Den enkleste ideen er \u00e5 serialisere alt i JSON, enkelt, p\u00e5 to linjer. Vi sender Content-Type og sender JSON.<\/p>\n<p>Men det er en komplikasjon: brukeren \u00f8nsker ikke \u00e5 lese JSON. Vi m\u00e5 tilkalle frontend-utviklere. Av og til vil vi ikke gj\u00f8re dette i starten. Og SEO-ekspertene vil si at hvis vi leter etter bilder, er det dem uansett. Men hvis vi gir dem noe innhold, vil de si at s\u00f8kemotorene ikke indekserer noe.<\/p>\n<p>Hva skal vi gj\u00f8re med dette? Selvf\u00f8lgelig vil vi gi brukeren HTML. \u00c5 generere det manuelt er ikke bra, s\u00e5 vi vil bruke maler. For dette har vi biblioteket <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDu s\u00e5 kanskje de tre skumle bokstavene OPM. OpenResty kommer med sin egen pakkebehandler, gjennom hvilken du kan installere en rekke forskjellige moduler, spesielt <code>lua-resty-template<\/code>. Dette er en enkel malmotor, n\u00e6rt relatert til Django-maler. Der kan du skrive kode og gj\u00f8re variabel-substitusjon.<\/p>\n<p>Som et resultat vil alt se omtrent slik ut:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi hentet data og rendrete malen i to linjer. Brukeren er glad, han fikk katter. Siden vi utvidet foresp\u00f8rselen, fikk han ogs\u00e5 en sj\u00f8l\u00f8ve i tillegg til kattungene. Kanskje han egentlig lette etter den, men kunne ikke formulere foresp\u00f8rselen sin riktig.<\/p>\n<p>Alt er flott, men vi er jo i utviklingen, og \u00f8nsker ikke \u00e5 vise dette til brukerne enn\u00e5. La oss sette opp autentisering. For \u00e5 gj\u00f8re dette, la oss se hvordan NGINX behandler foresp\u00f8rselen i forhold til OpenResty:<\/p>\n<ul>\n<li>Den f\u00f8rste fasen - <strong>access<\/strong>, n\u00e5r brukeren nettopp har kommet, og vi ser p\u00e5 ham gjennom overskriftene, IP-adressen, og annen informasjon. Vi kan umiddelbart kutte ham av hvis vi ikke liker ham. Dette kan brukes til autentisering, eller hvis vi f\u00e5r for mange foresp\u00f8rsel, kan vi enkelt kutte dem i denne fasen.<\/li>\n<li><strong>gjen skrive<\/strong>. Vi gjen skriver noen foresp\u00f8rsel data.<\/li>\n<li><strong>content<\/strong>. Vi gir innholdet til brukeren.<\/li>\n<li><strong>overskrifter filter<\/strong>. Vi kan endre overskriftene i svaret. Hvis vi har brukt <code>proxy_pass<\/code>, kan vi omskrive noen overskrifter f\u00f8r vi gir dem til brukeren.<\/li>\n<li><strong>kropp filter<\/strong>. Vi kan endre kroppen.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 logging. Vi kan skrive logger til elasticsearch uten et ekstra lag.<\/li>\n<\/ul>\n<p>\nV\u00e5r autentisering vil se omtrent slik ut:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi legger dette til den <code>plassering<\/code>, som vi beskrev tidligere, og putter inn f\u00f8lgende kode:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi sjekker om vi har en cookie token. Hvis ikke, sender vi til autentisering. Brukerne er smarte og kan gjette at de m\u00e5 sette en cookie token. Derfor legger vi den ogs\u00e5 i Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKoden for \u00e5 arbeide med Redis er veldig enkel og skiller seg ikke fra andre spr\u00e5k. I tillegg er all input\/output der, som her, ikke blokkering. Hvis du skriver synkron kode, fungerer det asynkront. Omtrent som med gevent, men det er gjort bedre.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa oss lage selve autentiseringen:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi sier at vi trenger \u00e5 lese kroppen i foresp\u00f8rselen. Vi f\u00e5r POST-argumentene, sjekker om brukernavnet og passordet er riktige. Hvis de ikke er riktige, sender vi til autentisering. Og hvis de er riktige, registrerer vi token i Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nIkke glem \u00e5 sette cookie, dette gj\u00f8res ogs\u00e5 i to linjer:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: gj\u00f8r NGINX til en fullverdig applikasjonsserver\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEt enkelt, hypotetisk eksempel. Vi kommer selvf\u00f8lgelig ikke til \u00e5 lage en tjeneste som viser folk katter. Men hvem vet. S\u00e5 la oss se p\u00e5 hva vi kan gj\u00f8re i produksjon.<\/p>\n<ul>\n<li><strong>Minimalistisk backend<\/strong>. Av og til trenger vi \u00e5 gi backend bare litt data: noen ganger m\u00e5 vi sette inn en dato, vise en liste, si hvor mange brukere som er p\u00e5 nettstedet, legge til en teller eller statistikk. Noe lite som det. Minimumsdelene kan lager veldig enkelt. Dette vil g\u00e5 raskt, lett og bra.\n<\/li>\n<li><strong>Forbehandling av data<\/strong>. Noen ganger \u00f8nsker vi \u00e5 integrere annonser p\u00e5 siden v\u00e5r, og vi henter disse annonsene via API-foresp\u00f8rslene. Dette er veldig enkelt \u00e5 gj\u00f8re her. Vi laster ikke ned serveren v\u00e5r, som allerede jobber hardt. Vi kan ta tak i og samle alt her. Vi kan lage noen JS-moduler eller, omvendt, splitte opp og preprocessere noe f\u00f8r vi leverer det til brukeren.\n<\/li>\n<li><strong>Grensesnitt for mikrotjenester<\/strong>. Dette er ogs\u00e5 et veldig godt case, jeg har implementert det. F\u00f8r dette jobbet jeg i selskapet Tenzor, som driver med elektronisk rapportering og tar seg av rapporteringen for omtrent halvparten av juridiske enheter i landet. Vi lagde en tjeneste hvor mange funksjoner ble realisert med samme mekanisme: ruting, autorisasjon og mer.<br \/>\nOpenResty kan brukes som lim for mikrotjenestene dine, noe som gir enhetlig tilgang til alt og et enhetlig grensesnitt. Siden mikrotjenester kan v\u00e6re skrevet i forskjellige spr\u00e5k som Node.js, PHP, Python, og noe som kj\u00f8rer p\u00e5 Erlang, forst\u00e5r vi at vi ikke \u00f8nsker \u00e5 skrive den samme koden overalt. Derfor kan OpenResty settes opp p\u00e5 frontenden.<\/p>\n<\/li>\n<li><strong>Statistikk og analyse<\/strong>. Vanligvis st\u00e5r NGINX foran, og alle foresp\u00f8rslene g\u00e5r gjennom det. Her er det veldig praktisk \u00e5 samle data. Man kan umiddelbart utf\u00f8re beregninger og sende dem et sted, for eksempel til Elasticsearch, Logstash eller bare skrive dem til logg for senere sending.\n<\/li>\n<li><strong>Flerebrukersystemer<\/strong>. For eksempel er det ogs\u00e5 veldig bra \u00e5 lage online-spill. I dag vil Alexander Gladys i Cape Town snakke om hvordan man raskt kan prototype et flerebrukerspill ved hjelp av OpenResty.\n<\/li>\n<li><strong>Foresp\u00f8rsel filtrering (WAF)<\/strong>. N\u00e5 er det popul\u00e6rt \u00e5 lage diverse webapplikasjonsbrannmurer, og det finnes mange tjenester som tilbyr dem. Med OpenResty kan man lage sin egen webapplikasjonsbrannmur som enkelt og greit kan filtrere foresp\u00f8rslene etter dine krav. Hvis du jobber med Python, vet du at PHP antageligvis ikke kan injiseres, med mindre du spawner det fra konsollen. Du vet at du har MySQL og Python, s\u00e5 kanskje noen pr\u00f8ver \u00e5 utf\u00f8re directory traversal og injisere noe i databasen. Derfor kan man raskt og kostnadseffektivt filtrere u\u00f8nskede foresp\u00f8rslene p\u00e5 frontenden.\n<\/li>\n<li><strong>Fellesskapet.<\/strong> Siden OpenResty er bygget p\u00e5 NGINX, har det en bonus - det er <strong>NGINX-fellesskapet<\/strong>Det er veldig stort, og en betydelig del av sp\u00f8rsm\u00e5lene du m\u00e5tte ha i starten, er allerede l\u00f8st av NGINX-samfunnet.\n<p><strong>Lua-utviklere<\/strong>I g\u00e5r snakket jeg med folk som kom til HighLoad++ l\u00e6ringsdagen og h\u00f8rte at det kun er Tarantool skrevet i Lua. Det er ikke sant, det er mye skrevet i Lua. Eksempler: OpenResty, XMPP-serveren Prosody, spillmotoren Love2D, Lua skriptes i Warcraft og andre steder. Det er mange Lua-utviklere, og de har et stort og hjelpsomt fellesskap. Alle mine sp\u00f8rsm\u00e5l om Lua ble l\u00f8st i l\u00f8pet av noen timer. N\u00e5r man skriver til e-postlisten, f\u00e5r man bokstavelig talt en haug med svar innen minutter, de forklarer hva og hvordan, hva som gjelder. Det er veldig flott. Dessverre er ikke alle slike vennlige sjeler.<br \/>\nDet finnes et GitHub for OpenResty, der kan man opprette en issue hvis noe er \u00f8delagt. Det finnes en e-postliste p\u00e5 Google Groups hvor man kan diskutere generelle sp\u00f8rsm\u00e5l, det er ogs\u00e5 en mailingliste p\u00e5 kinesisk - man vet aldri, kanskje man ikke behersker engelsk, men kan kinesisk.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Resultater<\/h1>\n<p><\/p>\n<ul>\n<li>Jeg h\u00e5per jeg har klart \u00e5 formidle at OpenResty er et veldig praktisk rammeverk, skreddersydd for web.<\/li>\n<li>Det har lav terskel for inntreden, siden koden ligner p\u00e5 det vi skriver, spr\u00e5ket er ganske enkelt og minimalistisk.<\/li>\n<li>Det tilbyr asynkron I\/O uten tilbakemeldinger, vi f\u00e5r ikke spagetti som vi noen ganger kan skrive i NodeJS.<\/li>\n<li>Det har enkel distribusjon, siden vi kun trenger NGINX med det n\u00f8dvendige modulen og koden v\u00e5r, s\u00e5 fungerer alt med en gang.<\/li>\n<li>Et stort og responsivt fellesskap.<\/li>\n<\/ul>\n<p>\nJeg forklarte ikke i detalj hvordan ruting gj\u00f8res, det ville blitt en veldig lang historie.<\/p>\n<p>Takk for oppmerksomheten!<\/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=\"Spill video\" 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: vi forvandler NGINX til en fullverdig applikasjonsserver<\/a><\/noindex><\/em><br \/>\n<br \/>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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: vi forvandler NGINX til en fullverdig applikasjonsserver | ProHoster","description":"Vi publiserer igjen transkripsjonen.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}