{"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\/sv\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Vi publicerar \u00e5terigen en transkription av f\u00f6redraget fr\u00e5n konferensen <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, som h\u00f6lls i Skolkovo i Moskva-regionen den 7\u20138 november f\u00f6rra \u00e5ret. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> ber\u00e4ttar hur man ut\u00f6kar funktionaliteten av NGINX med OpenResty och Lua.<\/em><\/p>\n<p>Hej alla, jag heter Vladimir Protasov, jag arbetar p\u00e5 Parallels. Jag ska ber\u00e4tta lite om mig sj\u00e4lv. I tre fj\u00e4rdedelar av mitt liv har jag \u00e4gnat mig \u00e5t att skriva kod. Jag blev programmerare \u00e4nda in i sj\u00e4len, bokstavligen: ibland dr\u00f6mmer jag om kod. En fj\u00e4rdedel av livet handlar om industriell utveckling, att skriva kod som g\u00e5r direkt till produktion. Koden som vissa av er anv\u00e4nder, men inte misst\u00e4nker.<\/p>\n<p>F\u00f6r att ni ska f\u00f6rst\u00e5 hur illa det var. N\u00e4r jag var en liten junior kom jag in och fick s\u00e5dana tv\u00e5terabyte databaser. Nu har alla highload h\u00e4r. Jag gick p\u00e5 konferenser och fr\u00e5gade: \"Tja, ber\u00e4tta, har ni big data, \u00e4r allt coolt? Hur stora databaser har ni?\" De svarade: \"Vi har 100 gigabyte!\" Jag sa: \"Coolt, 100 gigabyte!\" Men t\u00e4nkte f\u00f6r mig sj\u00e4lv, hur jag skulle h\u00e5lla en pokerface. Du t\u00e4nker, ja, de \u00e4r coola, och sen kommer du tillbaka och gr\u00e4ver med dessa multiterabyte databaser. Och detta - n\u00e4r jag var junior. Kan ni f\u00f6rest\u00e4lla er hur h\u00e5rt det var?<\/p>\n<p>Jag kan mer \u00e4n 20 programmeringsspr\u00e5k. Det \u00e4r n\u00e5got jag har f\u00e5tt l\u00e4ra mig under arbetets g\u00e5ng. Du f\u00e5r kod p\u00e5 Erlang, C, C++, Lua, Python, Ruby och n\u00e5got annat, och du m\u00e5ste arbeta med allt det. S\u00e5 det blev s\u00e5. Jag har inte lyckats r\u00e4kna det exakta antalet, men det f\u00f6rlorade jag mig n\u00e5gonstans kring 20.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nEftersom alla n\u00e4rvarande vet vad Parallels \u00e4r och vad vi g\u00f6r, kommer jag inte att prata om hur coola vi \u00e4r och vad vi g\u00f6r. Jag ber\u00e4ttar bara att vi har 13 kontor runt om i v\u00e4rlden, \u00f6ver 300 anst\u00e4llda, utveckling i Moskva, Tallinn och Malta. Om s\u00e5 \u00f6nskas kan man faktiskt flytta till Malta om det \u00e4r kallt p\u00e5 vintern och man beh\u00f6ver v\u00e4rma ryggen.<\/p>\n<p>Specifikt v\u00e5r avdelning skriver i Python 2. Vi sysslar med aff\u00e4rer och har inte tid att inf\u00f6ra trendiga teknologier, s\u00e5 vi lider. Vi har Django, f\u00f6r i den finns allt, och det \u00f6verfl\u00f6diga har vi tagit bort. Dessutom MySQL, Redis och NGINX. Vi har ocks\u00e5 m\u00e5nga andra coola saker. Vi har MongoDB, v\u00e5ra kaniner springer omkring, vi har s\u00e5 mycket olika grejer - men det \u00e4r inte mitt omr\u00e5de, och jag sysslar inte med det.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nJag har ber\u00e4ttat om mig sj\u00e4lv. L\u00e5t oss ta reda p\u00e5 vad jag ska prata om idag:<\/p>\n<ul>\n<li>Vad \u00e4r OpenResty och hur anv\u00e4nds det?<\/li>\n<li>Varf\u00f6r uppfinna \u00e4nnu en cykel n\u00e4r vi har Python, NodeJS, PHP, Go och andra fantastiska saker som alla \u00e4r n\u00f6jda med?<\/li>\n<li>Och lite exempel fr\u00e5n verkligheten. Jag var tvungen att kraftigt korta ned min presentation eftersom den blev 3,5 timmar l\u00e5ng, s\u00e5 det blir f\u00e5 exempel.<\/li>\n<\/ul>\n<p>\nOpenResty \u00e4r NGINX. Tack vare det har vi en fullt fungerande webbserver som \u00e4r v\u00e4lskriven och snabb. Jag tror att de flesta av oss anv\u00e4nder NGINX i produktion. Alla vet att den \u00e4r snabb och bra. Den har en fantastisk synkron in-\/utmatning, s\u00e5 vi beh\u00f6ver inte hitta p\u00e5 n\u00e5got nytt som vi gjorde i Python med gevent. Gevent \u00e4r fantastiskt, men om du skriver C-kod och n\u00e5got g\u00e5r fel, kommer du att bli galen av att debugga det med gevent. Jag hade den erfarenheten: det tog mig tv\u00e5 hela dagar att f\u00f6rst\u00e5 vad som g\u00e5tt fel. Om ingen hade gr\u00e4vt i det i flera veckor, hittat problemet, skrivit om det p\u00e5 internet, och Google inte hade funnit det, skulle vi ha blivit helt galna.<\/p>\n<p>I NGINX finns redan caching och statiskt inneh\u00e5ll. Du beh\u00f6ver inte oroa dig f\u00f6r hur man g\u00f6r det p\u00e5 ett korrekt s\u00e4tt s\u00e5 att det inte saktar ner n\u00e5gonstans, eller att du tappar n\u00e5gra deskriptorer. NGINX \u00e4r v\u00e4ldigt enkelt att distribuera, du beh\u00f6ver inte t\u00e4nka p\u00e5 vad du ska v\u00e4lja \u2013 WSGI, PHP-FPM, Gunicorn, Unicorn. NGINX installeras, adminerna tar hand om det, och de vet hur man arbetar med det. NGINX strukturerat hanterar f\u00f6rfr\u00e5gningar. Jag kommer att ber\u00e4tta lite mer om det senare. Kort sagt, det finns en fas n\u00e4r den just har tagit emot f\u00f6rfr\u00e5gan, n\u00e4r den har behandlat den och n\u00e4r den har returnerat inneh\u00e5llet till anv\u00e4ndaren.<\/p>\n<p>NGINX \u00e4r bra, men det finns ett problem: det \u00e4r inte tillr\u00e4ckligt flexibelt, \u00e4ven med alla de fantastiska funktionerna som utvecklarna har lagt in i konfigurationen. Denna kraft r\u00e4cker inte till. D\u00e4rf\u00f6r integrerade teamet fr\u00e5n Taobao f\u00f6r l\u00e4nge sedan, verkar det vara f\u00f6r \u00e5tta \u00e5r sedan, Lua i det. Vad ger det?<\/p>\n<ul>\n<li><strong>Dimensions<\/strong>. Det \u00e4r litet. LuaJIT ger ungef\u00e4r 100-200 kilobyte overhead i minnet och minimal overhead i prestanda.<\/li>\n<li><strong>Hastighet<\/strong>. LuaJIT-tolkaren \u00e4r i m\u00e5nga situationer n\u00e4ra C, i vissa situationer sl\u00e5r det Java, i andra \u00e4r det snabbare \u00e4n den. Under en tid ans\u00e5gs det vara den mest avancerade JIT-kompilatorn. Numera finns det mer avancerade, men de \u00e4r mycket tyngre, som till exempel V8. Vissa JS-tolkare och Java HotSpot \u00e4r snabbare i vissa aspekter, men i andra omr\u00e5den f\u00f6rlorar de fortfarande.<\/li>\n<li><strong>Anv\u00e4ndarv\u00e4nlighet<\/strong>. Om du till exempel har en kodbas i Perl, och du inte \u00e4r Booking, kommer du inte att hitta Perl-programmerare. F\u00f6r de finns inte, de har alla blivit upptagna, och att l\u00e4ra dem tar tid och \u00e4r sv\u00e5rt. Om du vill ha programmerare i n\u00e5got annat spr\u00e5k, kanske du ocks\u00e5 beh\u00f6ver omskola dem, eller s\u00e5 f\u00e5r du leta. F\u00f6r Lua \u00e4r det enkelt. Lua kan l\u00e4ras av vilken junior som helst p\u00e5 tre dagar. Jag beh\u00f6vde ungef\u00e4r tv\u00e5 timmar f\u00f6r att f\u00f6rst\u00e5 det. Efter tv\u00e5 timmar skrev jag redan kod i produktionen. Ungef\u00e4r en vecka senare var den direkt i produktionen.<\/li>\n<\/ul>\n<p>\nResultatet ser ut s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDet finns mycket h\u00e4r. I OpenResty har de samlat en massa moduler, b\u00e5de Lua och NGINX-specifika. Och allt \u00e4r klart \u2013 bara dyk in och det fungerar.<\/p>\n<h1>Exempel<\/h1>\n<p>\nNog med poesi, let's g\u00e5 till koden. H\u00e4r \u00e4r en liten Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVad finns h\u00e4r? Det \u00e4r en NGINX-location. Vi gr\u00e4mer oss inte, vi skriver ingen egen routing, vi tar ingen f\u00e4rdig \u2013 vi har redan det i NGINX, vi lever bra och lat.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 det \u00e4r en block som s\u00e4ger att vi skickar inneh\u00e5ll med hj\u00e4lp av ett Lua-skript. Vi tar NGINX-variabeln <code>remote_addr<\/code> och stoppar den i <code>string.format<\/code>. Det \u00e4r samma sak som <code>sprintf<\/code>, bara p\u00e5 Lua, bara korrekt. Och vi skickar det till kunden.<\/p>\n<p>Resultatet ser ut s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMen l\u00e5t oss \u00e5terv\u00e4nda till verkligheten. Ingen deployar Hello World i produktion. V\u00e5r applikation g\u00f6r vanligtvis anrop till databasen eller n\u00e5gon annanstans och st\u00f6rre delen av tiden v\u00e4ntar p\u00e5 svar.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen sitter bara och v\u00e4ntar. Det \u00e4r inte s\u00e5 bra. N\u00e4r 100 000 anv\u00e4ndare str\u00f6mmar in, blir det mycket tufft f\u00f6r oss. S\u00e5 l\u00e5t oss ta fram ett enkelt exempel p\u00e5 en applikation. Vi ska leta efter bilder, till exempel katter. Men vi ska inte bara leta, vi kommer att bredda s\u00f6kord och om en anv\u00e4ndare s\u00f6ker p\u00e5 \"kattungar\", s\u00e5 ska vi hitta katter, fluffiga, och s\u00e5 vidare. F\u00f6rst m\u00e5ste vi f\u00e5 s\u00f6kdata p\u00e5 backend. Det ser ut s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTv\u00e5 rader till\u00e5ter dig att h\u00e4mta GET-parametrar, inget kr\u00e5ngel. D\u00e4refter f\u00e5r vi informationen fr\u00e5n databasen med en table p\u00e5 s\u00f6kordet och filendelse med en vanlig SQL-fr\u00e5ga. Det \u00e4r enkelt. Det ser ut s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi kopplar in biblioteket <code>resty.mysql<\/code>, som vi redan har i paketet. Vi beh\u00f6ver inget installera, allt \u00e4r klart. Vi anger hur vi ansluter och g\u00f6r en SQL-fr\u00e5ga:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDet \u00e4r lite l\u00e4skigt h\u00e4r, men allt fungerar. H\u00e4r \u00e4r 10 \u2013 det \u00e4r gr\u00e4nsen. Vi h\u00e4mtar 10 poster, vi \u00e4r lata och vill inte visa fler. Jag gl\u00f6mde att n\u00e4mna gr\u00e4nsen i SQL.<\/p>\n<p>Sedan hittar vi bilder f\u00f6r alla f\u00f6rfr\u00e5gningar. Vi samlar en h\u00f6g av f\u00f6rfr\u00e5gningar och fyller en Lua-tabell som kallas <code>reqs<\/code>, och g\u00f6r <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlla dessa f\u00f6rfr\u00e5gningar g\u00e5r parallellt, och vi f\u00e5r tillbaka svar. Tiden f\u00f6r arbetet \u00e4r lika med tiden f\u00f6r svaret fr\u00e5n den l\u00e5ngsammaste. Om alla svarar p\u00e5 50 millisekunder och vi skickade hundra f\u00f6rfr\u00e5gningar, kommer svaret att komma tillbaka p\u00e5 50 millisekunder.<\/p>\n<p>Eftersom vi \u00e4r lata och inte vill skriva HTTP-hantering och caching, kommer vi att f\u00e5 NGINX att g\u00f6ra allt \u00e5t oss. Som ni s\u00e5g, d\u00e4r var en f\u00f6rfr\u00e5gan till <code>url\/fetch<\/code>, h\u00e4r \u00e4r den:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi g\u00f6r en enkel <code>proxy_pass<\/code>, anger vart vi ska cacha, hur vi ska g\u00f6ra det, och allt fungerar.<\/p>\n<p>Men det \u00e4r inte tillr\u00e4ckligt, vi beh\u00f6ver ocks\u00e5 ge data till anv\u00e4ndaren. Den enklaste id\u00e9n \u00e4r att serialisera allt till JSON, l\u00e4tt, p\u00e5 tv\u00e5 rader. Vi ger Content-Type, vi ger JSON.<\/p>\n<p>Men det finns en sv\u00e5righet: anv\u00e4ndaren vill inte l\u00e4sa JSON. Vi m\u00e5ste locka frontend-utvecklare. Ibland vill vi inte g\u00f6ra det fr\u00e5n b\u00f6rjan. SEO-experter kan s\u00e4ga att om vi letar efter bilder \u00e4r det ointressant f\u00f6r dem. Men om vi ger dem n\u00e5got inneh\u00e5ll, kommer de att s\u00e4ga att v\u00e5ra s\u00f6kmotorer inte indexerar n\u00e5got.<\/p>\n<p>Vad ska vi g\u00f6ra \u00e5t det? Sj\u00e4lvklart kommer vi att ge HTML till anv\u00e4ndaren. Att generera det manuellt \u00e4r inte bra, s\u00e5 vi vill anv\u00e4nda mallar. F\u00f6r detta finns det ett bibliotek <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNi har kanske sett de tre skr\u00e4mmande bokst\u00e4verna OPM. OpenResty kommer med sin egen pakethanterare, genom vilken man kan installera en massa olika moduler, bland annat <code>lua-resty-template<\/code>. Det \u00e4r en enkel mallmotor, n\u00e4ra Django-mallar. D\u00e4r kan man skriva kod och g\u00f6ra variabelsubstitution.<\/p>\n<p>Resultatet kommer att se ungef\u00e4r ut s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi tog data och renderade mallen igen i tv\u00e5 rader. Anv\u00e4ndaren \u00e4r glad, han fick kattbilder. Eftersom vi utvidgade f\u00f6rfr\u00e5gan fick han ocks\u00e5 en sj\u00f6lejon. Vem vet, kanske han letade just efter det men inte kunde formulera sin f\u00f6rfr\u00e5gan korrekt.<\/p>\n<p>Det \u00e4r fantastiskt, men vi \u00e4r i utvecklingsskedet, och vi vill inte visa det f\u00f6r anv\u00e4ndarna \u00e4n. L\u00e5t oss g\u00f6ra autentisering. F\u00f6r att g\u00f6ra det, l\u00e5t oss se hur NGINX hanterar en f\u00f6rfr\u00e5gan i termer av OpenResty:<\/p>\n<ul>\n<li>Den f\u00f6rsta fasen \u2013 <strong>access<\/strong>, n\u00e4r anv\u00e4ndaren just har kommit in, och vi har tittat p\u00e5 honom utifr\u00e5n rubriker, IP-adress och annan information. Vi kan omedelbart st\u00e4nga av honom om vi inte gillar det. Detta kan anv\u00e4ndas f\u00f6r autentisering, eller om vi f\u00e5r v\u00e4ldigt m\u00e5nga f\u00f6rfr\u00e5gningar kan vi enkelt st\u00e4nga av dem i detta skede.<\/li>\n<li><strong>rewrite<\/strong>. Vi skriver om viss f\u00f6rfr\u00e5gningsdata.<\/li>\n<li><strong>inneh\u00e5ll<\/strong>. Vi ger inneh\u00e5llet till anv\u00e4ndaren.<\/li>\n<li><strong>rubriksfilter<\/strong>. Vi kan modifiera svarsrubriker. Om vi har anv\u00e4nt <code>proxy_pass<\/code>, kan vi skriva om vissa rubriker innan vi ger dem till anv\u00e4ndaren.<\/li>\n<li><strong>kroppsf\u00f6rfilter<\/strong>. Vi kan modifiera kroppen.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 loggning. Vi kan skriva loggar i elasticsearch utan ett extra lager.<\/li>\n<\/ul>\n<p>\nV\u00e5r autentisering kommer att se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi l\u00e4gger till detta i den <code>plats<\/code>, som vi beskrev tidigare, och s\u00e4tter in f\u00f6ljande kod:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi kollar om vi har en cookie-token. Om inte, omdirigerar vi till autentisering. Anv\u00e4ndarna \u00e4r kloka och kan lista ut att de beh\u00f6ver s\u00e4tta en cookie-token. D\u00e4rf\u00f6r l\u00e4gger vi \u00e4ven in den i Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKoden f\u00f6r att arbeta med Redis \u00e4r v\u00e4ldigt enkel och skiljer sig inte fr\u00e5n andra spr\u00e5k. All input\/output d\u00e4r och h\u00e4r \u00e4r icke-blockerande. Om du skriver synkron kod fungerar det asynkront. Ungef\u00e4r som med gevent, fast gjort bra.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL\u00e5t oss g\u00f6ra sj\u00e4lva autentiseringen:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVi s\u00e4ger att vi beh\u00f6ver l\u00e4sa kroppsinneh\u00e5llet f\u00f6r f\u00f6rfr\u00e5gan. Vi f\u00e5r POST-argument, kontrollerar att anv\u00e4ndarnamn och l\u00f6senord \u00e4r korrekta. Om de \u00e4r felaktiga, omdirigerar vi till autentisering. Men om de \u00e4r korrekta, sparar vi token i Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nGl\u00f6m inte att s\u00e4tta cookie, det g\u00f6rs ocks\u00e5 p\u00e5 tv\u00e5 rader:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: f\u00f6rvandlar NGINX till en komplett applikationsserver\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEtt enkelt, hypotetiskt exempel. Vi kommer sj\u00e4lvklart inte att g\u00f6ra en tj\u00e4nst som visar katter f\u00f6r m\u00e4nniskor. Men vem vet. L\u00e5t oss d\u00e4rf\u00f6r titta p\u00e5 vad som kan g\u00f6ras i produktion.<\/p>\n<ul>\n<li><strong>Minimalistisk backend<\/strong>. Ibland beh\u00f6ver vi leverera en mycket liten m\u00e4ngd data till backend: ibland beh\u00f6ver vi s\u00e4tta in ett datum, ibland visa en lista, ber\u00e4tta hur m\u00e5nga anv\u00e4ndare som f\u00f6r n\u00e4rvarande \u00e4r p\u00e5 webbplatsen, koppla in en r\u00e4knare eller statistik. N\u00e5got litet. Minimala bitar kan g\u00f6ras v\u00e4ldigt l\u00e4tt. Det kommer att bli snabbt, enkelt och bra.\n<\/li>\n<li><strong>F\u00f6rbehandling av data<\/strong>. Ibland vill vi integrera annonser p\u00e5 v\u00e5r sida, och vi h\u00e4mtar dessa annonser via API-f\u00f6rfr\u00e5gningar. Det \u00e4r v\u00e4ldigt enkelt att g\u00f6ra just h\u00e4r. Vi belastar inte v\u00e5r backend, som redan arbetar h\u00e5rt. Vi kan samla detta h\u00e4r. Vi kan skapa lite JS eller, tv\u00e4rtom, dela upp det, processa n\u00e5got innan vi ger det till anv\u00e4ndaren.\n<\/li>\n<li><strong>Facad f\u00f6r mikrotj\u00e4nst<\/strong>. Detta \u00e4r ocks\u00e5 ett mycket bra fall, jag har implementerat det. Tidigare arbetade jag p\u00e5 f\u00f6retaget Tenzor, som sysslar med elektronisk rapportering och tillhandah\u00e5ller rapportering f\u00f6r ungef\u00e4r h\u00e4lften av f\u00f6retagen i landet. Vi gjorde en tj\u00e4nst d\u00e4r med hj\u00e4lp av samma mekanism \u00e4r m\u00e5nga saker gjorda: ruttdelning, autentisering och annat.<br \/>\nOpenResty kan anv\u00e4ndas som lim f\u00f6r dina mikrotj\u00e4nster, vilket ger en enhetlig \u00e5tkomst till allt och ett enhetligt gr\u00e4nssnitt. Eftersom mikrotj\u00e4nster kan skrivas s\u00e5 h\u00e4r, s\u00e5 har du Node.js h\u00e4r, PHP d\u00e4r, Python h\u00e4r, n\u00e5gon grej p\u00e5 Erlang, f\u00f6rst\u00e5r vi att vi inte vill skriva samma kod \u00f6verallt. S\u00e5 OpenResty kan s\u00e4ttas p\u00e5 fronten.<\/p>\n<\/li>\n<li><strong>Statistik och analys<\/strong>. Vanligtvis st\u00e5r NGINX vid ing\u00e5ngen, och alla f\u00f6rfr\u00e5gningar g\u00e5r genom honom. Just p\u00e5 denna plats \u00e4r det mycket bekv\u00e4mt att samla. Man kan r\u00e4kna n\u00e5got direkt och skicka det n\u00e5gonstans, till exempel till Elasticsearch, Logstash eller helt enkelt logga det och sedan skicka det n\u00e5gonstans.\n<\/li>\n<li><strong>Flerspelarsystem<\/strong>. Till exempel \u00e4r det ocks\u00e5 mycket bra att g\u00f6ra online-spel. Idag i Kapstaden kommer Alexander Gladysh att ber\u00e4tta hur man snabbt prototyperar ett flerspelarspel med hj\u00e4lp av OpenResty.\n<\/li>\n<li><strong>Filtrering av f\u00f6rfr\u00e5gningar (WAF)<\/strong>. Nu \u00e4r det popul\u00e4rt att g\u00f6ra alla m\u00f6jliga web application firewalls, det finns m\u00e5nga tj\u00e4nster som tillhandah\u00e5ller dem. Med hj\u00e4lp av OpenResty kan du skapa en web application firewall som enkelt och smidigt filtrerar f\u00f6rfr\u00e5gningar enligt dina krav. Om du har Python f\u00f6rst\u00e5r du att PHP inte kan injiceras, om du inte spawnar det n\u00e5gonstans fr\u00e5n konsolen. Du vet att du har MySQL och Python. Kanske kan de f\u00f6rs\u00f6ka g\u00f6ra n\u00e5gon typ av directory traversal och injicera n\u00e5got i databasen. D\u00e4rf\u00f6r kan man snabbt och billigt filtrera bort misst\u00e4nkt f\u00f6rfr\u00e5gningar direkt p\u00e5 fronten.\n<\/li>\n<li><strong>Gemenskap.<\/strong> Eftersom OpenResty \u00e4r byggt p\u00e5 NGINX har det en bonus - det \u00e4r <strong>NGINX-gemenskap<\/strong>Det \u00e4r mycket stort, och en betydande del av de fr\u00e5gor som du kan ha i b\u00f6rjan har redan l\u00f6sts av NGINX-communityt.\n<p><strong>Lua-utvecklare<\/strong>I g\u00e5r pratade jag med killarna som kom p\u00e5 utbildningsdagen HighLoad++ och h\u00f6rde att endast Tarantool \u00e4r skrivet p\u00e5 Lua. S\u00e5 \u00e4r det inte, det \u00e4r mycket som \u00e4r skrivet i Lua. Exempel: OpenResty, XMPP-servern Prosody, spelmotorn Love2D, Lua scriptas i Warcraft och p\u00e5 andra st\u00e4llen. Det finns m\u00e5nga Lua-utvecklare, och deras community \u00e4r stort och lyh\u00f6rt. Alla mina fr\u00e5gor om Lua blev l\u00f6sta inom n\u00e5gra timmar. N\u00e4r man skriver till mailinglistan f\u00e5r man bokstavligen svar inom n\u00e5gra minuter, de f\u00f6rklarar vad och hur, vad som \u00e4r vad. Det \u00e4r riktigt bra. Tyv\u00e4rr \u00e4r det inte alltid s\u00e5 h\u00e4r v\u00e4nligt st\u00e4mning i andra communitys.<br \/>\nDet finns en GitHub f\u00f6r OpenResty, d\u00e4r kan man skapa en issue om n\u00e5got g\u00e5r s\u00f6nder. Det finns en mailinglista i Google Groups d\u00e4r man kan diskutera allm\u00e4nna fr\u00e5gor, och det finns en lista p\u00e5 kinesiska \u2013 kanske beh\u00e4rskar du inte engelska, men kan kinesiska.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Sammanfattning<\/h1>\n<p><\/p>\n<ul>\n<li>Jag hoppas att jag har kunnat f\u00f6rmedla att OpenResty \u00e4r ett v\u00e4ldigt bekv\u00e4mt ramverk anpassat f\u00f6r webben.<\/li>\n<li>Det har en l\u00e5g intr\u00e4destr\u00f6skel, eftersom koden liknar det vi skriver, spr\u00e5ket \u00e4r ganska enkelt och minimalistiskt.<\/li>\n<li>Det erbjuder asynkron I\/O utan callbacks, s\u00e5 vi kommer inte att ha den spagetti-kod som vi ibland kan f\u00e5 i NodeJS.<\/li>\n<li>Det har en enkel distribution, eftersom vi bara beh\u00f6ver NGINX med r\u00e4tt modul och v\u00e5r kod, s\u00e5 fungerar allt direkt.<\/li>\n<li>Ett stort och lyh\u00f6rt community.<\/li>\n<\/ul>\n<p>\nJag gick inte in p\u00e5 detaljer om hur routing g\u00f6rs, det skulle ha blivit en mycket l\u00e5ng ber\u00e4ttelse.<\/p>\n<p>Tack f\u00f6r uppm\u00e4rksamheten!<\/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=\"Spela 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 \u2013 OpenResty: vi g\u00f6r NGINX till en fullfj\u00e4drad applikationsserver<\/a><\/noindex><\/em><br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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 g\u00f6r NGINX till en fullfj\u00e4drad applikationsserver | ProHoster","description":"Vi publicerar \u00e5terigen en transkription.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}