I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyoSiphinda sipapashe isicatshulwa sengxelo yenkomfa Umthwalo oPhezulu++ I-2016, eyenzeka eSkolkovo kufuphi neMoscow ngoNovemba 7-8 kunyaka odlulileyo. UVladimir Protasov ichaza indlela yokwandisa ukusebenza kwe-NGINX nge-OpenResty kunye ne-Lua.

Molweni nonke, igama lam nguVladimir Protasov, ndisebenza kwiParallels. Ndiza kukuxelela kancinci ngam. Ndichitha iikota ezintathu zobomi bam ndibhala ikhowudi. Ndibe ngumdwelisi wenkqubo ukuya embindini ngengqiqo yokoqobo: ngamanye amaxesha ndibona ikhowudi kumaphupha am. Ikota yobomi kuphuhliso lwamashishini, ikhowudi yokubhala ehamba ngqo kwimveliso. Ikhowudi esetyenziswa ngabanye benu kodwa ningayiqondi.

Ngoko uyayiqonda indlela embi ngayo. Xa ndandisemncinci, ndafika ndanikwa ezi dathabheyiti ze-terabyte ezimbini. Ngumthwalo omkhulu kumntu wonke olapha ngoku. Ndaya kwiinkomfa ndaza ndabuza: β€œBafo, ndixeleleni, ninedatha enkulu, ngaba yonke into ipholile? Zingaphi iziseko onazo apho? Bandiphendula bathi: β€œSine-100 gigabytes!” Ndathi: β€œKupholile, iigigabhayithi ezili-100!” Kwaye bendizicingela ukuba ndingabugcina njani ngobunono ubuso bam bepoker. Ucinga, ewe, abafana bapholile, kwaye emva koko ubuyela umva kwaye ucofe ngezi dathabheyi ezininzi ze-terabyte. Kwaye oku kukuba ngumntwana omncinci. Ngaba unokuthelekelela ukuba sisiphi isibetho esi?

Ndazi ngaphezu kweelwimi zeprogram ezingama-20. Le yinto ekwakufuneka ndiyicinge njengoko ndisebenza. Bakunika ikhowudi e-Erlang, C, C++, Lua, Python, Ruby, enye into, kwaye kufuneka uyinqumle yonke. Ngokubanzi, kwafuneka ndenze njalo. Kwakungenakwenzeka ukubala inani elichanekileyo, kodwa kwindawo ethile malunga ne-20 inani lalahleka.

Ekubeni wonke umntu okhoyo esazi ukuba yintoni iParallels kunye nento esiyenzayo, andizukuthetha ngendlela esipholile ngayo kunye nento esiyenzayo. Ndiza kukuxelela nje ukuba sineeofisi ze-13 emhlabeni jikelele, abasebenzi abangaphezu kwe-300, uphuhliso eMoscow, eTallinn naseMalta. Ukuba unqwenela, unokuyithatha kwaye ufudukele eMalta ukuba kuyabanda ebusika kwaye kufuneka ufudumale umqolo wakho.

Ngokukodwa, isebe lethu libhala kwiPython 2. Siseshishini kwaye asinalo ixesha lokuphumeza iteknoloji yefashoni, ngoko siyabandezeleka. Sisebenzisa i-Django kuba inayo yonke into, kwaye sithathe into ebingeyomfuneko sayilahla. Kwakhona i-MySQL, iRedis kunye ne-NGINX. Sinazo nezinye izinto ezininzi ezipholileyo. SineMongoDB, sinemivundla ejikelezayo, sinayo yonke into - kodwa ayiyoyam, kwaye andiyenzi.

I-OpenResty

Ndabalisa ngam. Makhe sibone ukuba ndiza kuthetha ngantoni namhlanje:

  • Yintoni i-OpenResty kwaye ityiwa ngantoni?
  • Kutheni siphinda sisungula elinye ivili xa sinePython, iNodeJS, i-PHP, iGo kunye nezinye izinto ezipholileyo wonke umntu onwabe ngazo?
  • Kwaye imizekelo embalwa yobomi. Kwafuneka ndiyinqumle ingxelo kakhulu kuba indithathe iiyure ezi-3,5, ngoko ke kuya kuba nemizekelo embalwa.

I-OpenResty yi-NGINX. Siyabulela kuye, sinomncedisi wewebhu opheleleyo obhalwe kakuhle kwaye usebenza ngokukhawuleza. Ndicinga ukuba abaninzi bethu basebenzisa i-NGINX kwimveliso. Niyazi nonke ukuba uyakhawuleza kwaye upholile. Benza i-I/O epholileyo ehambelanayo kuyo, ke akufuneki sijikeleze nantoni na, njengokuba benzayo kwi-Python. I-Gevent ipholile, ilungile, kodwa ukuba ubhala ikhowudi ye-C kwaye kukho into engahambi kakuhle, emva koko nge-Gevent uya kuphambana ukuyilungisa. Ndaba namava: kuthathe iintsuku ezimbini zonke ukufumanisa ukuba kwenzeke ntoni na apho. Ukuba umntu akazange agrumbe iiveki ezimbalwa, wafumana ingxaki, wabhala kwi-Intanethi, kwaye uGoogle akazange ayifumane, ngoko besiya kuphambana ngokupheleleyo.

I-NGINX sele ine-caching kunye nomxholo we-static owenziwe. Awudingi ukukhathazeka malunga nendlela yokwenza oku kumntu, ukuze unganciphisi kwindawo ethile, ukuze ungalahlekelwa ngabachazi kwindawo ethile. I-Nginx ikulungele kakhulu ukuhambisa, awudingi ukucinga malunga nokuba uthathe ntoni - i-WSGI, i-PHP-FPM, i-Gunicorn, i-Unicorn. I-Nginx yafakwa, inikwe ii-admins, ziyakwazi ukusebenza ngayo. I-Nginx iqhuba izicelo ngendlela eyakhiweyo. Ndiza kuthetha ngale nto kamva. Ngamafutshane, inesigaba xa isamkele nje isicelo, xa isenziwa, kwaye xa ihambisa umxholo kumsebenzisi.

I-Nginx ipholile, kodwa kukho ingxaki enye: ayiguquguquki ngokwaneleyo, kunye nazo zonke iimpawu ezipholileyo apho abafana baye baxinanisa kwi-config, nangona inokuthi iqwalaselwe. La mandla awonelanga. Yingakho abafana baseTaobao, ixesha elidlulileyo, kubonakala ngathi kwiminyaka eyisibhozo edlulileyo, bakha uLua kuyo. Inika ntoni?

  • ubungakanani. Incinci. I-LuaJIT inika malunga ne-100-200 kilobytes yememori engaphezulu kunye nomsebenzi omncinci ongaphezulu.
  • Ukukhawuleza. Itoliki ye-LuaJIT isondele kwi-C kwiimeko ezininzi, kwezinye iimeko ilahlekelwa yiJava, kwezinye iyayidlula. Ngexesha elithile yayigqalwa njengeyona meko yobugcisa, i-JIT compiler epholileyo. Ngoku kukho ezipholileyo, kodwa zinzima kakhulu, umzekelo, i-V8 efanayo. Abanye abatoliki be-JS kunye neJava HotSpot bakhawuleza kwiindawo ezithile, kodwa kwezinye iindawo balahlekelwa.
  • Kulula ukufunda. Ukuba unayo, yithi, isiseko sekhowudi yePerl, kwaye awubhuki, awuzukufumana abaprogram bePerl. Ngenxa yokuba azikho, zathathwa zonke, kwaye ukuzifundisa kude kwaye kunzima. Ukuba ufuna abadwelisi benkqubo kwenye into, kungafuneka uphinde ubaqeqeshe okanye ubafumane. Kwimeko yeLua, yonke into ilula. Nawuphi na umntu oselula unokufunda isiLua ngeentsuku ezintathu. Kwandithatha malunga neeyure ezimbini ukuba ndiyiqonde. Kwiiyure ezimbini kamva ndandisele ndibhala ikhowudi kwimveliso. Emva kweveki waya ngqo kwimveliso wemka.

Ngenxa yoko, kubonakala ngathi:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Kuninzi apha. I-OpenResty iqokelele iqela lemodyuli, zombini i-luash kunye ne-injini. Kwaye unayo yonke into elungile - ibekwe kwaye iyasebenza.

U mzekelo

Kwanele amazwi, masiqhubele phambili kwikhowudi. Nali iLizwe Elincinci Elincinci:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Yintoni apho? Le yindawo ka Engins. Asikhathazeki, asibhali indlela yethu, asithathi enye esele yenziwe-esele sinayo kwi-NGINX, siphila ubomi obuhle kunye nobuvila.

content_by_lua_block yibhloko ethi sikhonza umxholo usebenzisa iscript yesiLua. Sithatha i-Engins variable remote_addr kwaye wayifaka string.format. Iyafana ne sprintf, kuphela kwiLua, echanekileyo kuphela. Kwaye siyinika umxhasi.

Ngenxa yoko, iya kujongeka ngolu hlobo:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Kodwa masibuyele kwihlabathi lenene. Akukho mntu uthumela i-Hello World kwimveliso. Isicelo sethu sihlala sisiya kwisiseko sedatha okanye kwenye indawo kwaye ixesha elininzi lilinda impendulo.

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Uhleli nje alinde. Akulunganga kakhulu. Xa abasebenzisi be-100.000 beza, kunzima kakhulu kuthi. Ngoko masisebenzise isicelo esilula njengomzekelo. Siza kukhangela imifanekiso, umzekelo, yeekati. Kodwa asiyi kukhangela nje, siya kwandisa amagama angundoqo kwaye, ukuba umsebenzisi ukhangele "iikati," siya kufumana iikati, iikati ezinoboya, njalo njalo. Okokuqala, kufuneka sifumane idatha yesicelo kwi-backend. Ijongeka ngolu hlobo:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Imigca emibini ikuvumela ukuba uthathe iiparamitha zeGET, akukho ngxaki. Okulandelayo, masithi, kwisiseko sedatha esinophawu lwegama elingundoqo kunye nokwandiswa, sifumana olu lwazi ngokusebenzisa umbuzo oqhelekileyo we-SQL. Ilula. Ijongeka ngolu hlobo:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Ukuqhagamshela ithala leencwadi resty.mysql, esele sinayo kwikhithi. Akukho mfuneko yakufakela nantoni na, yonke into ilungile. Sibonisa indlela yokudibanisa kunye nokwenza umbuzo weSQL:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Kuyoyikeka kancinci apha, kodwa yonke into iyasebenza. Apha u-10 ngumda. Sikhupha amangeno e-10, sisonqena, asifuni ukubonisa ngakumbi. Ndilibele malunga nomda kwi-SQL.

Emva koko sifumana imifanekiso yayo yonke imibuzo. Siqokelela iqela lezicelo kwaye sigcwalise itafile yeLua ebizwa reqs, kwaye senza ngx.location.capture_multi.

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Zonke ezi zicelo zithunyelwa ngaxeshanye, kwaye iimpendulo zibuyiselwa kuthi. Ixesha lokusebenza lilingana nexesha lokuphendula lelona licothayo. Ukuba sonke sidubula kwi-50 milliseconds, kwaye sithumele izicelo ezilikhulu, ngoko siya kufumana impendulo kwi-50 milliseconds.

Ekubeni sisonqena kwaye asifuni ukubhala i-HTTP kunye nokuphathwa kwe-caching, siya kwenza i-NGINX isenze yonke into. Njengoko ubona, kukho isicelo url/fetch, nanku:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Siyenza ilula proxy_pass, sibonisa indawo yokugcina i-cache, indlela yokwenza, kwaye yonke into isebenza kuthi.

Kodwa oku akwanelanga, sisafuna ukunika umsebenzisi idatha. Olona luvo lulula kukucwangcisa yonke into kwi-JSON, ngokulula, kwimigca emibini. Sinika Umxholo-Uhlobo, sinika i-JSON.

Kodwa kukho ubunzima obunye: umsebenzisi akafuni ukufunda i-JSON. Kufuneka sitsale abaphuhlisi bangaphambili. Ngamanye amaxesha asifuni ukuyenza le nto ekuqaleni. Kwaye iingcali ze-SEO ziya kuthi ukuba sikhangela imifanekiso, ke ayinamsebenzi kubo. Kwaye ukuba sibanika umxholo othile, baya kuthi ii-injini zethu zokukhangela azibonisi nto.

Yintoni onokuyenza ngayo? Ngokuqinisekileyo, siya kunika umsebenzisi i-HTML. Ukuvelisa ngesandla ayisiyiyo i-comme il faut, ngoko sifuna ukusebenzisa iitemplates. Kukho ithala leencwadi loku lua-resty-template.

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Ukhe wazibona iileta ezintathu ezoyikisayo ze-OPM. I-OpenResty iza nomphathi wayo wepakethe, apho ungafaka khona iqela leemodyuli ezahlukeneyo, ngakumbi, lua-resty-template. Le yi-injini yetemplate elula, efana neetemplates ze-Django. Apho ungabhala ikhowudi kwaye wenze utshintshiselwano oluguquguqukayo.

Ngenxa yoko, yonke into iya kujongeka ngolu hlobo:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Sithathe idatha kwaye sinika itemplate, kwakhona kwimigca emibini. Umsebenzisi uyavuya, wafumana iikati. Ekubeni sandisa isicelo, wafumana netywina loboya bamantshontsho ekati. Awusoze wazi, mhlawumbi wayejonge kanye le nto, kodwa akazange akwazi ukwenza isicelo sakhe ngokuchanekileyo.

Yonke into ipholile, kodwa sikuphuhliso kwaye asifuni ukuyibonisa kubasebenzisi okwangoku. Masenze ugunyaziso. Ukwenza oku, makhe sijonge ukuba i-NGINX isiphatha njani isicelo ngokwemigaqo ye-OpenResty:

  • Inqanaba lokuqala - ukufikelela, xa umsebenzisi efika nje, kwaye samjonga ngeeheader, ngedilesi ye-IP, kunye nezinye iinkcukacha. Sinokuyinqumla ngokukhawuleza ukuba asiyithandi. Oku kungasetyenziselwa ukugunyaziswa, okanye ukuba sifumana izicelo ezininzi, sinokuzinqumla ngokulula kwesi sigaba.
  • bayibhale. Siphinda sibhale idatha yesicelo.
  • umxholo. Sihambisa umxholo kumsebenzisi.
  • iiheader filter. Sibuyisela iiheader zempendulo. Ukuba sisebenzise proxy_pass, singaphinda sibhale ezinye iiheader phambi kokuba siyinike umsebenzisi.
  • isihluzo somzimba. Siyakwazi ukutshintsha umzimba.
  • ungene - ukugawulwa kwemithi. Ungabhala iilogi kwi-elasticsearch ngaphandle koluhlu olongezelelweyo.

Isigunyaziso sethu siya kujongeka ngolu hlobo:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Sizakongeza le kuleya location, ebesiyichazile ngaphambili, kwaye sibeke le khowudi ilandelayo apho:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Sijonge ukubona ukuba sinayo ithokheni yecookie. Ukuba akunjalo, ngoko sicela ugunyaziso. Abasebenzisi banobuqili kwaye banokuqikelela ukuba bafuna ukuseta ithokheni yecookie. Ke ngoko, siya kuyibeka kwiRedis:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Ikhowudi yokusebenza kunye neRedis ilula kakhulu kwaye ayifani nezinye iilwimi. Ngexesha elifanayo, lonke igalelo / imveliso, apha naphaya, ayithinteli. Ukuba ubhala ikhowudi ehambelanayo, isebenza ngokungahambelaniyo. Phantse njenge-gevent, kodwa yenziwe kakuhle.

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Masenze ugunyaziso ngokwalo:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Sithi kufuneka sifunde umzimba wesicelo. Sifumana iingxoxo zePOST kwaye sijonge ukuba ukungena kunye negama lokugqitha zichanekile. Ukuba azichanekanga, siyakucela umngeni ukuba ugunyazise. Kwaye ukuba ichanekile, bhala uphawu kwiRedis:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Ungalibali ukuseta icookie, oku kwenziwa kwimigca emibini:

I-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

Umzekelo ulula kwaye uyaqikeleleka. Ewe, asiyi kwenza inkonzo ebonisa abantu iikati. Kodwa ngubani osaziyo. Ngoko makhe sijonge into enokwenziwa kwimveliso.

  • I-minimalistic backend. Ngamanye amaxesha kufuneka sikhuphe idatha encinci kwi-backend: kwindawo ethile kufuneka sifake umhla, kwindawo ethile kufuneka sibonise uluhlu, sitsho ukuba bangaphi abasebenzisi abakwisayithi ngoku, ncamathisela i-counter okanye izibalo. Into encinci kakhulu. Amanye amaqhekeza amancinci angenziwa ngokulula kakhulu. Oku kuya kuyenza ikhawuleze, ilula kwaye ibe ntle.
  • Ukulungiswa kwedatha. Ngamanye amaxesha sifuna ukushumeka intengiso kwiphepha lethu, kwaye sifumana le ntengiso sisebenzisa izicelo ze-API. Oku kulula kakhulu ukwenza apha. Asiyilayishi i-backend yethu, esele ihleli kwaye isebenza nzima. Ungayithatha kwaye uyiqokelele apha. Sinokudibanisa i-JS okanye, ngokuchaseneyo, siyiqhawule kwaye siyiqhubele phambili into ngaphambi kokuba siyinike umsebenzisi.
  • I-facade ye-microservice. Le ikwayimeko entle kakhulu, ndiyiphumezile. Ngaphambi koko, bendisebenza e-Tenzor, inkampani esebenza ngeengxelo ze-elektroniki kwaye ibonelela ngengxelo malunga nesiqingatha samaqumrhu asemthethweni elizweni. Senze inkonzo, izinto ezininzi zenziwa apho kusetyenziswa indlela efanayo: umzila, ugunyaziso kunye nokunye.
    I-OpenResty inokusetyenziswa njengeglu yeemicroservices zakho, inika ufikelelo olunye kuyo yonke into kunye nojongano olunye. Kuba iimicroservices zinokubhalwa ngendlela yokuba ube neeNode.js apha, PHP apha, iPython apha, enye into kaErlang apha, siyaqonda ukuba asifuni ukuyibhala kwakhona ikhowudi enye kuyo yonke indawo. Ke ngoko, i-OpenResty inokufakwa ngaphambili.

  • Amanani kunye nohlalutyo. Ngokuqhelekileyo i-NGINX isekungeneni, kwaye zonke izicelo zihamba ngayo. Kukule ndawo ukuba kukulungele kakhulu ukuqokelela. Ungayibala ngokukhawuleza into kwaye uyilayishe kwenye indawo, umzekelo, Elasticsearch, Logstash, okanye uyibhale ngokulula kwilog kwaye uyithumele kwenye indawo.
  • Iinkqubo zabasebenzisi abaninzi. Ngokomzekelo, imidlalo ye-intanethi nayo ilungile kakhulu ukuyenza. Namhlanje eKapa, ​​u-Alexander Gladysh uza kuthetha ngendlela yokukhawuleza ukulinganisa umdlalo wabadlali abaninzi usebenzisa i-OpenResty.
  • Isicelo sokuHluza (WAF). Kule mihla kusefashonini ukwenza zonke iintlobo zomlilo zewebhu; zininzi iinkonzo ezibonelela ngazo. Usebenzisa i-OpenResty, unokuzenzela i-firewall yesicelo sewebhu esiya kuthi sihluze ngokulula izicelo ngokweemfuno zakho. Ukuba unayo iPython, ke uyaqonda ukuba i-PHP ngokuqinisekileyo ayizukufakwa kuwe, ngaphandle kokuba, ewe, uyivelisa naphi na ukusuka kwikhonsoli. Uyazi ukuba uneMySQL kunye nePython. Mhlawumbi, banokuzama ukwenza uhlobo oluthile lwesikhokelo sokuwela kwaye bafake into ethile kwisiseko sedatha. Ke ngoko, ungayihluza imibuzo engaqhelekanga ngokukhawuleza nangexabiso eliphantsi kanye ngaphambili.
  • Ekuhlaleni. Ekubeni i-OpenResty yakhelwe kwi-NGINX, inebhonasi-le NGINX uluntu. Inkulu kakhulu, kwaye inxalenye efanelekileyo yemibuzo oya kuba nayo ekuqaleni sele isonjululwe luluntu lwe-NGINX.

    Abaphuhlisi beLua. Izolo ndathetha nabafana abeza kwi-HighLoad ++ yoqeqesho kwaye beva ukuba iTarantool kuphela ibhalwe ngesiLua. Oku akuyonyani, zininzi izinto ezibhalwe ngesiLua. Imizekelo: I-OpenResty, iseva ye-Prosody XMPP, i-injini yomdlalo we-Love2D, i-Lua ebhalwe kwi-Warcraft nakwezinye iindawo. Baninzi abaphuhlisi beLua, banoluntu olukhulu noluphendulayo. Yonke imibuzo yam yesiLua yasonjululwa kwiiyure ezimbalwa. Xa ubhala kuluhlu lokuposa, ngokoqobo kwimizuzu embalwa sele kukho iqela leempendulo, ezichaza ukuba yintoni kwaye njani, yintoni na. Ilunge kakhulu. Ngelishwa, ububele obunjalo, uluntu lokomoya alukho kuyo yonke indawo.
    Kukho i-GitHub ye-OpenResty, apho unokuvula umba ukuba kukho into ephukile. Kukho uluhlu lokuposa kuMaqela kaGoogle, apho unokuxoxa ngemiba ngokubanzi, kukho uluhlu lokuposa ngesiTshayina - awusoze wazi, mhlawumbi awuthethi isiNgesi, kodwa uyasazi isiTshayina.

Iziphumo

  • Ndiyathemba ukuba ndikwazile ukuveza ukuba i-OpenResty sisikhokelo esiluncedo kakhulu esilungiselelwe iwebhu.
  • Inomqobo ophantsi wokungena, kuba ikhowudi iyafana nale sibhala kuyo, ulwimi lulula kwaye luncinci.
  • Ibonelela nge-asynchronous I/O ngaphandle kokufowuna, asiyi kuba nayo nayiphi na i-noodle njengoko sinokubhala ngamanye amaxesha kwiNodeJS.
  • Inokuthunyelwa lula, kuba sifuna kuphela i-NGINX kunye nemodyuli efunekayo kunye nekhowudi yethu, kwaye yonke into isebenza ngokukhawuleza.
  • Uluntu olukhulu nolusabelayo.

Khange ndithethe ngokweenkcukacha ukuba kwenziwa njani na, kuvele ukuba libali elide kakhulu.

Бпасиalu


UVladimir Protasov-OpenResty: ukuguqula i-NGINX ibe yiseva yesicelo esipheleleyo

umthombo: www.habr.com

Yongeza izimvo