OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasîEm carek din destnivîsa rapora konferansê diweşînin HighLoad ++ 2016, ku li Skolkovo ya nêzîkî Moskowê di 7-8 Mijdara sala borî de pêk hat. Vladimir Protasov rave dike ka meriv çawa fonksiyona NGINX bi OpenResty û Lua re dirêj dike.

Silav her kes, navê min Vladimir Protasov e, ez li Parallels dixebitim. Ez ji we re hinekî behsa xwe bikim. Ez sê çaryeka jiyana xwe bi nivîsandina kodê derbas dikim. Ez bûme bernamesazek ​​ku heya bingehê di wateya wêjeyî de ye: carinan ez kodê di xewnên xwe de dibînim. Çaryeka jiyanê pêşveçûna pîşesaziyê ye, nivîsandina koda ku rasterast diçe hilberînê. Koda ku hin ji we bikar tînin lê pê nizanin.

Ji ber vê yekê hûn fêm dikin ku ew çiqas xirab bû. Dema ku ez piçûk bûm, ez hatim û min dane van databasên du terabyte. Niha ji bo her kesî li vir barek bilind e. Ez çûm konferansan û min pirsî: "Gelîno, ji min re bêjin, daneyên we yên mezin hene, her tişt xweş e? Çend bingehên we hene? Bersiva min dan: “100 gîgabaytên me hene!” Min got: "Sabe, 100 gigabayt!" Û ez ji xwe re difikirîm ka meriv çawa bi baldarî rûyê pokerê xwe biparêze. Hûn difikirin, erê, xort xweş in, û dûv re hûn vedigerin û van databasên pir-terabyte dişoxilînin. Û ev ciwanbûn e. Hûn dikarin bifikirin ev çi derbe ye?

Ez zêdetirî 20 zimanên bernamesaziyê dizanim. Ev tiştek e ku ez neçar bûm ku gava ku ez dixebitim fêm bikim. Ew kodê bi Erlang, C, C++, Lua, Python, Ruby, tiştek din didin we û divê hûn hemî jê qut bikin. Bi gelemperî, ez neçar bûm. Ne pêkan bû ku hejmara rast were hesibandin, lê li derûdora 20-an hejmar winda bû.

Ji ber ku her kesê hazir dizane Parallels çi ye û em çi dikin, ez ê behsa nekim ka em çiqas xweş in û em çi dikin. Ez ê tenê ji we re bibêjim ku li çaraliyê cîhanê 13 ofîsên me hene, zêdetirî 300 karmend, pêşkeftina li Moskow, Talîn û Maltayê. Ger hûn bixwazin, hûn dikarin wê bigirin û biçin Maltayê ger zivistanê sar be û hûn hewce ne ku pişta xwe germ bikin.

Bi taybetî, beşa me di Python 2-ê de dinivîse. Em di karsaziyê de ne û wextê me tune ku em teknolojiyên nûjen bicîh bikin, ji ber vê yekê em diêşin. Em Django bikar tînin ji ber ku her tişt heye, û me tiştê nepêwîst girt û avêtin. Her weha MySQL, Redis û NGINX. Di heman demê de gelek tiştên din ên xweş ên me hene. Me MongoDB heye, kêvroşkên me hene ku li dora xwe digerin, her tiştê me hene - lê ew ne ya min e, û ez wiya nakim.

OpenResty

Min behsa xwe kir. Ka em fêhm bikin ku ez ê îro qala çi bikim:

  • OpenResty çi ye û bi çi tê xwarin?
  • Çima dema ku em Python, NodeJS, PHP, Go û tiştên din ên xweş ên ku her kes jê razî ye, tekerek din ji nû ve îcad bikin?
  • Û çend nimûne ji jiyanê. Ez neçar bûm ku raporê pir bibirim ji ber ku 3,5 demjimêr ji min re girt, ji ber vê yekê dê çend mînak hebin.

OpenResty NGINX e. Bi saya wî, me serverek tevnvîsek heye ku baş hatî nivîsandin û zû dixebite. Ez difikirim ku piraniya me di hilberînê de NGINX bikar tînin. Hûn hemî dizanin ku ew bi lez û bez e. Wan tê de I/O-ya hevdem a xweş çêkir, ji ber vê yekê em ne hewce ne ku tiştek bizivirînin, mîna ku wan di Python de kir. Gevent xweş e, mezin e, lê heke hûn koda C-yê binivîsin û tiştek xelet derkeve, wê hingê hûn ê bi Gevent re dîn bibin ku wê xelet bikin. Ez xwedî ezmûn bûm: du roj temam kir ku ez fêhm bikim ka li wir çi xelet derket. Ger kesek çend hefte li dora xwe nekola, pirsgirêk nedîtiba, li ser Înternetê binivîsanda û Google ew nedîtiba, wê hingê em ê bi tevahî dîn bibûna.

NGINX jixwe caching û naveroka statîk çêkiriye. Hûn ne hewce ne ku hûn li ser meriv çawa vê yekê bikin, da ku hûn li cîhek hêdî hêdî nebin, da ku hûn li cîhek ravekeran winda nekin. Nginx ji bo bicîhkirinê pir rehet e, hûn ne hewce ne ku hûn li ser çi bigirin bifikirin - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx hate saz kirin, ji rêvebiran re hate dayîn, ew dizanin ka meriv çawa pê re bixebite. Nginx daxwazan bi awayek sazkirî pêvajoyê dike. Ez ê li ser vê yekê hinekî paşê biaxivim. Bi kurtasî, ew qonaxek heye ku ew tenê daxwaz qebûl kir, dema ku ew pêvajo kir, û gava ku ew naverok ji bikarhêner re xizmet kir.

Nginx xweş e, lê pirsgirêkek heye: ew ne têra xwe maqûl e, tewra digel hemî taybetmendiyên xweş ên ku xortan di nav mîhengê de kişandine, tevî tiştê ku dikare were mîheng kirin. Ev hêz têrê nake. Ji ber vê yekê xortên ji Taobao, demek dirêj berê, wusa dixuye ku heşt sal berê, Lua tê de ava kirine. Çi dide?

  • size. Ew piçûk e. LuaJIT bi qasî 100-200 kilobytes bîranîna zêde û performansa hindiktirîn dide.
  • Lez. Wergêra LuaJIT di gelek rewşan de nêzîkî C ye, di hin rewşan de ew ji Java-yê winda dike, di hinên din de ew ji wê derdixe. Ji bo demekê ew dewleta hunerî, berhevkarê JIT-ê ya herî xweş hate hesibandin. Naha yên sartir hene, lê ew pir giran in, mînakî, heman V8. Hin wergêrên JS û Java HotSpot di hin xalan de zûtir in, lê li hin deveran ew hîn jî winda dikin.
  • Fêrbûna hêsan. Ger we, bêje, bingehek koda Perl heye, û hûn ne Booking in, hûn ê bernamenûsên Perl nebînin. Ji ber ku ew tune ne, ew hemî hatin birin, û hînkirina wan dirêj û dijwar e. Ger hûn bernamenûsan ji bo tiştek din dixwazin, dibe ku hûn jî neçar bin ku wan ji nû ve perwerde bikin an wan bibînin. Di doza Lua de, her tişt hêsan e. Her ciwanek dikare di sê rojan de Lua fêr bibe. Nêzîkî du saetan ji min re derbas bû ku ez wê fêm bikim. Piştî du saetan min berê kodê di hilberînê de dinivîsand. Nêzîkî hefteyek şûnda ew rasterast çû hilberînê û çû.

Wekî encamek, ew bi vî rengî xuya dike:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Li vir gelek tişt hene. OpenResty komek modul, hem luash û hem jî yên motor berhev kiriye. Û hûn her tişt amade ne - belav kirin û dixebitin.

wergerandî

Gotin bes e, em derbasî kodê bibin. Li vir piçûkek Hello World heye:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Çi heye? Ev der cihekî Engins e. Em xem nakin, em rêwîtiya xwe bi xwe nanivîsin, em hindek hazir nagirin - me berê wê di NGINX de heye, em jiyanek baş û tembel dijîn.

content_by_lua_block blokek e ku dibêje ku em naverokê bi karanîna tîpek Lua re xizmet dikin. Em guherbara Engins digirin remote_addr û têxe hundir string.format. Ev heman e sprintf, tenê li Lua, tenê rast. Û em wê bidin muwekîlê.

Wekî encamek, ew ê bi vî rengî xuya bike:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Lê em vegerin cîhana rastîn. Kes Hello World li hilberînê bi cih nake. Serlêdana me bi gelemperî diçe databasê an cîhek din û pir caran li benda bersivê ye.

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Ew tenê rûniştiye û li bendê ye. Ew ne pir baş e. Dema ku 100.000 bikarhêner werin, ji bo me pir dijwar e. Ji ber vê yekê em wekî mînakek serîlêdanek hêsan bikar bînin. Em ê ji bo nimûne, wêneyên pisîkan bigerin. Lê em ê ne tenê bigerin, em ê peyvan berfireh bikin û, ger bikarhêner li "kêçikan" geriya, em ê pisîk, pisîkên qermiçî, û hwd. Pêşîn, em hewce ne ku daneyên daxwaznameyê li ser piştê bistînin. Ev wisa xuya dike:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Du rêz dihêlin hûn pîvanên GET-ê hilbijêrin, bêyî tevlihevî. Dûv re, em bibêjin, ji databasek bi nîşanek ji bo peyvek sereke û dirêjkirinê, em vê agahiyê bi karanîna pirsek SQL ya birêkûpêk digirin. Ew hêsan e. Ev wisa xuya dike:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Girêdana pirtûkxaneyê resty.mysql, ku em berê di kîtê de hene. Em ne hewce ne ku tiştek saz bikin, her tişt amade ye. Em destnîşan dikin ka meriv çawa tê girêdan û pirsek SQL çê dike:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Li vir hinekî tirsnak e, lê her tişt dixebite. Li vir 10 sînor e. Em 10 navnîşan derdixin, em tembel in, em naxwazin zêdetir nîşan bidin. Min sînorê di SQL de ji bîr kir.

Dûv re em ji bo hemî pirsan wêneyan dibînin. Em komek daxwazan berhev dikin û tabloyek Lua bi navê tijî dikin reqs, û em dikin ngx.location.capture_multi.

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Hemî van daxwazan bi hev re têne şandin, û bersiv ji me re têne vegerandin. Dema xebitandinê bi dema bersivê ya herî hêdî re wekhev e. Ger em hemû di 50 milî çirkeyan de gulebaran bikin, û me sed daxwaz şandin, wê demê em ê di 50 milîsaniyeyan de bersivê bistînin.

Ji ber ku em tembel in û naxwazin HTTP û hilgirtina cachkirinê binivîsin, em ê bikin ku NGINX her tiştî ji bo me bike. Weke ku we dît, daxwazek hebû url/fetch, li vir ew e:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Em wê hêsan dikin proxy_pass, em destnîşan dikin ku li ku derê kaş bikin, çawa bikin, û her tişt ji bo me dixebite.

Lê ev ne bes e, em hîn jî hewce ne ku daneyan bidin bikarhêner. Fikra herî hêsan ev e ku meriv her tiştî di JSON-ê de, bi hêsanî, di du rêzan de rêz bike. Em Content-Type didin, em JSON didin.

Lê dijwariyek heye: bikarhêner naxwaze JSON bixwîne. Pêdivî ye ku em pêşdebirên pêş-endê bikişînin. Carinan em di destpêkê de naxwazin vê yekê bikin. Û pisporên SEO dê bêjin ku heger em li wêneyan digerin, hingê ew ji wan re ne girîng e. Û heger em hinek naverokê bidin wan, ew ê bibêjin ku motorên lêgerînê yên me tiştek navnîş nakin.

Li ser wê çi bikin? Bê guman, em ê bikarhênerê HTML-ê bidin. Hilberîna bi destan ne bikêr e, ji ber vê yekê em dixwazin şablonan bikar bînin. Ji bo vê pirtûkxaneyek heye lua-resty-template.

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

We guman sê tîpên tirsnak OPM dîtiye. OpenResty bi rêveberê pakêta xwe re tê, bi navgîniya ku hûn dikarin komek modulên cihêreng saz bikin, bi taybetî, lua-resty-template. Ev motorek şablonê hêsan e, mîna şablonên Django. Li wir hûn dikarin kodê binivîsin û veguheztina guhêrbar bikin.

Wekî encamek, her tişt dê tiştek weha xuya bike:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Me dane girtin û şablon, dîsa di du rêzan de, kir. Bikarhêner kêfxweş e, wî pisîk wergirtin. Ji ber ku me daxwaz berfireh kir, wî jî mohra kerpîçan ji bo keçikan wergirt. Hûn qet nizanin, dibe ku ew tam li vê yekê digeriya, lê nikarîbû daxwaza xwe rast formule bike.

Her tişt xweş e, lê em di pêşveçûnê de ne û hêj naxwazin wê ji bikarhêneran re nîşan bidin. Werin em destûrnameyê bikin. Ji bo kirina vê yekê, em binihêrin ka NGINX çawa daxwazê ​​di şertên OpenResty de digire:

  • Qonaxa yekem e navketin, gava ku bikarhêner nû hat, û me ji hêla sernivîsan, bi navnîşana IP-yê û bi daneyên din ve li wî nihêrî. Ger em jê hez nekin em dikarin tavilê jê qut bikin. Ev dikare ji bo destûrnameyê were bikar anîn, an ger em gelek daxwaziyan werbigirin, em dikarin bi hêsanî di vê qonaxê de wan qut bikin.
  • qeydgûherrandin. Em hin daneyên daxwazê ​​ji nû ve dinivîsin.
  • naveroka. Em naverokê radestî bikarhênerê dikin.
  • headers filter. Em sernivîsên bersivê diguhezînin. Ger em bikar bînin proxy_pass, em dikarin berî ku wê bidin bikarhêner, hin sernivîsan ji nû ve binivîsin.
  • Parzûna laş. Em dikarin bedenê biguherînin.
  • rojname - têketin. Hûn dikarin têketin di elasticsearch de bêyî qatek pêvek binivîsin.

Destûra me dê tiştek wusa xuya bike:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Em ê vê yekê li vê yekê zêde bikin location, ku me berê diyar kir, û koda jêrîn li wir danîn:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Em lê dinêrin ku bibînin ka me tokenek cookie heye. Ger na, wê demê em destûrnameyê dixwazin. Bikarhêner hîlekar in û dikarin texmîn bikin ku ew hewce ne ku tokenek cookie saz bikin. Ji ber vê yekê, em ê di Redis de jî bidin:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Koda ji bo xebata bi Redis re pir hêsan e û ji zimanên din ne cûda ye. Di heman demê de, hemî ketin / derketin, li vir û wir, nayê asteng kirin. Ger hûn koda hevdemî binivîsin, ew asynchronously dixebite. Hema hema wek gevent, lê baş kirin.

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Ka em bi xwe destûrnameyê bikin:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Em dibêjin ku divê em beşê daxwaznameyê bixwînin. Em argumanên POST distînin û kontrol dikin ku têketin û şîfre rast in. Ger ew nerast in, wê hingê em we ji bo destûrnameyê tehdîd dikin. Û heke rast be, wê hingê token li Redis binivîse:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Ji bîr nekin ku cookie saz bikin, ev jî di du rêzan de tête kirin:

OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Mînak hêsan û spekulatîf e. Bê guman, em ê xizmetek ku pisîkan nîşanî mirovan dide, nekin. Lê kî me nas dike. Ji ber vê yekê em werin ser ka çi dikare di hilberînê de were kirin.

  • Piştgiriya mînîmalîst. Carinan hewce ye ku em tenê piçek daneyan derxînin paşîn: li cîhek pêdivî ye ku em dîrokek têxin, li cîhek pêdivî ye ku em navnîşek nîşan bidin, bibêjin ka niha çend bikarhêner li ser malperê ne, jimareyek an statîstîkek girêdin. Tiştek pir piçûk. Hin perçeyên hindiktirîn dikarin pir bi hêsanî bêne çêkirin. Ev ê wê zû, hêsan û mezin bike.
  • Daneyên pêşdibistanê. Carinan em dixwazin reklamê bixin nav rûpela xwe, û em vê reklamê bi karanîna daxwazên API-yê distînin. Ev li vir pir hêsan e. Em pişta xwe ya ku jixwe rûniştiye û bi dijwarî dixebite bar nakin. Hûn dikarin wê hildin û li vir berhev bikin. Em dikarin hin JS bi hev re bicivînin an, berevajî vê, wê ji hev veqetînin û berî ku wê bidin bikarhêner tiştek pêşdibistanê bikin.
  • Facade ji bo microservice. Ev jî dozeke pir baş e, min ev yek pêk anî. Berî wê, ez li Tenzor xebitîm, pargîdaniyek ku bi raporkirina elektronîkî re mijûl dibe û bi qasî nîvê saziyên qanûnî yên li welêt raporê peyda dike. Me karûbarek çêkir, gelek tişt li wir bi karanîna heman mekanîzmayê hatin kirin: rêkirin, destûr û hêj bêtir.
    OpenResty dikare ji bo mîkroxizmetên we wekî zencîrek were bikar anîn, ku ji her tiştî re gihandinek yekane û têkiliyek yekane peyda dike. Ji ber ku karûbarê mîkro dikare bi vî rengî were nivîsandin ku hûn li vir Node.js, PHP li vir, Python li vir, hin tiştên Erlang li vir hene, em fam dikin ku em naxwazin li her deverê heman kodê ji nû ve binivîsin. Ji ber vê yekê, OpenResty dikare li pêşiyê were girêdan.
  • Statistics û analîtîk. Bi gelemperî NGINX li derî ye, û hemî daxwaz jê re derbas dibin. Li vê derê ye ku berhevkirina wê pir hêsan e. Hûn dikarin tavilê tiştek hesab bikin û wê li cîhek bar bikin, mînakî, Elasticsearch, Logstash, an jî bi tenê wê li têketinê binivîsin û dûv re bişînin cîhek.
  • pergalên pir-bikarhêner. Mînakî, lîstikên serhêl jî çêkirina pir baş in. Îro li Cape Town, Alexander Gladysh dê biaxive ka meriv çawa zû bi karanîna OpenResty lîstikek pir-lîstikvanek prototîp dike.
  • Daxwaza Parzûnkirinê (WAF). Naha moda ye ku meriv her cûre dîwarên serîlêdana malperê çêbike; gelek karûbar hene ku wan peyda dikin. Bi karanîna OpenResty, hûn dikarin xwe bikin dîwarek serîlêdana webê ya ku dê bi hêsanî û bi hêsanî daxwazên li gorî daxwazên we fîlter bike. Ger Python we hebe, wê hingê hûn fam dikin ku PHP bê guman dê di we de neyê derzî kirin, heya ku, bê guman, hûn wê li her derê ji konsolê nehêlin. Hûn dizanin ku we MySQL û Python heye. Dibe ku, ew dikarin hewl bidin ku cûreyek rêveçûna pelrêça bikin û tiştek di databasê de derxînin. Ji ber vê yekê, hûn dikarin pirsên xerîb zû û erzan li pêşiyê fîlter bikin.
  • Civatî. Ji ber ku OpenResty li ser NGINX-ê hatî çêkirin, bonusek wê heye: civaka NGINX. Ew pir mezin e, û beşek minasib ji pirsên ku hûn ê di destpêkê de hebin jixwe ji hêla civata NGINX ve hatine çareser kirin.

    pêşdebiran Lua. Duh min bi xortên ku hatin roja perwerdehiya HighLoad++ re axivî û bihîst ku tenê Tarantool li Lua hatiye nivîsandin. Ev ne rast e, di Lua de gelek tişt hatine nivîsandin. Nimûne: OpenResty, servera Prosody XMPP, motora lîstika Love2D, Lua ku li Warcraft û cîhek din hatî nivîsandin. Gelek pêşdebirên Lua hene, wan civakek mezin û bersivdar hene. Hemî pirsên min Lua di nav çend demjimêran de hatin çareser kirin. Gava ku hûn di navnîşa nameyê de dinivîsin, bi rastî di nav çend hûrdeman de jixwe komek bersiv hene, ku çi û çawa, çi çi ye diyar dikin. Ew pir baş e. Mixabin, civatek wusa dilovan, ruhanî li her derê tune.
    Ji bo OpenResty GitHub heye, ku hûn dikarin pirsgirêkek vekin heke tiştek şikestî be. Li ser Komên Google-ê navnîşek nameyan heye, ku hûn dikarin li ser mijarên gelemperî nîqaş bikin, navnîşek e-nameyê bi Chineseînî heye - hûn qet nizanin, dibe ku hûn bi Englishngilîzî nizanin, lê hûn bi Chineseînî dizanin.

Encam

  • Ez hêvî dikim ku min karîbû ragihînim ku OpenResty çarçoveyek pir hêsan e ku ji bo tevneyê hatî çêkirin e.
  • Ew ji têketinê re astengiyek kêm heye, ji ber ku kod dişibihe ya ku em pê dinivîsin, ziman pir hêsan û mînîmalîst e.
  • Ew I/O-ya asynkron bêyî paşvekişandinê peyda dike, em ê wekî ku carinan carinan dikarin di NodeJS-ê de binivîsin tune nebin.
  • Pêvekirina wê hêsan e, ji ber ku em tenê bi modulaya pêwîst û koda me re NGINX hewce ne, û her tişt tavilê dixebite.
  • Civaka mezin û bersivdar.

Min bi hûrgulî negot ka rêwîtî çawa tê kirin, ew çîrokek pir dirêj bû.

Ji bo baldariya te spas!

Vîdyoyê lîstin

Vladimir Protasov - OpenResty: NGINX veguherîne serverek serîlêdanê ya bêkêmasî

Source: www.habr.com

Add a comment