OpenResty: að breyta NGINX í fullgildan forritaþjón

OpenResty: að breyta NGINX í fullgildan forritaþjónVið birtum aftur afrit af skýrslu ráðstefnunnar HighLoad++ 2016, sem fram fór í Skolkovo nálægt Moskvu dagana 7.-8. nóvember í fyrra. Vladimir Protasov útskýrir hvernig á að auka NGINX virkni með OpenResty og Lua.

Halló allir, ég heiti Vladimir Protasov, ég vinn hjá Parallels. Ég skal segja þér aðeins frá sjálfum mér. Ég eyði þremur fjórðu hluta ævi minnar í að skrifa kóða. Ég varð forritari til mergjar í bókstaflegri merkingu: stundum sé ég kóða í draumum mínum. Fjórðungur lífsins er iðnaðarþróun, ritun kóða sem fer beint í framleiðslu. Kóði sem sum ykkar nota en gera sér ekki grein fyrir honum.

Svo þú skilur hversu slæmt það var. Þegar ég var aðeins yngri kom ég og fékk þessa tveggja terabæta gagnagrunna. Það er mikið álag á alla hérna núna. Ég fór á ráðstefnur og spurði: „Strákar, segið mér, þið eigið stór gögn, er allt flott? Hvað ertu með margar bækistöðvar þar? Þeir svöruðu mér: „Við erum með 100 gígabæt! Ég sagði: "Svalt, 100 gígabæt!" Og ég var að hugsa með mér hvernig ég ætti að viðhalda pókerandlitinu vandlega. Þú heldur, já, krakkar eru flottir, og svo ferðu til baka og fiktar í þessum margra terabæta gagnagrunnum. Og þetta er að vera yngri. Geturðu ímyndað þér hvaða áfall þetta er?

Ég kann meira en 20 forritunarmál. Þetta er eitthvað sem ég þurfti að átta mig á þegar ég vann. Þeir gefa þér kóða í Erlang, C, C++, Lua, Python, Ruby, eitthvað annað, og þú verður að klippa þetta allt. Almennt séð varð ég að gera það. Ekki var hægt að reikna út nákvæma tölu en einhvers staðar í kringum 20. týndist talan.

Þar sem allir viðstaddir vita hvað Parallels er og hvað við gerum, mun ég ekki tala um hversu flott við erum og hvað við gerum. Ég skal bara segja þér að við erum með 13 skrifstofur um allan heim, meira en 300 starfsmenn, þróun í Moskvu, Tallinn og Möltu. Ef þú vilt geturðu tekið það og flutt til Möltu ef það er kalt á veturna og þú þarft að hita bakið.

Nánar tiltekið, deildin okkar skrifar í Python 2. Við erum í viðskiptum og höfum engan tíma til að innleiða tískutækni, svo við þjáumst. Við notum Django því hann hefur allt og við tókum það sem var óþarfi og hentum því frá okkur. Einnig MySQL, Redis og NGINX. Við eigum líka fullt af öðru flottu. Við erum með MongoDB, við erum með kanínur á hlaupum, við höfum allt - en það er ekki mitt og ég geri það ekki.

OpenResty

Ég sagði frá sjálfum mér. Við skulum reikna út hvað ég ætla að tala um í dag:

  • Hvað er OpenResty og með hverju er það borðað?
  • Til hvers að finna upp annað hjól þegar við erum með Python, NodeJS, PHP, Go og aðra flotta hluti sem allir eru ánægðir með?
  • Og nokkur dæmi úr lífinu. Ég þurfti að klippa skýrsluna mikið því það tók mig 3,5 tíma, svo það verða fá dæmi.

OpenResty er NGINX. Þökk sé honum erum við með fullgildan vefþjón sem er vel skrifaður og virkar hratt. Ég held að við notum flest NGINX í framleiðslu. Þið vitið öll að hann er fljótur og flottur. Þeir gerðu flott samstillt I/O í því, svo við þurfum ekki að hjóla neitt, alveg eins og þeir gáfu í Python. Gevent er flott, frábært, en ef þú skrifar C kóða og eitthvað fer úrskeiðis, þá verður þú brjálaður að kemba hann með Gevent. Ég hafði reynsluna: það tók tvo heila daga að komast að því hvað fór úrskeiðis þar. Ef einhver hefði ekki grafið um í nokkrar vikur, fundið vandamálið, skrifað á netið og Google hefði ekki fundið það, þá hefðum við orðið alveg brjálaðir.

NGINX er nú þegar með skyndiminni og kyrrstætt efni gert. Þú þarft ekki að hafa áhyggjur af því hvernig á að gera þetta mannlega, svo að þú hægir ekki á þér einhvers staðar, svo að þú tapir ekki lýsingum einhvers staðar. Nginx er mjög þægilegt í notkun, þú þarft ekki að hugsa um hvað á að taka - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx var sett upp, gefið stjórnendum, þeir vita hvernig á að vinna með það. Nginx vinnur úr beiðnum á skipulegan hátt. Ég mun tala um þetta aðeins síðar. Í stuttu máli, það hefur áfanga þegar það samþykkti beiðnina, þegar það afgreiddi hana og þegar það afgreiddi efnið til notandans.

Nginx er flott, en það er eitt vandamál: það er ekki nógu sveigjanlegt, jafnvel með öllum þeim flottu eiginleikum sem strákarnir hafa troðið inn í stillinguna, þrátt fyrir það sem hægt er að stilla. Þetta vald er ekki nóg. Það er ástæðan fyrir því að strákarnir frá Taobao, fyrir löngu síðan, að því er virðist fyrir átta árum, byggðu Lua inn í það. Hvað gefur það?

  • Stærð. Það er lítið. LuaJIT gefur um 100-200 kílóbæti af minniskostnaði og lágmarks afköst.
  • Speed. LuaJIT túlkurinn er nálægt C í mörgum aðstæðum, í sumum aðstæðum tapar hann fyrir Java, í öðrum er hann betri en hann. Í nokkurn tíma var það álitið nýjustu tækni, flottasti JIT þýðandinn. Nú eru til svalari, en þeir eru mjög þungir, til dæmis sami V8. Sumir JS túlkar og Java HotSpot eru hraðari á sumum stöðum, en sums staðar tapa þeir samt.
  • Auðvelt að læra. Ef þú ert, segjum, Perl kóða grunn, og þú ert ekki að bóka, munt þú ekki finna Perl forritara. Vegna þess að þeir eru ekki til voru þeir allir teknir í burtu og það er langt og erfitt að kenna þeim. Ef þú vilt forritara fyrir eitthvað annað gætirðu líka þurft að endurþjálfa þá eða finna þá. Í tilfelli Lua er allt einfalt. Allir yngri geta lært Lua á þremur dögum. Það tók mig um tvo tíma að átta mig á því. Tveimur tímum síðar var ég þegar að skrifa kóða í framleiðslu. Um viku síðar fór hann beint í framleiðslu og fór.

Fyrir vikið lítur þetta svona út:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Það er margt hérna. OpenResty hefur safnað saman fullt af einingum, bæði luash og vél. Og þú ert með allt tilbúið - komið á vettvang og unnið.

dæmi

Nóg af textanum, við skulum halda áfram að kóðanum. Hér er smá Hello World:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Hvað er þarna? Þetta er Engins staðsetning. Við höfum engar áhyggjur, við skrifum ekki okkar eigin leið, við tökum ekki tilbúna leið - við höfum það nú þegar í NGINX, við lifum góðu og letilegu lífi.

content_by_lua_block er blokk sem segir að við séum að þjóna efni með Lua handriti. Við tökum Engins breytuna remote_addr og settu það inn string.format. Þetta er það sama og sprintf, aðeins í Lua, aðeins rétt. Og við gefum viðskiptavininum það.

Þar af leiðandi mun það líta svona út:

OpenResty: að breyta NGINX í fullgildan forritaþjón

En snúum okkur aftur að hinum raunverulega heimi. Enginn sendir Hello World til framleiðslu. Umsóknin okkar fer venjulega í gagnagrunninn eða einhvers staðar annars staðar og bíður oftast eftir svari.

OpenResty: að breyta NGINX í fullgildan forritaþjón

Hann situr bara og bíður. Það er ekki mjög gott. Þegar 100.000 notendur koma er það mjög erfitt fyrir okkur. Svo við skulum nota einfalt forrit sem dæmi. Við munum leita að myndum, til dæmis af köttum. En við munum ekki bara leita, við munum auka leitarorðin og ef notandinn leitaði að „kettlingum“ munum við finna ketti, loðna ketti og svo framvegis. Í fyrsta lagi þurfum við að fá beiðnigögnin á bakendanum. Það lítur svona út:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Tvær línur gera þér kleift að taka upp GET breytur, engar fylgikvilla. Næst skulum við segja að úr gagnagrunni með merki fyrir leitarorð og viðbót fáum við þessar upplýsingar með venjulegri SQL fyrirspurn. Það er einfalt. Það lítur svona út:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Að tengja bókasafnið resty.mysql, sem við höfum nú þegar í settinu. Við þurfum ekki að setja neitt upp, allt er tilbúið. Við tilgreinum hvernig á að tengjast og gera SQL fyrirspurn:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Það er svolítið skelfilegt hérna, en allt virkar. Hér eru 10 mörkin. Við drögum út 10 færslur, við erum löt, við viljum ekki sýna fleiri. Ég gleymdi takmörkunum í SQL.

Næst finnum við myndir fyrir allar fyrirspurnir. Við tökum saman fullt af beiðnum og fyllum út Lua töflu sem heitir reqs, og það gerum við ngx.location.capture_multi.

OpenResty: að breyta NGINX í fullgildan forritaþjón

Allar þessar beiðnir eru sendar samhliða og svör eru send til okkar. Vinnutíminn er jöfn viðbragðstíma þess hægasta. Ef við skjótum öll á 50 millisekúndum og við sendum hundrað beiðnir, þá fáum við svar eftir 50 millisekúndur.

Þar sem við erum löt og viljum ekki skrifa HTTP og meðhöndlun skyndiminni, munum við láta NGINX gera allt fyrir okkur. Eins og þú sást var beiðni um url/fetch, hér er hann:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Við gerum það einfalt proxy_pass, við tilgreinum hvar á að vista skyndiminni, hvernig á að gera það og allt virkar fyrir okkur.

En þetta er ekki nóg, við þurfum samt að gefa notandanum gögnin. Einfaldasta hugmyndin er að raðgreina allt í JSON, auðveldlega, í tveimur línum. Við gefum Content-Type, við gefum JSON.

En það er eitt vandamál: notandinn vill ekki lesa JSON. Við þurfum að laða að framhliða þróunaraðila. Stundum viljum við ekki gera þetta fyrst. Og SEO sérfræðingar munu segja að ef við erum að leita að myndum, þá skiptir það þá ekki máli. Og ef við gefum þeim eitthvað efni munu þeir segja að leitarvélarnar okkar skrái ekki neitt.

Hvað á að gera við því? Auðvitað munum við gefa notandanum HTML. Að búa til í höndunum er ekki comme il faut, svo við viljum nota sniðmát. Það er bókasafn fyrir þetta lua-resty-template.

OpenResty: að breyta NGINX í fullgildan forritaþjón

Þú hefur líklega séð þrjá skelfilegu stafina OPM. OpenResty kemur með eigin pakkastjóra, þar sem þú getur sett upp fullt af mismunandi einingum, einkum, lua-resty-template. Þetta er einföld sniðmátsvél, svipað og Django sniðmát. Þar er hægt að skrifa kóða og framkvæma breytuskipti.

Fyrir vikið mun allt líta svona út:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Við tókum gögnin og gerðum sniðmátið, aftur í tveimur línum. Notandinn er ánægður, hann fékk ketti. Þar sem við víkkuðum út beiðnina fékk hann líka loðsel fyrir kettlinga. Maður veit aldrei, kannski var hann að leita að nákvæmlega þessu en gat ekki orðað beiðni sína rétt.

Allt er flott, en við erum í þróun og viljum ekki sýna notendum það ennþá. Við skulum gera heimildina. Til að gera þetta skulum við skoða hvernig NGINX meðhöndlar beiðnina í OpenResty skilmálum:

  • Fyrsti áfangi - aðgang, þegar notandinn var nýkominn, og við skoðuðum hann eftir hausum, eftir IP tölu og öðrum gögnum. Við getum klippt það strax af ef okkur líkar það ekki. Þetta er hægt að nota til heimildar, eða ef við fáum margar beiðnir, getum við auðveldlega lokað þeim á þessum áfanga.
  • umrita. Við endurskrifum nokkur beiðnigögn.
  • efni. Við afhendum notandanum efnið.
  • hausasía. Við skiptum út svarhausunum. Ef við notuðum proxy_pass, getum við endurskrifað nokkra hausa áður en við gefum það notandanum.
  • líkamssía. Við getum breytt líkamanum.
  • skrá — skógarhögg. Þú getur skrifað logs í elasticsearch án viðbótarlags.

Heimild okkar mun líta einhvern veginn svona út:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Við bætum þessu við það location, sem við lýstum áður, og settu eftirfarandi kóða þar:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Við athugum hvort við eigum smákökulykil. Ef ekki, þá biðjum við um leyfi. Notendur eru slægir og geta giskað á að þeir þurfi að setja smákökulykil. Þess vegna munum við einnig setja það í Redis:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Kóðinn til að vinna með Redis er mjög einfaldur og er ekkert frábrugðinn öðrum tungumálum. Á sama tíma er allt inntak/úttak, hér og þar, ekki að loka. Ef þú skrifar samstilltan kóða virkar hann ósamstilltur. Næstum eins og gevent, en vel gert.

OpenResty: að breyta NGINX í fullgildan forritaþjón

Við skulum gera heimildina sjálfa:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Við segjum að við þurfum að lesa meginmál beiðninnar. Við fáum POST rök og athugum að innskráning og lykilorð séu rétt. Ef þær eru rangar skorum við á þig um heimild. Og ef rétt er skrifaðu táknið í Redis:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Ekki gleyma að stilla kökuna, þetta er líka gert í tveimur línum:

OpenResty: að breyta NGINX í fullgildan forritaþjón

Dæmið er einfalt og íhugandi. Auðvitað munum við ekki búa til þjónustu sem sýnir fólki ketti. En hver þekkir okkur. Svo skulum við fara yfir hvað er hægt að gera í framleiðslu.

  • Minimalistic backend. Stundum þurfum við að senda aðeins smá gögn til bakendans: einhvers staðar þurfum við að setja inn dagsetningu, einhvers staðar þurfum við að birta lista, segja hversu margir notendur eru á síðunni núna, hengja við teljara eða tölfræði. Eitthvað svo lítið. Sumir lágmarksstykki er hægt að gera mjög auðveldlega. Þetta mun gera það fljótlegt, auðvelt og frábært.
  • Forvinnsla gagna. Stundum viljum við setja auglýsingar inn á síðuna okkar og við fáum þessar auglýsingar með því að nota API beiðnir. Þetta er mjög auðvelt að gera hér. Við hleðjum ekki bakendann okkar, sem situr nú þegar og vinnur hörðum höndum. Þú getur sótt það og sótt það hér. Við getum lagað saman JS eða öfugt, aftengt það og forunnið eitthvað áður en það er gefið notandanum.
  • Framhlið fyrir örþjónustu. Þetta er líka mjög gott mál, ég útfærði það. Þar áður starfaði ég hjá Tenzor, fyrirtæki sem sinnir rafrænum skýrslugerðum og veitir skýrslugjöf til um það bil helmings lögaðila í landinu. Við bjuggum til þjónustu, margt var gert þar með sama kerfi: leið, heimild og fleira.
    OpenResty er hægt að nota sem límið fyrir örþjónustuna þína, sem veitir einn aðgang að öllu og einu viðmóti. Þar sem hægt er að skrifa örþjónustur á þann hátt að þú hafir Node.js hér, PHP hér, Python hér, eitthvað Erlang hér, skiljum við að við viljum ekki endurskrifa sama kóða alls staðar. Þess vegna er hægt að tengja OpenResty við framhliðina.

  • Tölfræði og greiningar. Venjulega er NGINX við innganginn og allar beiðnir fara í gegnum það. Það er á þessum stað sem það er mjög þægilegt að safna. Þú getur strax reiknað eitthvað og hlaðið því upp einhvers staðar, til dæmis Elasticsearch, Logstash, eða einfaldlega skrifað það í loggið og sent það svo eitthvað.
  • Fjölnotendakerfi. Til dæmis er líka mjög gott að búa til netleiki. Í dag í Höfðaborg mun Alexander Gladysh tala um hvernig á að gera fljótlega frumgerð af fjölspilunarleik með OpenResty.
  • Beiðni um síun (WAF). Nú á dögum er það í tísku að búa til alls kyns eldveggi fyrir vefforrit; það eru margar þjónustur sem veita þær. Með því að nota OpenResty geturðu búið til eldvegg fyrir vefforrit sem síar beiðnir á einfaldan og auðveldan hátt í samræmi við kröfur þínar. Ef þú ert með Python, þá skilurðu að PHP verður örugglega ekki sprautað inn í þig, nema auðvitað að þú kveikir það hvar sem er frá stjórnborðinu. Þú veist að þú ert með MySQL og Python. Sennilega gætu þeir reynt að fara í einhvers konar möppu og sprauta einhverju inn í gagnagrunninn. Þess vegna geturðu síað út skrítnar fyrirspurnir fljótt og ódýrt beint að framan.
  • Samfélag. Þar sem OpenResty er byggt á NGINX hefur það bónus - þetta NGINX samfélag. Það er mjög stórt og ágætis hluti af spurningunum sem þú munt hafa í fyrstu hefur þegar verið leyst af NGINX samfélaginu.

    Lua verktaki. Í gær talaði ég við strákana sem komu á HighLoad++ þjálfunardaginn og heyrði að aðeins Tarantool væri skrifað í Lua. Þetta er ekki satt, margt er skrifað í Lua. Dæmi: OpenResty, Prosody XMPP þjónn, Love2D leikjavél, Lua skrifað í Warcraft og víðar. Það eru margir Lua forritarar, þeir eru með stórt og móttækilegt samfélag. Allar Lua spurningar mínar voru leystar innan nokkurra klukkustunda. Þegar þú skrifar á póstlistann, bókstaflega innan nokkurra mínútna, eru nú þegar fullt af svörum, sem lýsa hverju og hvernig, hvað er hvað. Það er frábært. Því miður er slíkt andlegt samfélag ekki alls staðar.
    Það er GitHub fyrir OpenResty, þar sem þú getur opnað mál ef eitthvað er bilað. Það er póstlisti á Google Groups, þar sem þú getur rætt almenn málefni, það er póstlisti á kínversku - þú veist aldrei, kannski talar þú ekki ensku, en þú kannt kínversku.

Niðurstöður

  • Ég vona að mér hafi tekist að koma því á framfæri að OpenResty er mjög þægilegur rammi sniðinn fyrir vefinn.
  • Það hefur litla aðgangshindrun, þar sem kóðinn er svipaður og við skrifum á, tungumálið er frekar einfalt og naumhyggjulegt.
  • Það veitir ósamstillt I/O án svarhringinga, við munum ekki hafa neinar núðlur eins og við getum stundum skrifað í NodeJS.
  • Það hefur auðvelda dreifingu, þar sem við þurfum aðeins NGINX með nauðsynlegri einingu og kóðanum okkar, og allt virkar strax.
  • Stórt og móttækilegt samfélag.

Ég sagði ekki í smáatriðum hvernig routing er háttað, það reyndist vera mjög löng saga.

Svara með tilvísun!


Vladimir Protasov - OpenResty: að breyta NGINX í fullgildan forritaþjón

Heimild: www.habr.com

Bæta við athugasemd