OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħAħna nerġgħu nippubblikaw it-traskrizzjoni tar-rapport mill-konferenza HighLoad ++ 2016, li saret fi Skolkovo qrib Moska fis-7-8 ta 'Novembru tas-sena li għaddiet. Vladimir Protasov jgħidlek kif testendi l-funzjonalità NGINX b'OpenResty u Lua.

Hello kulħadd, jisimni Vladimir Protasov, naħdem għal Parallels. Jien ngħidlek ftit dwari nnifsi. Inqatta’ tliet kwarti ta’ ħajti nikteb il-kodiċi. Sirt programmatur fil-qalba fis-sens letterali: kultant nara l-kodiċi fil-ħolm tiegħi. Kwart tal-ħajja huwa żvilupp industrijali, kitba ta 'kodiċi li tmur direttament fil-produzzjoni. Kodiċi li xi wħud minnkom jużaw imma ma jafux.

Biex tavżak kemm kienet ħażina. Meta kont żgħir żgħir, dħalt u tawni dawn iż-żewġ databases terabyte. Issa huwa hawn għal kulħadd highload. Mort għall-konferenzi u staqsejt: “Guys, għiduli, għandek big data, kollox tajjeb? Kemm għandek bażijiet hemm? Huma wieġbuni: “Għandna 100 gigabyte!” Jien għedt: “Kesaħ, 100 gigabyte!” U ħsibt bejni u bejn ruħi kif insalva pulit il-wiċċ tal-poker. Inti taħseb, iva, il-guys huma jibred, u mbagħad terġa 'lura u tpinġi dawn id-databases multi-terabyte. U dan qed ikun junior. Tista’ timmaġina x’hit hit?

Naf aktar minn 20 lingwa ta' programmar. Dan huwa dak li kelli nifhem waqt ix-xogħol. Jagħtuk kodiċi f'Erlang, f'C, f'C++, f'Lua, f'Python, f'Ruby, f'xi ħaġa oħra, u trid taqta' kollox. B'mod ġenerali, kelli. Ma kienx possibbli li jiġi kkalkulat in-numru eżatt, iżda xi mkien madwar 20 in-numru intilef.

Peress li hawn kulħadd jaf x'inhu Parallels u x'nagħmlu, mhux se nitkellem dwar kemm aħna cool u x'nagħmlu. Ngħidilkom biss li għandna 13-il uffiċċju madwar id-dinja, aktar minn 300 impjegat, żvilupp f’Moska, Tallinn u Malta. Jekk tixtieq, tista’ tieħu u tiċċaqlaq Malta, jekk ikun kiesaħ fix-xitwa u jkollok bżonn issaħħan dahru.

Speċifikament, id-dipartiment tagħna jikteb f'Python 2. Aħna qegħdin fin-negozju u m'għandniex ħin biex nintroduċu teknoloġiji tal-moda, għalhekk insofru. Għandna Django, għax għandu kollox, u ħadna l-eċċess u erbnieh. Ukoll MySQL, Redis u NGINX. Għandna wkoll ħafna affarijiet oħra friski. Għandna MongoDB, għandna fniek jiġru, sempliċement m'għandna xejn - iżda mhux tiegħi, u ma nagħmilx dan.

OpenResty

Għidt dwari nnifsi. Ejja naraw fuq xiex ser nitkellem illum:

  • X'inhu OpenResty u ma' xiex jittiekel?
  • Għaliex nivvintaw mill-ġdid ir-rota meta jkollna Python, NodeJS, PHP, Go u għalf ieħor frisk li kulħadd huwa kuntent bih?
  • U ftit eżempji tal-ħajja reali. Kelli naqqas ir-rapport ħafna, għax sibtu għal 3,5 sigħat, għalhekk se jkun hemm ftit eżempji.

OpenResty huwa NGINX. Grazzi lilu, għandna web server sħiħ, li huwa miktub tajjeb, jaħdem malajr. Naħseb li ħafna minna nużaw NGINX fil-produzzjoni. Intom ilkoll taf li huwa mgħaġġel u frisk. Huma għamlu I / O sinkroniku jibred fiha, għalhekk m'għandniex bżonn niċċekljaw xejn bl-istess mod li gevent ġie ċiklat f'Python. Gevent huwa jibred, jibred, imma jekk tikteb C-code u xi ħaġa tmur ħażin ma 'gevent, inti tmur crazy debugging. Kelli esperjenza: dam jumejn sħaħ biex nifhem x’mar ħażin hemmhekk. Kieku xi ħadd ma ħafferx għal ftit ġimgħat qabel, sab il-problema, kitebha fuq l-Internet, u Google ma sabhiex, allura konna niġġenun għal kollox.

NGINX diġà jagħmel caching u kontenut statiku. M'għandekx għalfejn tinkwieta dwar kif tagħmel dan umanament, sabiex ma tnaqqasx il-mod x'imkien, sabiex ma titlifx id-deskritturi x'imkien. Nginx huwa konvenjenti ħafna biex jintuża, m'għandekx bżonn taħseb dwar x'għandek tieħu - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx ġie installat, mogħti lill-amministraturi, jafu kif jaħdmu miegħu. Nginx tipproċessa t-talbiet b'mod strutturat. Se nitkellem dwar dan ftit aktar tard. Fil-qosor, għandu fażi meta għadu kemm aċċetta t-talba, meta pproċessa u meta ta l-kontenut lill-utent.

Nginx huwa jibred, iżda hemm problema waħda: mhuwiex flessibbli biżżejjed anke b'dawk il-karatteristiċi kollha friski li l-guys imbuttaw fil-konfigurazzjoni, minkejja l-fatt li jista 'jiġi personalizzat. Din is-setgħa mhix biżżejjed. Għalhekk, il-guys minn Taobao darba, naħseb madwar tmien snin ilu, bnew Lua fih. X'jagħti?

  • Daqs. Huwa żgħir. LuaJIT jagħti x'imkien madwar 100-200 kilobytes ta 'overhead tal-memorja u overhead ta' prestazzjoni minima.
  • Veloċità. L-interpretu LuaJIT huwa qrib C f'ħafna sitwazzjonijiet, f'xi sitwazzjonijiet jitlef għal Java, f'xi jaqbeż. Għal xi żmien, kien meqjus bħala l-aktar avvanzat, l-aktar kompilatur JIT cool. Issa hemm dawk li jkessħu, iżda huma tqal ħafna, pereżempju, l-istess V8. Xi interpreti JS u Java HotSpot huma aktar mgħaġġla f'xi punti, iżda xorta jitilfu f'xi punti.
  • Faċli biex titgħallem. Jekk għandek, ngħidu aħna, codebase Perl u m'intix Booking, ma ssibx programmaturi Perl. Minħabba li mhumiex hemm, ittieħdu kollha, u huwa twil u diffiċli biex tgħallimhom. Jekk trid programmaturi fuq xi ħaġa oħra, jista 'jkollhom ukoll jiġu mħarrġa mill-ġdid jew jinstabu. Fil-każ ta 'Lua, kollox huwa sempliċi. Lua jista 'jitgħallem minn kull junior fi tlett ijiem. Domni madwar sagħtejn biex insibha. Sagħtejn wara, kont diġà nikteb kodiċi fil-produzzjoni. Madwar ġimgħa wara, huwa mar dritt għall-produzzjoni u telaq.

Bħala riżultat, jidher bħal dan:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Hemm ħafna hawn. OpenResty assembla mazz ta 'moduli, kemm luash kif ukoll engins. U għandek kollox lest - skjerat u jaħdem.

eżempji

Biżżejjed mill-lirika, ejja ngħaddu għall-kodiċi. Hawn ftit Hello World:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

X'hemm? dan huwa l-post tal-magni. Ma ninkwetawx, ma niktbux ir-rotot tagħna stess, ma nieħdux xi waħda lesta - diġà għandna f'NGINX, ngħixu tajjeb u għażżien.

content_by_lua_block hija blokka li tgħid li qed inservu kontenut bl-użu ta 'skript Lua. Nieħdu varjabbli tal-magni remote_addr u daħħalha ġo string.format. Dan huwa l-istess bħal sprintf, biss fil Lua, biss korretta. U nagħtuha lill-klijent.

Bħala riżultat, se jidher bħal dan:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Imma lura għad-dinja reali. Fil-produzzjoni, ħadd ma juża Hello World. L-applikazzjoni tagħna normalment tmur fid-database jew x'imkien ieħor u ħafna mill-ħin tistenna tweġiba.

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Biss joqgħod u jistenna. Mhuwiex tajjeb ħafna. Meta jiġu 100.000 utent, huwa diffiċli ħafna għalina. Għalhekk, ejja nużaw applikazzjoni sempliċi bħala eżempju. Aħna se nfittxu stampi, pereżempju, qtates. Biss aħna mhux se nfittxu biss, aħna se nespandu l-kliem kjavi u, jekk l-utent fittex "qtates", insibu qtates, fluffies, eċċ. L-ewwel irridu nġibu d-dejta tat-talba fuq il-backend. Jidher bħal dan:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Żewġ linji jippermettulek li taqbad il-parametri GET, mingħajr kumplikazzjonijiet. Imbagħad aħna, pereżempju, niksbu din l-informazzjoni minn database b'tabella bil-kelma prinċipali u estensjoni billi tuża mistoqsija SQL regolari. Kollox huwa sempliċi. Jidher bħal dan:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Aħna ngħaqqdu l-librerija resty.mysql, li diġà għandna fil-kit. M'għandniex bżonn ninstallaw xejn, kollox lest. Speċifika kif tikkonnettja u tagħmel mistoqsija SQL:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Huwa ftit tal-biża, iżda jaħdem. Hawnhekk 10 huwa l-limitu. Niġbdu 10 rekords, aħna għażżien, ma rridux nuru aktar. Fl-SQL, insejt il-limitu.

Imbagħad insibu stampi għall-mistoqsijiet kollha. Niġbru mazz ta 'talbiet u nimlew tabella Lua imsejħa reqs, u tagħmel ngx.location.capture_multi.

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Dawn it-talbiet kollha jmorru b’mod parallel, u t-tweġibiet jintbagħtu lura lilna. Il-ħin tat-tħaddim huwa ugwali għall-ħin tar-rispons tal-aktar wieħed bil-mod. Jekk ilkoll nisparaw lura f'50 millisekondi, u bgħatna mitt talba, allura nirċievu tweġiba f'50 millisekondi.

Peress li aħna għażżien u ma rridux niktbu t-tqandil u l-caching HTTP, aħna se nġiegħlu lil NGINX jagħmel minn kollox għalina. Kif rajt, kien hemm talba għal url/fetch, hawn hu:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Nagħmlu sempliċi proxy_pass, speċifika fejn għandek tagħmel il-cache, kif tagħmel dan, u kollox jaħdem għalina.

Iżda dan mhux biżżejjed, għad għandna bżonn nagħtu d-dejta lill-utent. L-idea l-aktar sempliċi hija li tiġi serialize kollox għal JSON, faċilment, f'żewġ linji. Aħna nagħtu Content-Type, nagħtu JSON.

Iżda hemm diffikultà waħda: l-utent ma jridx jaqra JSON. Għandna bżonn nattiraw żviluppaturi front-end. Xi drabi ma nħossux li nagħmluh għall-ewwel. Iva, u l-ispeċjalisti tas-SEO jgħidu li jekk qed infittxu stampi, allura ma jimpurtahomx. U jekk nagħtuhom xi kontenut, jgħidu li l-magni tat-tiftix tagħna ma jindikaw xejn.

X'għandek tagħmel biha? Naturalment, aħna se nagħtu lill-utent HTML. Il-ġenerazzjoni bil-manki mhix comme il faut, għalhekk irridu nużaw mudelli. Hemm librerija għal dan lua-resty-template.

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Int trid rajt it-tliet ittri dreaded OPM. OpenResty jiġi mal-maniġer tal-pakketti tiegħu stess, li permezz tiegħu tista 'tinstalla mazz ta' moduli differenti, b'mod partikolari, lua-resty-template. Hija magna template sempliċi simili għal mudelli Django. Hemmhekk tista' tikteb kodiċi u tagħmel sostituzzjoni varjabbli.

Bħala riżultat, kollox se jidher xi ħaġa bħal din:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Ħadna d-dejta u erġajna tajna l-mudell f'żewġ linji. L-utent huwa kuntent, ltqajna qtates. Peress li wessgħu t-talba, huwa rċieva wkoll siġill tal-pil għall-qtates. Qatt ma tkun taf, forsi kien qed ifittex, iżda ma setax jifformula t-talba tiegħu b'mod korrett.

Kollox huwa frisk, iżda qegħdin fl-iżvilupp, u għadna ma rridux nuru lill-utenti. Ejja nagħmlu awtorizzazzjoni. Biex tagħmel dan, ejja naraw kif NGINX jittratta t-talba f'termini ta 'OpenResty:

  • L-ewwel fażi - aċċess, meta l-utent għadu kif ġie, u ħares lejh mill-headers, mill-indirizz IP, minn data oħra. Tista 'minnufih aqta' jekk ma nħobbux. Dan jista 'jintuża għall-awtorizzazzjoni, jew jekk nirċievu ħafna talbiet, nistgħu faċilment inqattgħuhom f'din il-fażi.
  • jikteb. Kitba mill-ġdid ta' xi dejta tat-talba.
  • kontenut. Aħna nagħtu kontenut lill-utent.
  • filtru header. Ibdel l-intestaturi tar-rispons. Jekk użajna proxy_pass, nistgħu nerġgħu nikteb xi headers qabel ma nagħtuha lill-utent.
  • filtru tal-ġisem. Nistgħu nibdlu l-ġisem.
  • log - il-qtugħ tas-siġar. Huwa possibbli li tikteb zkuk f'elasticsearch mingħajr saff addizzjonali.

L-awtorizzazzjoni tagħna tidher xi ħaġa bħal din:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Aħna ser inżiduha ma 'dak location, li ddeskrivejna qabel, u poġġi l-kodiċi li ġej hemmhekk:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Aħna nħarsu biex naraw jekk għandniex cookie token. Jekk le, allura aħna tarmi l-awtorizzazzjoni. L-utenti huma għaqlin u jistgħu raden li jeħtieġ li jiġi stabbilit cookie token. Għalhekk, se npoġġuha wkoll f'Redis:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Il-kodiċi biex taħdem ma 'Redis huwa sempliċi ħafna u mhux differenti minn lingwi oħra. Fl-istess ħin, l-input / output kollu, dak li hemm, dak li hawn, mhuwiex jimblokka. Jekk tikteb kodiċi sinkroniku, allura jaħdem b'mod mhux sinkroniku. Bħal gevent, sar tajjeb biss.

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Ejja nagħmlu l-awtorizzazzjoni nfisha:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Aħna ngħidu li għandna bżonn naqraw il-korp tat-talba. Nirċievu argumenti POST, iċċekkja li l-login u l-password huma korretti. Jekk mhux korrett, allura aħna tarmi l-awtorizzazzjoni. U jekk huma korretti, allura niktbu t-token lil Redis:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Tinsiex issettja l-cookie, dan isir ukoll f'żewġ linji:

OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

L-eżempju huwa sempliċi, spekulattiv. Ovvjament, mhux se nagħmlu servizz li juri l-qtates lin-nies. Imma min jafna. Mela ejja mmorru fuq dak li jista 'jsir fil-produzzjoni.

  • Backend minimalista. Xi drabi rridu nagħtu pjuttost ftit dejta lill-backend: x'imkien irridu nissostitwixxu d-data, x'imkien għandna bżonn nuru xi tip ta 'lista, ngħidu kemm hemm utenti fuq is-sit issa, kamin fuq counter jew statistika. Xi ħaġa daqshekk żgħira. Xi biċċiet minimi jistgħu jsiru faċilment. Dan se jkun mgħaġġel, faċli u kbir.
  • Preproċessar tad-dejta. Xi drabi rridu ndaħħlu reklami fil-paġna tagħna, u nieħdu dawn ir-reklami b'talbiet API. Dan huwa faċli ħafna li tagħmel hawn. Aħna ma tagħbijax il-backend tagħna, li diġà qed jaħdem iebes. Tista' tiġbor u tiġbor hawn. Nistgħu iffurmaw xi JS jew, għall-kuntrarju, inneħħu, nipproċessaw minn qabel xi ħaġa qabel nagħtuha lill-utent.
  • Faċċata għall-mikroservizz. Dan huwa wkoll każ tajjeb ħafna, implimentajtu. Qabel dan, ħdimt għal Tenzor, kumpanija ta 'rappurtar elettroniku li tipprovdi rappurtar għal madwar nofs l-entitajiet legali fil-pajjiż. Għamilna servizz, ħafna affarijiet isiru hemmhekk bl-użu tal-istess mekkaniżmu: routing, awtorizzazzjoni, u aktar.
    OpenResty jista 'jintuża bħala l-kolla għall-mikroservizzi tiegħek biex jipprovdi aċċess wieħed għal kollox u interface wieħed. Peress li l-mikroservizzi jistgħu jinkitbu b'tali mod li għandek Node.js hawn, għandek PHP hawn, għandek Python hawn, hemm xi ħaġa Erlang hawn, aħna nifhmu li ma rridux nerġgħu nikteb l-istess kodiċi kullimkien. Għalhekk, OpenResty jista 'jiġi pplaggjat fuq quddiem.

  • Statistika u analitika. Normalment NGINX ikun fid-daħla, u t-talbiet kollha jgħaddu minnha. Huwa f'dan il-post li huwa konvenjenti ħafna li tiġbor. Tista 'immedjatament tikkalkula xi ħaġa u tarmiha x'imkien, pereżempju, l-istess Elasticsearch, Logstash, jew sempliċement tiktebha fil-ġurnal u mbagħad ibgħatha x'imkien.
  • Sistemi Multi-Utent. Per eżempju, logħob online huma wkoll tajbin ħafna biex tagħmel. Illum f'Cape Town Alexander Gladysh jgħidlek kif malajr tipprototip ta' logħba multiplayer billi tuża OpenResty.
  • Iffiltrar tat-Talbiet (WAF). Issa hija moda li tagħmel kull xorta ta 'firewalls tal-applikazzjoni tal-web, hemm ħafna servizzi li jipprovduhom. Bl-għajnuna ta 'OpenResty, tista' tagħmel lilek innifsek firewall tal-applikazzjoni tal-web, li sempliċiment u faċilment jiffiltra t-talbiet skond il-ħtiġijiet tiegħek. Jekk għandek Python, allura tifhem li PHP żgur mhux se jiġi injettat lilek, sakemm, ovvjament, ma tbidx kullimkien mill-console. Taf li għandek MySQL u Python. Probabbilment, hawnhekk jistgħu jippruvaw jagħmlu xi tip ta 'traversal tad-direttorju u jinjettaw xi ħaġa fid-database. Għalhekk, tista 'tiffiltra talbiet stupidi malajr u bl-irħis dritt fuq quddiem.
  • Komunità. Peress li OpenResty huwa bbażat fuq NGINX, għandu bonus - dan huwa komunità NGINX. Huwa kbir ħafna, u ħafna mill-mistoqsijiet li ser ikollok għall-ewwel diġà ġew imwieġba mill-komunità NGINX.

    iżviluppaturi Lua. Ilbieraħ tkellimt mal-ġuvini li ġew għall-ġurnata tat-taħriġ HighLoad ++ u smajt li Tarantool biss huwa miktub bil-Lua. Dan mhux hekk, ħafna affarijiet huma miktuba fil-Lua. Eżempji: OpenResty, server Prosody XMPP, magna tal-logħob Love2D, Lua huwa skritt f'Warcraft u bnadi oħra. Hemm ħafna żviluppaturi Lua, għandhom komunità kbira u reattiva. Il-mistoqsijiet kollha tiegħi dwar Lua ġew imwieġba fi żmien ftit sigħat. Meta tikteb fil-lista tal-posta, litteralment fi ftit minuti diġà hemm mazz ta 'tweġibiet, jiddeskrivu xiex u kif, x'inhu dak. Huwa kbir. Sfortunatament, komunità sinċiera bħal din mhix kullimkien.
    OpenResty għandu GitHub, fejn tista 'tiftaħ kwistjoni jekk tinkiser xi ħaġa. Hemm mailing list fuq Google Groups fejn tista’ tiddiskuti kwistjonijiet ġenerali, hemm mailing list biċ-Ċiniż - qatt ma tkun taf, forsi ma titkellimx bl-Ingliż, imma għandek għarfien taċ-Ċiniż.

Riżultati ta '

  • Nittama li kont kapaċi nwassal li OpenResty huwa qafas tal-web konvenjenti ħafna.
  • Għandu limitu baxx ta 'dħul, peress li l-kodiċi huwa simili għal dak li niktbu, il-lingwa hija pjuttost sempliċi u minimalista.
  • Jipprovdi I/O asinkroniku mingħajr callbacks, mhux se jkollna noodles peress li kultant nistgħu niktbu f'NodeJS.
  • Għandu skjerament faċli, għaliex għandna bżonn biss NGINX bil-modulu t-tajjeb u l-kodiċi tagħna, u kollox jaħdem immedjatament.
  • Komunità kbira u reattiva.

Ma għidtx fid-dettall kif isir ir-routing, irriżulta li kienet storja twila ħafna.

Grazzi tal-attenzjoni tiegħek!


Vladimir Protasov - OpenResty: iddawwar NGINX f'server ta 'applikazzjoni sħiħ

Sors: www.habr.com

Żid kumment