OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotëPo publikojmë sërish transkriptin e raportit të konferencës Ngarkesë e lartë ++ 2016, e cila u zhvillua në Skolkovo afër Moskës në 7-8 nëntor të vitit të kaluar. Vladimir Protasov shpjegon se si të zgjerohet funksionaliteti NGINX me OpenResty dhe Lua.

Përshëndetje të gjithëve, emri im është Vladimir Protasov, unë punoj në Parallels. Unë do t'ju tregoj pak për veten time. Kaloj tre të katërtat e jetës sime duke shkruar kode. U bëra programues deri në thelb në kuptimin e mirëfilltë: ndonjëherë shoh kod në ëndrrat e mia. Një e katërta e jetës është zhvillim industrial, duke shkruar kodin që shkon direkt në prodhim. Një kod që disa prej jush e përdorin por nuk e kuptojnë.

Kështu që ju e kuptoni sa keq ishte. Kur isha pak i ri, erdha dhe m'u dhanë këto baza të dhënash prej dy terabajt. Është një ngarkesë e madhe për të gjithë këtu tani. Shkova në konferenca dhe pyeta: “Djema, më thoni, keni të dhëna të mëdha, a është gjithçka e mirë? Sa baza keni atje? Ata më përgjigjen: "Ne kemi 100 gigabajt!" Unë thashë: "Fol, 100 gigabajt!" Dhe po mendoja me vete se si ta ruaja me kujdes fytyrën time të pokerit. Ju mendoni, po, djemtë janë të lezetshëm, dhe pastaj ktheheni dhe ndërroni këto baza të dhënash me shumë terabajt. Dhe kjo është të qenit një junior. Mund ta imagjinoni se çfarë goditjeje është kjo?

Unë di më shumë se 20 gjuhë programimi. Kjo është diçka që duhej ta kuptoja ndërsa punoja. Ata ju japin kodin në Erlang, C, C++, Lua, Python, Ruby, diçka tjetër dhe ju duhet t'i shkurtoni të gjitha. Në përgjithësi, më duhej. Nuk ishte e mundur të llogaritet numri i saktë, por diku rreth datës 20 numri humbi.

Meqenëse të gjithë të pranishmit e dinë se çfarë është Parallels dhe çfarë bëjmë ne, nuk do të flas se sa mirë jemi dhe çfarë bëjmë. Unë thjesht do t'ju them se ne kemi 13 zyra në mbarë botën, më shumë se 300 punonjës, zhvillim në Moskë, Talin dhe Maltë. Nëse dëshironi, mund ta merrni dhe të zhvendoseni në Maltë nëse është ftohtë në dimër dhe ju duhet të ngrohni shpinën.

Konkretisht, departamenti ynë shkruan në Python 2. Ne jemi në biznes dhe nuk kemi kohë për të zbatuar teknologji në modë, ndaj vuajmë. Ne përdorim Django sepse ka gjithçka, dhe morëm atë që ishte e panevojshme dhe e hodhëm. Gjithashtu MySQL, Redis dhe NGINX. Kemi edhe shumë gjëra të tjera të lezetshme. Ne kemi MongoDB, kemi lepuj që vrapojnë, ne kemi gjithçka - por nuk është e imja, dhe unë nuk e bëj.

OpenResty

I thashë për veten time. Le të kuptojmë se për çfarë do të flas sot:

  • Çfarë është OpenResty dhe me çfarë hahet?
  • Pse të rishpikni një rrotë tjetër kur kemi Python, NodeJS, PHP, Go dhe gjëra të tjera interesante me të cilat të gjithë janë të kënaqur?
  • Dhe disa shembuj nga jeta. M'u desh ta shkurtoja shumë raportin sepse m'u deshën 3,5 orë, kështu që do të ketë pak shembuj.

OpenResty është NGINX. Falë tij, ne kemi një server në internet të plotë që është i shkruar mirë dhe funksionon shpejt. Unë mendoj se shumica prej nesh përdorin NGINX në prodhim. Të gjithë e dini se ai është i shpejtë dhe i lezetshëm. Ata bënë hyrje/dalje sinkrone të lezetshme në të, kështu që ne nuk kemi nevojë të ciklojmë asgjë, ashtu siç bënë gevent në Python. Gevent është i mirë, i shkëlqyeshëm, por nëse shkruani kodin C dhe diçka nuk shkon, atëherë me Gevent do të çmendeni duke e korrigjuar atë. Unë pata përvojën: u deshën dy ditë të tëra për të kuptuar se çfarë shkoi keq atje. Nëse dikush nuk do të kishte gërmuar përreth për disa javë, nuk do të kishte gjetur problemin, do të shkruante në internet dhe Google nuk do ta kishte gjetur, atëherë do të ishim çmendur plotësisht.

NGINX tashmë ka kryer memorien dhe përmbajtjen statike. Ju nuk keni nevojë të shqetësoheni se si ta bëni këtë në mënyrë njerëzore, në mënyrë që të mos ngadalësoni diku, në mënyrë që të mos humbni përshkruesit diku. Nginx është shumë i përshtatshëm për t'u vendosur, nuk keni nevojë të mendoni se çfarë të merrni - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx u instalua, iu dha administratorëve, ata dinë të punojnë me të. Nginx përpunon kërkesat në një mënyrë të strukturuar. Unë do të flas për këtë pak më vonë. Me pak fjalë, ai ka një fazë kur sapo pranoi kërkesën, kur e përpunoi atë dhe kur i shërbeu përmbajtjen përdoruesit.

Nginx është i lezetshëm, por ka një problem: nuk është mjaft fleksibël, edhe me të gjitha tiparet e lezetshme që djemtë kanë ngjeshur në konfigurim, pavarësisht nga ajo që mund të konfigurohet. Kjo fuqi nuk mjafton. Kjo është arsyeja pse djemtë nga Taobao, shumë kohë më parë, duket si tetë vjet më parë, e ndërtuan Luan në të. Çfarë jep?

  • Размер. Eshte e vogel. LuaJIT jep rreth 100-200 kilobajt memorie të përgjithshme dhe kosto minimale të performancës.
  • Shpejtësi. Përkthyesi LuaJIT është afër C në shumë situata, në disa situata humbet me Java, në disa të tjera e tejkalon atë. Për ca kohë u konsiderua gjendja e artit, përpiluesi më i lezetshëm JIT. Tani ka më të ftohta, por ato janë shumë të rënda, për shembull, i njëjti V8. Disa përkthyes JS dhe Java HotSpot janë më të shpejtë në disa pika, por në disa vende ata ende humbasin.
  • Lehtë për t'u mësuar. Nëse keni, të themi, një bazë kodi Perl dhe nuk jeni duke rezervuar, nuk do të gjeni programues Perl. Për shkak se ato nuk ekzistojnë, të gjitha u hoqën dhe mësimi i tyre është i gjatë dhe i vështirë. Nëse dëshironi programues për diçka tjetër, mund t'ju duhet gjithashtu t'i rikualifikoni ose t'i gjeni. Në rastin e Luas gjithçka është e thjeshtë. Çdo i ri mund të mësojë Luan në tre ditë. M'u deshën rreth dy orë për ta kuptuar. Dy orë më vonë unë tashmë po shkruaja kodin në prodhim. Rreth një javë më vonë ai shkoi direkt në prodhim dhe u largua.

Si rezultat, duket kështu:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Këtu ka shumë. OpenResty ka mbledhur një mori modulesh, si ato luash ashtu edhe ato motorike. Dhe ju keni gjithçka gati - të vendosur dhe duke punuar.

shembuj

Mjaft me tekstet, le të kalojmë te kodi. Këtu keni një Hello World:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Çfarë ka atje? Ky është një vend në Engins. Ne nuk shqetësohemi, nuk shkruajmë rrugën tonë, nuk marrim ndonjë të gatshme - e kemi tashmë në NGINX, jetojmë një jetë të mirë dhe dembel.

content_by_lua_block është një bllok që thotë se ne po shërbejmë përmbajtje duke përdorur një skript Lua. Marrim variablin Engins remote_addr dhe futeni atë string.format. Kjo është njësoj si sprintf, vetem ne Lua, vetem korrekte. Dhe ne ia japim klientit.

Si rezultat, do të duket kështu:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Por le të kthehemi në botën reale. Askush nuk e vendos Hello World në prodhim. Aplikacioni ynë zakonisht shkon në bazën e të dhënave ose diku tjetër dhe shumicën e kohës pret për një përgjigje.

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Ai vetëm ulet dhe pret. Nuk është shumë mirë. Kur vijnë 100.000 përdorues, është shumë e vështirë për ne. Pra, le të përdorim një aplikacion të thjeshtë si shembull. Ne do të kërkojmë fotografi, për shembull, të maceve. Por ne nuk do të kërkojmë vetëm, ne do të zgjerojmë fjalët kyçe dhe, nëse përdoruesi ka kërkuar për "kotele", ne do të gjejmë mace, mace me gëzof, e kështu me radhë. Së pari, ne duhet të marrim të dhënat e kërkesës në backend. Duket kështu:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Dy rreshta ju lejojnë të zgjidhni parametrat GET, pa komplikime. Më pas, le të themi, nga një bazë të dhënash me një shenjë për një fjalë kyçe dhe shtesë, ne e marrim këtë informacion duke përdorur një pyetje të rregullt SQL. Është e thjeshtë. Duket kështu:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Lidhja e bibliotekës resty.mysql, të cilën e kemi tashmë në komplet. Nuk kemi nevojë të instalojmë asgjë, gjithçka është gati. Ne tregojmë se si të lidhemi dhe të bëjmë një pyetje SQL:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Është pak e frikshme këtu, por gjithçka funksionon. Këtu 10 është kufiri. Ne nxjerrim 10 hyrje, jemi dembelë, nuk duam të tregojmë më shumë. Kam harruar kufirin në SQL.

Më pas gjejmë foto për të gjitha pyetjet. Ne mbledhim një mori kërkesash dhe plotësojmë një tabelë të quajtur Lua reqs, dhe ne e bëjmë ngx.location.capture_multi.

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Të gjitha këto kërkesa dërgohen paralelisht dhe përgjigjet na kthehen. Koha e funksionimit është e barabartë me kohën e përgjigjes së më të ngadalshmes. Nëse të gjithë qëllojmë në 50 milisekonda, dhe kemi dërguar njëqind kërkesa, atëherë do të marrim një përgjigje në 50 milisekonda.

Meqenëse jemi dembelë dhe nuk duam të shkruajmë HTTP dhe trajtimin me memorie të fshehtë, do ta bëjmë NGINX të bëjë gjithçka për ne. Siç e patë, kishte një kërkesë për url/fetch, këtu është ai:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Ne e bëjmë të thjeshtë proxy_pass, ne tregojmë se ku të ruajmë memorien, si ta bëjmë atë dhe gjithçka funksionon për ne.

Por kjo nuk mjafton, ne ende duhet t'i japim të dhënat përdoruesit. Ideja më e thjeshtë është të serializoni gjithçka në JSON, lehtësisht, në dy rreshta. Ne japim Content-Type, ne japim JSON.

Por ka një vështirësi: përdoruesi nuk dëshiron të lexojë JSON. Ne duhet të tërheqim zhvillues të nivelit të parë. Ndonjëherë ne nuk duam ta bëjmë këtë në fillim. Dhe specialistët e SEO do të thonë se nëse po kërkojmë fotografi, atëherë nuk ka rëndësi për ta. Dhe nëse u japim disa përmbajtje, ata do të thonë se motorët tanë të kërkimit nuk indeksojnë asgjë.

Çfarë duhet bërë për këtë? Sigurisht, ne do t'i japim përdoruesit HTML. Gjenerimi me dorë nuk është comme il faut, ndaj duam të përdorim shabllone. Ekziston një bibliotekë për këtë lua-resty-template.

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Me siguri i keni parë tre letrat e frikshme OPM. OpenResty vjen me menaxherin e vet të paketave, përmes të cilit mund të instaloni një mori modulesh të ndryshme, në veçanti, lua-resty-template. Ky është një motor i thjeshtë shabllonesh, i ngjashëm me shabllonet e Django. Aty mund të shkruani kod dhe të kryeni zëvendësimin e variablave.

Si rezultat, gjithçka do të duket diçka si kjo:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Ne morëm të dhënat dhe bëmë shabllonin, përsëri në dy rreshta. Përdoruesi është i lumtur, ai mori macet. Meqenëse e zgjeruam kërkesën, ai mori edhe një vulë lesh për kotele. Asnjëherë nuk e dini, ndoshta ai po kërkonte pikërisht këtë, por nuk mund ta formulonte saktë kërkesën e tij.

Gjithçka është e mirë, por ne jemi në zhvillim dhe nuk duam t'ua tregojmë ende përdoruesve. Le të bëjmë autorizimin. Për ta bërë këtë, le të shohim se si NGINX trajton kërkesën në kushtet e OpenResty:

  • Faza e parë - hyrje, kur përdoruesi sapo mbërriti, dhe ne e shikuam atë sipas titujve, sipas adresës IP dhe sipas të dhënave të tjera. Mund ta ndërpresim menjëherë nëse nuk na pëlqen. Kjo mund të përdoret për autorizim, ose nëse marrim shumë kërkesa, mund t'i ndërpresim lehtësisht në këtë fazë.
  • rishkruaj. Ne rishkruajmë disa të dhëna kërkesash.
  • përmbajtje. Ne ia dorëzojmë përmbajtjen përdoruesit.
  • filtri i titujve. Ne zëvendësojmë titujt e përgjigjeve. Nëse do të përdornim proxy_pass, mund të rishkruajmë disa tituj përpara se t'ia japim përdoruesit.
  • filtri i trupit. Ne mund ta ndryshojmë trupin.
  • hyni - prerje. Ju mund të shkruani regjistra në elasticsearch pa një shtresë shtesë.

Autorizimi ynë do të duket diçka si kjo:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Ne do t'ia shtojmë këtë atij location, të cilin e përshkruam më parë dhe vendosim kodin e mëposhtëm atje:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Ne shikojmë të shohim nëse kemi një shenjë cookie. Nëse jo, atëherë kërkojmë autorizim. Përdoruesit janë dinakë dhe mund të marrin me mend se duhet të vendosin një token cookie. Prandaj, do ta vendosim edhe në Redis:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Kodi për të punuar me Redis është shumë i thjeshtë dhe nuk ndryshon nga gjuhët e tjera. Në të njëjtën kohë, të gjitha hyrjet/daljet, aty-këtu, nuk bllokohen. Nëse shkruani kod sinkron, ai funksionon në mënyrë asinkrone. Pothuajse si gevent, por e bërë mirë.

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Le të bëjmë vetë autorizimin:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Ne themi se duhet të lexojmë pjesën e përgjithshme të kërkesës. Ne marrim argumente POST dhe kontrollojmë nëse hyrja dhe fjalëkalimi janë të sakta. Nëse janë të pasakta, atëherë ne ju sfidojmë për autorizim. Dhe nëse është e saktë, atëherë shkruani shenjën në Redis:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Mos harroni të vendosni cookie-n, kjo bëhet gjithashtu në dy rreshta:

OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Shembulli është i thjeshtë dhe spekulativ. Sigurisht, ne nuk do të bëjmë një shërbim që u tregon njerëzve macet. Por kush na njeh. Pra, le të shohim se çfarë mund të bëhet në prodhim.

  • Backend minimalist. Ndonjëherë na duhet të nxjerrim vetëm pak të dhëna në backend: diku duhet të fusim një datë, diku duhet të shfaqim një listë, të themi se sa përdorues janë në faqe tani, të bashkëngjitni një numërues ose statistika. Diçka kaq e vogël. Disa pjesë minimale mund të bëhen shumë lehtë. Kjo do ta bëjë atë të shpejtë, të lehtë dhe të shkëlqyeshëm.
  • Parapërpunimi i të dhënave. Ndonjëherë ne duam të vendosim reklama në faqen tonë dhe ne e marrim këtë reklamë duke përdorur kërkesat API. Kjo është shumë e lehtë për të bërë këtu. Ne nuk e ngarkojmë backend-in tonë, i cili tashmë është ulur dhe punon shumë. Mund ta merrni dhe ta grumbulloni këtu. Ne mund të bashkojmë disa JS ose, anasjelltas, ta shkëputim atë dhe të përpunojmë diçka përpara se t'ia japim përdoruesit.
  • Fasada per mikroservice. Edhe ky është një rast shumë i mirë, e kam zbatuar. Para kësaj, kam punuar në Tenzor, një kompani që merret me raportimin elektronik dhe ofron raportim për afërsisht gjysmën e personave juridikë në vend. Ne krijuam një shërbim, shumë gjëra u bënë atje duke përdorur të njëjtin mekanizëm: rrugëzim, autorizim dhe më shumë.
    OpenResty mund të përdoret si ngjitës për mikroshërbimet tuaja, duke siguruar një akses të vetëm në gjithçka dhe një ndërfaqe të vetme. Meqenëse mikroshërbimet mund të shkruhen në atë mënyrë që të keni Node.js këtu, PHP këtu, Python këtu, disa gjëra Erlang këtu, ne e kuptojmë se nuk duam të rishkruajmë të njëjtin kod kudo. Prandaj, OpenResty mund të lidhet në pjesën e përparme.

  • Statistika dhe analitika. Zakonisht NGINX është në hyrje dhe të gjitha kërkesat kalojnë përmes tij. Është në këtë vend që është shumë i përshtatshëm për t'u mbledhur. Mund të llogarisni menjëherë diçka dhe ta ngarkoni diku, për shembull, Elasticsearch, Logstash, ose thjesht ta shkruani në regjistër dhe më pas ta dërgoni diku.
  • Sisteme me shumë përdorues. Për shembull, lojërat në internet janë gjithashtu shumë të mira për t'u bërë. Sot në Cape Town, Alexander Gladysh do të flasë se si të prototiponi shpejt një lojë me shumë lojtarë duke përdorur OpenResty.
  • Kërko filtrim (WAF). Në ditët e sotme është në modë të bëhen të gjitha llojet e mureve të zjarrit të aplikacioneve në internet; ka shumë shërbime që i ofrojnë ato. Duke përdorur OpenResty, ju mund të bëni vetes një mur zjarri të aplikacionit në ueb që thjesht dhe lehtësisht do të filtrojë kërkesat sipas kërkesave tuaja. Nëse keni Python, atëherë e kuptoni që PHP definitivisht nuk do të injektohet tek ju, përveç nëse, sigurisht, e krijoni atë diku nga tastiera. Ju e dini që keni MySQL dhe Python. Ndoshta, ata mund të përpiqen të bëjnë një lloj kalimi të drejtorive dhe të injektojnë diçka në bazën e të dhënave. Prandaj, ju mund të filtroni pyetjet e çuditshme shpejt dhe me çmim të ulët pikërisht në pjesën e përparme.
  • Komuniteti Meqenëse OpenResty është ndërtuar në NGINX, ai ka një bonus - këtë Komuniteti NGINX. Është shumë i madh dhe një pjesë e mirë e pyetjeve që do të keni në fillim janë zgjidhur tashmë nga komuniteti NGINX.

    Zhvilluesit Lua. Dje fola me djemtë që erdhën në ditën e stërvitjes së HighLoad++ dhe dëgjova që në Lua ishte shkruar vetëm Tarantool. Kjo nuk është e vërtetë, shumë gjëra janë shkruar në Lua. Shembuj: OpenResty, serveri Prosody XMPP, motori i lojës Love2D, Lua i shkruar në Warcraft dhe gjetkë. Ka shumë zhvillues Lua, ata kanë një komunitet të madh dhe të përgjegjshëm. Të gjitha pyetjet e mia Lua u zgjidhën brenda pak orësh. Kur shkruani në listën e postimeve, fjalë për fjalë brenda pak minutash ka tashmë një mori përgjigjesh, që përshkruajnë çfarë dhe si, çfarë është çfarë. Është e mrekullueshme. Fatkeqësisht, një komunitet i tillë shpirtëror nuk është kudo.
    Ekziston GitHub për OpenResty, ku mund të hapni një problem nëse diçka prishet. Ekziston një listë postimesh në Grupet Google, ku mund të diskutoni çështje të përgjithshme, ka një listë postimesh në kinezisht - nuk e dini kurrë, ndoshta nuk flisni anglisht, por dini kinezisht.

Rezultatet e

  • Shpresoj se kam qenë në gjendje të përcjell se OpenResty është një kornizë shumë e përshtatshme e përshtatur për ueb.
  • Ka një pengesë të ulët për hyrjen, pasi kodi është i ngjashëm me atë në të cilin shkruajmë, gjuha është mjaft e thjeshtë dhe minimaliste.
  • Ofron hyrje/dalje asinkrone pa kthime të thirrjeve, nuk do të kemi asnjë noodle siç mund të shkruajmë ndonjëherë në NodeJS.
  • Ka vendosje të lehtë, pasi na duhet vetëm NGINX me modulin e nevojshëm dhe kodin tonë, dhe gjithçka funksionon menjëherë.
  • Komunitet i madh dhe i përgjegjshëm.

Nuk tregova në detaje se si bëhet rutimi, doli të ishte një histori shumë e gjatë.

Спасибо за внимание!


Vladimir Protasov - OpenResty: duke e kthyer NGINX në një server aplikacioni të plotë

Burimi: www.habr.com

Shto një koment