{"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\/da\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Vi offentligg\u00f8r igen transskriptionen af \u200b\u200bforedraget fra konferencen <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, der fandt sted i Skolkovo i Moskva-regionen den 7.-8. november sidste \u00e5r. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> fort\u00e6ller, hvordan man udvider funktionaliteten af NGINX med OpenResty og Lua.<\/em><\/p>\n<p>Hej alle, jeg hedder Vladimir Protasov, og jeg arbejder hos Parallels. Jeg vil fort\u00e6lle lidt om mig selv. Tre fjerdedele af mit liv har jeg skrevet kode. Jeg er blevet programm\u00f8r ind til benet i bogstaveligste forstand: nogle gange dr\u00f8mmer jeg om kode. En fjerdedel af mit liv har jeg arbejdet med industriel udvikling, skrevet kode, der g\u00e5r direkte i produktion. Koden, som nogle af jer bruger, men ikke er klar over.<\/p>\n<p>For at forst\u00e5, hvor slemt det har v\u00e6ret. Da jeg var en lille junior, kom jeg ind, og jeg fik tildelt s\u00e5danne to terabyte databaser. Det er nu, at alle har highload her. Jeg gik til konferencer og spurgte: \"Folkens, fort\u00e6l mig, har I big data, er det fedt? Hvor store er jeres databaser?\" De svarede: \"Vi har 100 gigabyte!\" Jeg sagde: \"Fedt, 100 gigabyte!\" Men i mit hoved t\u00e6nkte jeg, hvordan jeg forsigtigt kunne bevare pokerfj\u00e6set. Man t\u00e6nker, ja, de er seje, og s\u00e5 vender man tilbage og roder med de mange terabyte store databaser. Og det er mens man er junior. Kan I forestille jer, hvilken slag det er?<\/p>\n<p>Jeg kender mere end 20 programmeringssprog. Det er det, jeg m\u00e5tte finde ud af i l\u00f8bet af mit arbejde. Du f\u00e5r kode i Erlang, C, C++, Lua, Python, Ruby, og noget andet, og du skal arbejde med det hele. Jeg m\u00e5tte bare finde ud af det. Det pr\u00e6cise antal kunne jeg ikke t\u00e6lle, men jeg har mistet overblikket efter 20.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDa alle tilstedev\u00e6rende ved, hvad Parallels er, og hvad vi laver, vil jeg ikke tale om, hvor seje vi er, og hvad vi g\u00f8r. Jeg vil kun n\u00e6vne, at vi har 13 kontorer rundt om i verden, over 300 ansatte, udvikling i Moskva, Tallinn og Malta. Hvis du \u00f8nsker det, kan du flytte til Malta, hvis det er koldt om vinteren, og du vil varme ryggen.<\/p>\n<p>Vores afdeling skriver konkret i Python 2. Vi besk\u00e6ftiger os med forretning, og vi har ikke tid til at implementere de trendy teknologier, derfor lider vi. Vi har Django, fordi alt er der, og det overskydende har vi smidt v\u00e6k. Ogs\u00e5 MySQL, Redis og NGINX. Desuden har vi mange andre seje ting. Vi har MongoDB, vi har kaniner l\u00f8bende rundt, vi har n\u00e6sten alt \u2013 men det er ikke mit omr\u00e5de, og jeg arbejder ikke med det.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nJeg har fortalt om mig selv. Lad os finde ud af, hvad jeg vil tale om i dag:<\/p>\n<ul>\n<li>Hvad er OpenResty, og hvad skal man bruge det til?<\/li>\n<li>Hvorfor opfinde endnu en cykel, n\u00e5r vi har Python, NodeJS, PHP, Go og andre fede ting, som alle er glade for?<\/li>\n<li>Og lidt eksempler fra virkeligheden. Jeg m\u00e5tte sk\u00e6re mit foredrag ned betydeligt, fordi det blev 3,5 timer langt, s\u00e5 der bliver ikke mange eksempler.<\/li>\n<\/ul>\n<p>\nOpenResty er NGINX. Takket v\u00e6re det har vi en fuldgyldig webserver, der er godt skrevet og arbejder hurtigt. Jeg tror, de fleste af os bruger NGINX i produktion. I ved alle, at det er hurtigt og godt. Der er lavet fantastisk synkron ind- og uddata, s\u00e5 vi beh\u00f8ver ikke at genopfinde hjulet, som vi gjorde i Python med gevent. Gevent er fantastisk, men hvis du skriver noget C-kode, og der er problemer, s\u00e5 bliver du sindssyg af at debugge det med gevent. Jeg har erfaring med det: Det tog mig hele to dage at finde ud af, hvad der gik galt. Hvis ikke nogen havde rodet med det i flere uger, fundet problemet, skrevet om det p\u00e5 nettet, og Google havde fundet det, s\u00e5 ville vi v\u00e6re totalt forvirrede.<\/p>\n<p>NGINX har allerede cache og statisk indhold. Du beh\u00f8ver ikke at bekymre dig om, hvordan man g\u00f8r det ordentligt, s\u00e5 der ikke sker forsinkelser, og du ikke mister descriptors et eller andet sted. Nginx er meget nemt at deployere, du skal ikke t\u00e6nke over, hvad du skal v\u00e6lge - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx er installeret, givet til administratorerne, de ved, hvordan man arbejder med det. Nginx behandler anmodninger struktureret. Jeg vil fort\u00e6lle lidt mere om det senere. Kort sagt har den en fase, n\u00e5r den har modtaget anmodningen, en n\u00e5r den har behandlet den, og en n\u00e5r den har sendt indholdet til brugeren.<\/p>\n<p>Nginx er fedt, men der er \u00e9t problem: det er ikke fleksibelt nok, selv med alle de fede funktioner, som folk har f\u00e5et presset ind i konfigurationen, p\u00e5 trods af at det er konfigurerbart. Denne kraft er ikke nok. Derfor indbyggede folk fra Taobao for n\u00f8jagtigt otte \u00e5r siden Lua derind. Hvad giver det?<\/p>\n<ul>\n<li><strong>St\u00f8rrelse<\/strong>. Det er lille. LuaJIT har omkring 100-200 kilobyte overhead i hukommelse og minimal overhead i ydeevne.<\/li>\n<li><strong>Hastighed<\/strong>. LuaJIT's interpreter er i mange situationer t\u00e6t p\u00e5 C, i nogle situationer er den langsommere end Java, og i andre situationer overg\u00e5r den den. I en periode blev den betragtet som state of the art, den bedste JIT-compilator. Nu findes der bedre, men de er meget tungere, som for eksempel V8. Nogle JavaScript-interpretere og Java's HotSpot er hurtigere p\u00e5 nogle punkter, men p\u00e5 andre steder er de stadig langsommere.<\/li>\n<li><strong>Nemetski nedele.<\/strong>. Hvis du for eksempel har en kodebase i Perl, og du ikke er Booking, vil du ikke finde Perl-programm\u00f8rer. Fordi de ikke eksisterer, de er alle taget, og det tager lang tid at l\u00e6re dem. Hvis du vil have programm\u00f8rer p\u00e5 noget andet, skal du muligvis ogs\u00e5 genuddanne dem, eller finde dem. I Lua er det enkelt. Enhver junior kan l\u00e6re Lua p\u00e5 tre dage. Det tog mig cirka to timer at forst\u00e5 det. Efter to timer skrev jeg allerede kode til produktion. Efter omtrent en uge blev det direkte sendt til produktionen.<\/li>\n<\/ul>\n<p>\nSom resultat ser det s\u00e5dan ud:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDer er meget her. I OpenResty har de samlet en masse moduler, b\u00e5de Lua og enginspecifikke. Og du har alt klar \u2013 deployet og det fungerer.<\/p>\n<h1>Eksempler<\/h1>\n<p>\nLad os stoppe med lyrikken og g\u00e5 videre til koden. Her er et lille Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvad er der her? Dette er en enginspecifik location. Vi bekymrer os ikke, skriver ikke vores egen routing, tager ikke noget eksisterende \u2013 vi har allerede det, der er i NGINX, vi lever komfortabelt og dovent.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 dette er en blok, der angiver, at vi leverer indhold via et Lua-script. Vi tager en enginspecifik variabel <code>remote_addr<\/code> og inds\u00e6tter den i <code>string.format<\/code>. Dette er det samme som <code>sprintf<\/code>, kun p\u00e5 Lua, kun korrekt. Og vi leverer det til klienten.<\/p>\n<p>Som resultat vil det se s\u00e5dan ud:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMen lad os vende tilbage til den virkelige verden. Ingen deployer Hello World i produktion. Vores applikation g\u00e5r normalt til databasen eller et andet sted og venter st\u00f8rstedelen af tiden p\u00e5 et svar.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen sidder bare stille og venter. Det er ikke s\u00e5 godt. N\u00e5r 100.000 brugere kommer, bliver det meget h\u00e5rdt for os. S\u00e5 lad os som eksempel lave en simpel applikation. Vi vil s\u00f8ge efter billeder, for eksempel af katte. Men vi vil ikke bare s\u00f8ge, vi vil udvide s\u00f8geordene, og hvis brugeren s\u00f8ger p\u00e5 'killinger', finder vi katte, pelsede v\u00e6sner og s\u00e5 videre. F\u00f8rst skal vi modtage foresp\u00f8rgselsdataene p\u00e5 backend. Det ser s\u00e5dan ud:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTo linjer giver dig mulighed for at hente GET-parametrene, ingen komplikationer. Dern\u00e6st f\u00e5r vi for eksempel information fra databasen med en tabel baseret p\u00e5 s\u00f8geord og udvidelse via en almindelig SQL-foresp\u00f8rgsel. Alt er enkelt. Det ser s\u00e5dan ud:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi tilslutter biblioteket <code>resty.mysql<\/code>, som vi allerede har i pakken. Vi beh\u00f8ver ikke at installere noget, alt er klar. Angiv hvordan man skal oprette forbindelse, og lav en SQL-foresp\u00f8rgsel:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDet er lidt skr\u00e6mmende her, men det fungerer. Her er 10 - det er gr\u00e6nsen. Vi tr\u00e6kker 10 poster, vi er dovne og vil ikke vise flere. Jeg glemte at n\u00e6vne gr\u00e6nsen i SQL.<\/p>\n<p>Derefter finder vi billeder p\u00e5 alle foresp\u00f8rgsler. Vi samler en bunke foresp\u00f8rgsler og udfylder en Lua-tabel, som hedder <code>reqs<\/code>, og vi laver <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlle disse foresp\u00f8rgsler sendes parallelt, og vi f\u00e5r svar tilbage. Den samlede tid er lig med responstiden for den langsomste. Hvis vi f\u00e5r alle svar p\u00e5 50 millisekunder, og vi har sendt hundrede foresp\u00f8rgsler, s\u00e5 f\u00e5r vi svaret om 50 millisekunder.<\/p>\n<p>Da vi er dovne og ikke \u00f8nsker at skrive HTTP-behandling og caching, vil vi lade NGINX g\u00f8re alt for os. Som du s\u00e5, var der en foresp\u00f8rgsel til <code>url\/fetch<\/code>, her er den:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi laver en enkel <code>proxy_pass<\/code>, angiver, hvor vi skal cache, hvordan vi g\u00f8r det, og s\u00e5 virker det hele.<\/p>\n<p>Men det er ikke nok, vi skal ogs\u00e5 give data til brugeren. Den enkleste id\u00e9 er at serialisere alt til JSON, nemt, i to linjer. Vi sender Content-Type, vi sender JSON.<\/p>\n<p>Men der er \u00e9n udfordring: brugeren vil ikke l\u00e6se JSON. Vi skal tiltr\u00e6kke front-end udviklere. Nogle gange \u00f8nsker vi ikke at g\u00f8re dette i starten. Og SEO-specialisterne siger, at hvis vi s\u00f8ger efter billeder, s\u00e5 er de ligeglade. Men hvis vi giver dem noget indhold, vil de sige, at s\u00f8gemaskinerne ikke indekserer noget.<\/p>\n<p>Hvad skal vi g\u00f8re ved dette? Selvf\u00f8lgelig vil vi levere HTML til brugeren. At generere manuelt er ikke s\u00e5 smart, s\u00e5 vi \u00f8nsker at bruge skabeloner. Til dette form\u00e5l findes der et bibliotek, <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDu har sikkert set de tre skr\u00e6mmende bogstaver OPM. OpenResty kommer med sin egen pakkeh\u00e5ndtering, hvorigennem man kan installere en masse forskellige moduler, herunder <code>lua-resty-template<\/code>. Det er en simpel skabelonmotor, der ligner Django templates. Der kan man skrive kode og erstatte variable.<\/p>\n<p>Resultatet vil se nogenlunde s\u00e5dan her ud:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi tog dataene og rendere skabelonen igen p\u00e5 to linjer. Brugeren er glad, han fik katte. Da vi udvidede foresp\u00f8rgslen, fik han ikke kun kattekillinger, men ogs\u00e5 en s\u00f8l\u00f8ve. Man ved aldrig, m\u00e5ske s\u00f8gte han netop efter den, men kunne ikke formulere sin foresp\u00f8rgsel korrekt.<\/p>\n<p>Det er fantastiskt, men vi er i udviklingen, og vil ikke vise det til brugerne endnu. Lad os lave en autorisation. For at g\u00f8re dette, lad os se p\u00e5, hvordan NGINX h\u00e5ndterer foresp\u00f8rgslen i termer af OpenResty:<\/p>\n<ul>\n<li>Den f\u00f8rste fase - <strong>access<\/strong>, n\u00e5r brugeren lige er kommet, og vi har set p\u00e5 ham gennem overskrifterne, IP-adressen, og andre data. Vi kan straks afbryde ham, hvis vi ikke kan lide ham. Dette kan bruges til autentificering, eller hvis vi f\u00e5r mange foresp\u00f8rgsler, kan vi let afbryde dem p\u00e5 dette trin.<\/li>\n<li><strong>rewrite<\/strong>. Vi omskriver nogle data fra foresp\u00f8rgslen.<\/li>\n<li><strong>for indhold med billeder (alternativ tekst<\/strong>. Vi leverer indholdet til brugeren.<\/li>\n<li><strong>headers filter<\/strong>. Vi kan \u00e6ndre svaroverskrifterne. Hvis vi har brugt <code>proxy_pass<\/code>, kan vi \u00e6ndre nogle overskrifter, f\u00f8r vi giver dem til brugeren.<\/li>\n<li><strong>body filter<\/strong>. Vi kan \u00e6ndre kroppen.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 logning. Vi kan skrive logs til elasticsearch uden et ekstra lag.<\/li>\n<\/ul>\n<p>\nVores autentificering vil se cirka s\u00e5dan ud:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi tilf\u00f8jer dette i den <code>location<\/code>, som vi beskrev f\u00f8r, og putter s\u00e5dan en kode derind:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi ser, om vi har en cookie token. Hvis ikke, sender vi dem til autentificering. Brugerne er snedige og kan g\u00e6tte, at de skal s\u00e6tte cookie token. Derfor l\u00e6gger vi ogs\u00e5 denne i Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKoden til at arbejde med Redis er meget enkel og adskiller sig ikke fra andre sprog. Samtidig er al ind- og uddata, hvad enten det er der eller her, ikke blokkerende. Hvis du skriver synkront kode, s\u00e5 k\u00f8rer det asynkront. Lidt ligesom med gevent, men gjort godt.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLad os lave selve autentificeringen:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi siger, at vi skal l\u00e6se kroppens indhold. Vi f\u00e5r POST-argumenterne, kontrollerer, at login og password er korrekte. Hvis de er forkerte, sender vi dem til autentificering. Hvis de er korrekte, gemmer vi token i Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nGlem ikke at s\u00e6tte cookie, det g\u00f8res ogs\u00e5 i to linjer:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: Forvandler NGINX til en fuldgyldig applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEksemplet er simpelt og teoretisk. Vi vil naturligvis ikke lave en service, der viser folk katte. Men hvem ved. Lad os derfor se p\u00e5, hvad der kan g\u00f8res i produktion.<\/p>\n<ul>\n<li><strong>Minimalistisk backend<\/strong>. Nogle gange kr\u00e6ver det, at backend kun leverer nogle f\u00e5 data: et sted skal der inds\u00e6ttes en dato, et andet sted skal der vises en liste, sige, hvor mange brugere der i \u00f8jeblikket er p\u00e5 siden, tilf\u00f8je en t\u00e6ller eller statistik. Noget stort. Nogle minimale stykker kan laves meget nemt. Det vil v\u00e6re hurtigt, nemt og godt.\n<\/li>\n<li><strong>Datapreprocessering<\/strong>. Nogle gange har vi lyst til at integrere reklame p\u00e5 vores side, og denne reklame henter vi via API-anmodninger. Det er meget nemt at g\u00f8re lige her. Vi belaster ikke vores backend, som allerede arbejder h\u00e5rdt. Man kan tage og samle det her. Vi kan samle nogle JS eller omvendt, splitte noget op, eller preprocessere det, f\u00f8r vi sender det til brugeren.\n<\/li>\n<li><strong>Facade til mikroservice<\/strong>. Det er ogs\u00e5 et meget godt projekt, som jeg har implementeret. F\u00f8r dette arbejdede jeg i Tenzor, som besk\u00e6ftiger sig med elektronisk rapportering og leverer rapportering til cirka halvdelen af \u200b\u200bjuridiske personer i landet. Vi lavede en service, hvor mange funktioner blev udf\u00f8rt ved hj\u00e6lp af denne samme mekanisme: ruting, autorisation og mere.<br \/>\nOpenResty kan bruges som lim til dine mikroservices, som giver en ensartet adgang til alt og et ensartet interface. Da mikroservices kan v\u00e6re skrevet s\u00e5dan, at her har du Node.js, her har du PHP, her Python, og her st\u00e5r der noget p\u00e5 Erlang, forst\u00e5r vi, at vi ikke \u00f8nsker at skulle skrive den samme kode overalt. Derfor kan OpenResty s\u00e6ttes p\u00e5 frontend.<\/p>\n<\/li>\n<li><strong>Statistik og analyser<\/strong>. Normalt st\u00e5r NGINX foran, og alle anmodninger g\u00e5r igennem det. Det er her, det er meget praktisk at samle. Man kan straks beregne noget og sende det et sted hen, for eksempel til Elasticsearch, Logstash eller simpelthen logge det og senere sende det videre.\n<\/li>\n<li><strong>Flermandsystemer<\/strong>. For eksempel er det ogs\u00e5 meget godt at lave online-spil. I dag vil Alexander Gladys tale i Cape Town om, hvordan man hurtigt prototyper et flermands-spil ved hj\u00e6lp af OpenResty.\n<\/li>\n<li><strong>Anmodningsfiltrering (WAF)<\/strong>. Det er nu moderne at lave forskellige web application firewalls, der er mange tjenester, der tilbyder dem. Ved hj\u00e6lp af OpenResty kan du lave din egen web application firewall, der nemt og hurtigt filtrerer anmodninger efter dine krav. Hvis du bruger Python, ved du, at PHP bestemt ikke kan injiceres, hvis du ikke spawnede det fra konsollen et eller andet sted. Du ved, at du har MySQL og Python. M\u00e5ske vil nogen fors\u00f8ge at lave et directory traversal og injicere noget i databasen. Derfor kan du hurtigt og billigt filtrere u\u00f8nskede anmodninger direkte p\u00e5 frontend.\n<\/li>\n<li><strong>F\u00e6llesskab.<\/strong> Da OpenResty er bygget p\u00e5 NGINX, har det en bonus - det er <strong>NGINX-f\u00e6llesskabet<\/strong>Det er meget stort, og en rimelig del af de sp\u00f8rgsm\u00e5l, du m\u00e5tte have i starten, er allerede l\u00f8st af NGINX-samfundet.\n<p><strong>Lua-udviklere<\/strong>I g\u00e5r talte jeg med nogle fyre, der deltog i HighLoad++ tr\u00e6ningsdagen, og jeg h\u00f8rte, at kun Tarantool er skrevet i Lua. Det er ikke sandt, der er meget, der er skrevet i Lua. Eksempler: OpenResty, XMPP-serveren Prosody, spilmotoren Love2D, Lua bruges i Warcraft og andre steder. Der er mange Lua-udviklere, de har et stort og lydh\u00f8re f\u00e6llesskab. Alle mine sp\u00f8rgsm\u00e5l om Lua blev besvaret inden for f\u00e5 timer. N\u00e5r man skriver til mailinglisten, er der bogstaveligt talt en masse svar inden for f\u00e5 minutter, der forklarer hvad og hvordan, og hvad der er hvad. Det er virkelig fantastisk. Desv\u00e6rre er ikke alle steder s\u00e5 venlige og im\u00f8dekommende.<br \/>\nDer er GitHub for OpenResty, hvor man kan oprette en issue, hvis noget er g\u00e5et galt. Der er en mailingliste p\u00e5 Google Groups, hvor man kan diskutere generelle sp\u00f8rgsm\u00e5l, og der er en mailingliste p\u00e5 kinesisk - m\u00e5ske kan du ikke engelsk, men har nogle f\u00e6rdigheder i kinesisk.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Resum\u00e9<\/h1>\n<p><\/p>\n<ul>\n<li>Jeg h\u00e5ber, jeg har formidlet, at OpenResty er et meget praktisk framework, der er skabt til web.<\/li>\n<li>Det har en lav indgangsbarriere, da koden ligner det, vi skriver; sproget er ret enkelt og minimalistisk.<\/li>\n<li>Det tilbyder asynkron I\/O uden callbacks, vi vil ikke f\u00e5 det rod, som vi nogle gange kan skrive i NodeJS.<\/li>\n<li>Det har let deploy, da vi kun har brug for NGINX med det relevante modul og vores kode, s\u00e5 virker det hele med det samme.<\/li>\n<li>Et stort og lydh\u00f8r f\u00e6llesskab.<\/li>\n<\/ul>\n<p>\nJeg fortalte ikke i detaljer, hvordan routing bliver lavet; det ville blive en meget lang fort\u00e6lling.<\/p>\n<p>Tak for din opm\u00e6rksomhed!<\/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=\"Afspil 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: g\u00f8r NGINX til en fuldgyldig applikationsserver<\/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.3 - 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\/da\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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: g\u00f8r NGINX til en fuldgyldig applikationsserver | ProHoster","description":"Vi offentligg\u00f8r endnu engang transskriptionen.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}