I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcweleSiphinda sishicilela umbhalo wombiko wengqungquthela Ukulayisha Okuphezulu++ 2016, okwenzeka eSkolkovo eduze kwaseMoscow ngoNovemba 7-8 ngonyaka odlule. UVladimir Protasov ichaza indlela yokwandisa ukusebenza kwe-NGINX nge-OpenResty ne-Lua.

Sanibonani nonke, igama lami ngingu-Vladimir Protasov, ngisebenza kwa-Parallels. Ngizokutshela kancane ngami. Ngichitha izingxenye ezintathu kwezine zempilo yami ngibhala ikhodi. Ngaba umhleli wohlelo ngomqondo ongokoqobo: ngezinye izikhathi ngibona ikhodi emaphusheni ami. Ingxenye yesine yempilo ukuthuthukiswa kwezimboni, ukubhala ikhodi engena ngqo ekukhiqizeni. Ikhodi abanye benu abayisebenzisayo kodwa abangayiboni.

Ngakho uyaqonda ukuthi bekukubi kangakanani. Lapho ngisemncane, ngafika futhi nganikezwa lezi zingosi zolwazi ezingama-terabyte amabili. Kunomthwalo omkhulu wawo wonke umuntu lapha manje. Ngaya ezingqungqutheleni ngabuza: “Bafo, ngitsheleni, ninedatha enkulu, ingabe konke kupholile? Zingaki izisekelo onazo lapho? Bangiphendula: “Sinamagigabhayithi ayi-100!” Ngathi: “Kupholile, amagigabhayithi ayi-100!” Futhi bengizicabangela ukuthi ngingabugcina kanjani ubuso bami be-poker ngokucophelela. Ucabanga ukuthi, yebo, abafana bapholile, bese ubuyela emuva futhi ucubungula lezi zingosi zolwazi ezinama-terabyte amaningi. Futhi lokhu kuba junior. Ungacabanga ukuthi yini igalelo leli?

Ngazi izilimi ezingaphezu kuka-20 zokuhlela. Lokhu yinto obekumele ngiyibone njengoba ngisebenza. Bakunikeza ikhodi ngesi-Erlang, C, C++, Lua, Python, Ruby, enye into, futhi kufanele usike yonke. Ngokuvamile, kwadingeka. Kwakungenakwenzeka ukubala inombolo eqondile, kodwa endaweni ethile cishe ku-20 inombolo yalahleka.

Njengoba wonke umuntu okhona azi ukuthi i-Parallels iyini nokuthi senzani, ngeke ngikhulume ngendlela esipholile ngayo nesikwenzayo. Ngizokutshela nje ukuthi sinamahhovisi angu-13 emhlabeni wonke, abasebenzi abangaphezu kuka-300, intuthuko eMoscow, eTallinn naseMalta. Uma ufisa, ungayithatha futhi uthuthele eMalta uma kubanda ebusika futhi udinga ukufudumeza umhlane wakho.

Ngokucacile, umnyango wethu ubhala nge-Python 2. Sisebhizinisini futhi asinaso isikhathi sokusebenzisa ubuchwepheshe bemfashini, ngakho siyahlupheka. Sisebenzisa i-Django ngoba inakho konke, futhi sathatha obekungenasidingo sakulahla. Futhi i-MySQL, i-Redis ne-NGINX. Siphinde sibe nezinye izinto eziningi ezinhle. Sine-MongoDB, sinogwaja abagijima bezungeza, sinakho konke - kodwa akuyona eyami, futhi angikwenzi.

I-OpenResty

Ngazitshela ngami. Ake sithole ukuthi ngizokhuluma ngani namuhla:

  • Iyini i-OpenResty futhi idliwa ngani?
  • Kungani sisungula elinye isondo uma sinePython, NodeJS, PHP, Go nezinye izinto ezijabulisayo wonke umuntu ajabule ngazo?
  • Nezibonelo ezimbalwa zokuphila. Kwadingeka nginciphise kakhulu inkulumo ngoba yayibude bamahora angu-3,5, ngakho ngeke kube nezibonelo eziningi.

I-OpenResty yi-NGINX. Siyabonga kuye, sineseva yewebhu egcwele ngokugcwele ebhalwe kahle futhi esebenza ngokushesha. Ngicabanga ukuthi iningi lethu lisebenzisa i-NGINX ekukhiqizeni. Niyazi nonke ukuthi uyashesha futhi upholile. Benza i-I/O epholile yokuvumelanisa kuyo, ngakho-ke asidingi ukujikeleza noma yini, njengoba nje benzile ku-Python. I-Gevent ipholile, inhle, kodwa uma ubhala ikhodi engu-C futhi kukhona okungahambi kahle, khona-ke nge-Gevent uzohlanya ngokuyilungisa. Ngaba nakho: kuthathe izinsuku ezimbili zonke ukuthola ukuthi konakelephi lapho. Uma othile engazange ambiwe amasonto ambalwa, wathola inkinga, wabhala ku-intanethi, futhi i-Google ayizange ithole, khona-ke ngabe sahlanya ngokuphelele.

I-NGINX isivele ine-caching kanye nokuqukethwe okumile okwenziwe. Awudingi ukukhathazeka ngokuthi ungakwenza kanjani lokhu kumuntu, ukuze unganciphisi endaweni ethile, ukuze ungalahlekelwa izichazi endaweni ethile. I-Nginx isebenziseka kalula, awudingi ukucabanga ukuthi yini okufanele uyithathe - i-WSGI, PHP-FPM, Gunicorn, Unicorn. Ifakwe iNginx, inikwe abaphathi, bayakwazi ukusebenza ngayo. I-Nginx icubungula izicelo ngendlela ehlelekile. Ngizokhuluma ngalokhu ngemva kwesikhashana. Ngamafuphi, inesigaba lapho isanda kwamukela isicelo, lapho isicubungula, nalapho inikezela okuqukethwe kumsebenzisi.

I-Nginx ipholile, kodwa kunenkinga eyodwa: ayiguquki ngokwanele, ngisho nazo zonke izici ezipholile abafana abaye bazifaka ku-config, naphezu kwalokho okungahle kulungiswe. La mandla awanele. Yingakho abafana baseTaobao, kudala, kubonakala sengathi eminyakeni eyisishiyagalombili edlule, bakha uLua kuwo. Inikezani?

  • usayizi. Incane. I-LuaJIT inikeza cishe amakhilobhayithi angu-100-200 wememori ngaphezulu kanye nokusebenza okuncane okungaphezulu.
  • Isivinini. Umhumushi we-LuaJIT useduze no-C ezimweni eziningi, kwezinye izimo ulahlekelwa i-Java, kanti kwezinye uyadlula. Isikhathi esithile bekubhekwa njengesimo sobuciko, i-JIT compiler ebanda kunazo zonke. Manje kukhona ezipholile, kodwa zinzima kakhulu, isibonelo, i-V8 efanayo. Abanye otolika be-JS kanye ne-Java HotSpot bayashesha kwezinye izindawo, kodwa kwezinye izindawo basalahlekelwa.
  • Kulula ukufunda. Uma une, ake sithi, isisekelo sekhodi ye-Perl, futhi awubhuki, ngeke ubathole abahleli bezinhlelo ze-Perl. Ngenxa yokuthi abekho, bathathwe bonke, futhi ukuzifundisa kude futhi kunzima. Uma ufuna abahleli bezinhlelo zezinye izinto, kungase kudingeke ubaqeqeshe kabusha noma ubathole. Endabeni ye-Lua, konke kulula. Noma yimuphi umncane angafunda isiLua ngezinsuku ezintathu. Kungithathe cishe amahora amabili ukuthi ngiyibone. Ngemva kwamahora amabili ngase ngivele ngibhala ikhodi ekukhiqizeni. Cishe ngemva kwesonto waqonda ku-producer wahamba.

Ngenxa yalokho, kubonakala kanje:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Kuningi lapha. I-OpenResty iqoqe inqwaba yamamojula, womabili ama-luash nawenjini. Futhi unakho konke ngomumo - kumisiwe futhi kuyasebenza.

Izibonelo

Sekwanele amagama, asiqhubekele kukhodi. Nansi i-Hello World encane:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Yini ekhona? Le yindawo ka Eng. Asikhathazeki, asizibhali umzila wethu, asithathi esenziwe ngomumo - sesivele sinawo e-NGINX, siphila impilo enhle nevilaphayo.

content_by_lua_block ibhulokhi ethi sisebenzisa okuqukethwe sisebenzisa umbhalo we-Lua. Sithatha i-Engins variable remote_addr futhi wawufaka string.format. Kuyafana nokuthi sprintf, kuphela ngesiLua, kulungile kuphela. Futhi sinikeza iklayenti.

Ngenxa yalokho, izobukeka kanje:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Kodwa ake sibuyele emhlabeni wangempela. Akekho osebenzisa i-Hello World ekukhiqizweni. Uhlelo lwethu lokusebenza luvamise ukuya kusizindalwazi noma kwenye indawo futhi isikhathi esiningi silinda impendulo.

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Avele ahlale alinde. Akukuhle kakhulu. Lapho kufika abasebenzisi abangu-100.000, kuba nzima kakhulu kithi. Ngakho-ke masisebenzise uhlelo lokusebenza olulula njengesibonelo. Sizobheka izithombe, isibonelo, zamakati. Kodwa ngeke nje sifune, sizokwandisa amagama angukhiye futhi, uma umsebenzisi efuna "amakati," sizothola amakati, amakati anoboya, njalonjalo. Okokuqala, sidinga ukuthola idatha yesicelo ku-backend. Kubukeka kanjena:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Imigqa emibili ikuvumela ukuthi uthathe amapharamitha we-GET, azikho izinkinga. Okulandelayo, ake sithi, kusizindalwazi esinophawu lwegama elingukhiye nesandiso, sithola lolu lwazi sisebenzisa umbuzo ojwayelekile we-SQL. Kulula. Kubukeka kanjena:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Ixhuma umtapo wolwazi resty.mysql, esesivele sinayo ekhithi. Asidingi ukufaka lutho, yonke into isimi ngomumo. Sikhombisa indlela yokuxhuma nokwenza umbuzo we-SQL:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Kuyesabeka kancane lapha, kodwa konke kuyasebenza. Nakhu u-10 umkhawulo. Sikhipha okufakiwe okungu-10, siyavilapha, asifuni ukukhombisa okuningi. Ngikhohlwe ngomkhawulo ku-SQL.

Okulandelayo sithola izithombe zayo yonke imibuzo. Siqoqa inqwaba yezicelo futhi sigcwalise ithebula le-Lua elibizwa reqs, futhi senza ngx.location.capture_multi.

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Zonke lezi zicelo zithunyelwa ngokufana, futhi izimpendulo zibuyiselwa kithi. Isikhathi sokusebenza silingana nesikhathi sokuphendula salowo ohamba kancane. Uma sonke sidubula ngama-millisecond angu-50, futhi sithumele izicelo eziyikhulu, khona-ke sizothola impendulo ngama-millisecond angu-50.

Njengoba sivilapha futhi singafuni ukubhala i-HTTP nokubamba kwe-caching, sizokwenza i-NGINX isenzele yonke into. Njengoba ubonile, bekukhona isicelo sokuthi url/fetch, nangu:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Senza kube lula proxy_pass, sikhomba lapho okufanele sigcinwe khona, sikwenze kanjani, futhi yonke into isisebenzela.

Kodwa lokhu akwanele, sisadinga ukunikeza idatha kumsebenzisi. Umbono olula uwukwenza isiriyeli yonke into ku-JSON, kalula, emigqeni emibili. Sinikeza Uhlobo Lokuqukethwe, sinikeza i-JSON.

Kodwa kunobunzima obubodwa: umsebenzisi akafuni ukufunda i-JSON. Sidinga ukuheha onjiniyela abaphambili. Ngezinye izikhathi asifuni ukwenza lokhu ekuqaleni. Futhi ochwepheshe be-SEO bazothi uma sifuna izithombe, akunandaba kubo. Futhi uma sibanikeza okuqukethwe okuthile, bazothi izinjini zethu zokusesha azikhombi lutho.

Yini okufanele uyenze ngakho? Yebo, sizonikeza umsebenzisi i-HTML. Ukukhiqiza ngesandla akukona comme il faut, ngakho-ke sifuna ukusebenzisa izifanekiso. Kukhona umtapo walokhu lua-resty-template.

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Cishe uzibonile izinhlamvu ezintathu ezesabekayo ze-OPM. I-OpenResty iza nomphathi wayo wephakheji, ongafaka ngayo inqwaba yamamojula ahlukene, ikakhulukazi, lua-resty-template. Lena injini yesifanekiso elula, efana nezifanekiso ze-Django. Lapho ungabhala ikhodi futhi wenze ukushintsha okuguquguqukayo.

Ngenxa yalokho, konke kuzobukeka kanjena:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Sithathe idatha futhi sanikeza isifanekiso, futhi emigqeni emibili. Umsebenzisi ujabule, wathola amakati. Njengoba sandise isicelo, waphinde wathola uphawu loboya lwamakati. Ngeke wazi, mhlawumbe ubefuna lokhu, kodwa akakwazanga ukwenza isicelo sakhe ngendlela efanele.

Konke kuhle, kodwa sisathuthuka futhi asifuni ukukubonisa abasebenzisi okwamanje. Masenze ukugunyazwa. Ukwenza lokhu, ake sibheke ukuthi i-NGINX isiphatha kanjani isicelo ngemibandela ye-OpenResty:

  • Isigaba sokuqala si ukufinyelela, lapho umsebenzisi esanda kufika, futhi sambheka ngezihloko, ngekheli le-IP, nangezinye idatha. Singayinqamula ngokushesha uma singathandi. Lokhu kungasetshenziselwa ukugunyazwa, noma uma sithola izicelo eziningi, singazinqamula kalula kulesi sigaba.
  • bhala kabusha. Sibhala kabusha idatha yesicelo.
  • sokuqukethwe. Siletha okuqukethwe kumsebenzisi.
  • isihlungi sezihloko. Sishintsha izihloko zempendulo. Uma sisebenzisa proxy_pass, singaphinda sibhale ezinye izihloko ngaphambi kokuzinikeza umsebenzisi.
  • isihlungi somzimba. Singawushintsha umzimba.
  • Log - ukugawula. Ungabhala izingodo ku-elasticsearch ngaphandle kwesendlalelo esengeziwe.

Ukugunyazwa kwethu kuzobukeka kanjena:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Sizokwengeza lokhu kulokho location, esiyichazile ngaphambili, futhi sabeka ikhodi elandelayo lapho:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Sibheka ukubona ukuthi sinalo yini ithokheni yekhukhi. Uma kungenjalo, sicela ukugunyazwa. Abasebenzisi banobuqili futhi bangaqagela ukuthi badinga ukusetha ithokheni yekhukhi. Ngakho-ke, sizophinde sikubeke ku-Redis:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Ikhodi yokusebenza neRedis ilula kakhulu futhi ayihlukile kwezinye izilimi. Ngesikhathi esifanayo, konke okokufaka/okuphumayo, lapha nalaphaya, akuvimbi. Uma ubhala ikhodi ehambisanayo, isebenza ngokulinganayo. Cishe njenge-gevent, kodwa yenziwe kahle.

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Masenze ukugunyazwa ngokwako:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Sithi sidinga ukufunda indikimba yesicelo. Sithola ama-agumenti angu-POST futhi sihlola ukuthi ukungena ngemvume nephasiwedi zilungile yini. Uma engalungile, ngakho-ke sikubekela inselelo yokugunyazwa. Futhi uma kulungile, bhala ithokheni ku-Redis:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Ungakhohlwa ukusetha ikhukhi, lokhu kwenziwa futhi emigqeni emibili:

I-OpenResty: iguqula i-NGINX ibe iseva yohlelo lokusebenza olugcwele

Isibonelo silula futhi siyaqagela. Yebo, ngeke senze isevisi ebonisa abantu amakati. Kodwa ngubani osaziyo. Ngakho-ke ake sibheke ukuthi yini engenziwa ekukhiqizeni.

  • I-backend Minimalistic. Ngezinye izikhathi sidinga ukukhipha idatha encane ku-backend: endaweni ethile sidinga ukufaka usuku, endaweni ethile sidinga ukubonisa uhlu, sisho ukuthi bangaki abasebenzisi abasesayithi manje, namathisela ikhawunta noma izibalo. Into encane kakhulu. Ezinye izingcezu ezincane zingenziwa kalula kakhulu. Lokhu kuzokwenza kusheshe, kube lula futhi kube kuhle.
  • Ukucubungula idatha. Kwesinye isikhathi sifuna ukushumeka ukukhangisa ekhasini lethu, futhi sithola lokhu kukhangisa sisebenzisa izicelo ze-API. Lokhu kulula kakhulu ukukwenza lapha. Asilayishi i-backend yethu, evele ihlezi futhi isebenza kanzima. Ungayithatha futhi uyiqoqe lapha. Singakwazi ukuhlanganisa i-JS ethile noma, ngokuphambene, siyiqaqe futhi silungise okuthile ngaphambi kokuyinikeza umsebenzisi.
  • I-Facade ye-microservice. Leli futhi icala elihle kakhulu, ngaliqalisa. Ngaphambi kwalokho, bengisebenza e-Tenzor, inkampani esebenza ngokubika nge-elekthronikhi futhi ehlinzeka ngokubika cishe kuhhafu wezinhlangano ezisemthethweni ezweni. Sakhe isevisi, izinto eziningi zenziwa lapho kusetshenziswa indlela efanayo: umzila, ukugunyazwa nokuningi.
    I-OpenResty ingasetshenziswa njengeglu yama-microservices akho, inikeze ukufinyelela okukodwa kuyo yonke into nesixhumi esibonakalayo esisodwa. Njengoba ama-microservices angabhalwa ngendlela yokuthi ube ne-Node.js lapha, i-PHP lapha, i-Python lapha, into ka-Erlang lapha, siyaqonda ukuthi asifuni ukubhala kabusha ikhodi efanayo yonke indawo. Ngakho-ke, i-OpenResty ingaxhunywa ngaphambili.

  • Izibalo kanye nezibalo. Imvamisa i-NGINX isemnyango, futhi zonke izicelo zidlula kukho. Kukule ndawo lapho kulula kakhulu ukuqoqa. Ungakwazi ukubala ngokushesha okuthile futhi ukulayishe ndawana thize, isibonelo, i-Elasticsearch, i-Logstash, noma umane uyibhale kulogi bese uyithumela ndawana thize.
  • Amasistimu wabasebenzisi abaningi. Isibonelo, imidlalo eku-inthanethi nayo mihle kakhulu ukuyenza. Namuhla eKapa, ​​u-Alexander Gladysh uzokhuluma ngendlela yokwenza ngokushesha igeyimu yabadlali abaningi usebenzisa i-OpenResty.
  • Isicelo sokuhlunga (WAF). Kulezi zinsuku kuyimfashini ukwenza zonke izinhlobo ze-firewall yezinhlelo zokusebenza zewebhu; kunezinsizakalo eziningi ezihlinzeka ngazo. Usebenzisa i-OpenResty, ungazenzela i-firewall yohlelo lokusebenza lewebhu ezohlunga izicelo kalula nangokuvumelana nezidingo zakho. Uma une-Python, khona-ke uyaqonda ukuthi i-PHP ngeke ijovwe kuwe, ngaphandle kokuthi, vele, uyiveze noma yikuphi ukusuka kukhonsoli. Uyazi ukuthi une-MySQL nePython. Mhlawumbe, bangase bazame ukwenza uhlobo oluthile lokunqamula uhla lwemibhalo futhi bajove okuthile kusizindalwazi. Ngakho-ke, ungakwazi ukuhlunga imibuzo eyinqaba ngokushesha nangeshibhile khona kanye ngaphambili.
  • Umphakathi. Njengoba i-OpenResty yakhelwe ku-NGINX, inebhonasi: Umphakathi we-NGINX. Kukhulu kakhulu, futhi ingxenye ehloniphekile yemibuzo ozoba nayo ekuqaleni isivele ixazululiwe ngumphakathi we-NGINX.

    Abathuthukisi be-Lua. Izolo ngikhulume nabafana abeze ngosuku lokuqeqeshwa lwe-HighLoad++ futhi bezwa ukuthi i-Tarantool kuphela ebhalwe ngesiLua. Lokhu akulona iqiniso, izinto eziningi zibhalwe ngesiLua. Izibonelo: I-OpenResty, iseva ye-Prosody XMPP, injini yegeyimu ye-Love2D, i-Lua ebhalwe ku-Warcraft nakwezinye izindawo. Baningi abathuthukisi be-Lua, banomphakathi omkhulu futhi osabelayo. Yonke imibuzo yami yesiLua yaxazululwa emahoreni ambalwa. Uma ubhalela ohlwini lwamakheli, ngokoqobo phakathi nemizuzu embalwa sekuvele kunenqwaba yezimpendulo, ezichaza ukuthi yini futhi kanjani, yini. Kuhle. Ngeshwa, umphakathi onjalo, ongokomoya awukho yonke indawo.
    Kukhona i-GitHub ye-OpenResty, lapho ungavula khona inkinga uma kukhona okuphukile. Kunohlu lwama-imeyili ku-Google Groups lapho ungaxoxa khona ngezinkinga ezijwayelekile, kunohlu lwama-imeyili ngesi-Chinese - awukwazi, mhlawumbe awukhulumi isiNgisi, kodwa uyasazi isiShayina.

Imiphumela

  • Ngethemba ukuthi ngikwazile ukuveza ukuthi i-OpenResty iwuhlaka olulula kakhulu oluklanyelwe iwebhu.
  • Inomgoqo ophansi wokungena, njengoba ikhodi ifana nalokhu esibhala ngakho, ulimi lulula futhi luncane.
  • Inikeza i-Asynchronous I/O ngaphandle kokufona emuva, ngeke sibe nama-noodle njengoba ngezinye izikhathi singabhala ku-NodeJS.
  • Inokuthunyelwa okulula, njengoba sidinga kuphela i-NGINX ngemodyuli edingekayo kanye nekhodi yethu, futhi yonke into isebenza ngokushesha.
  • Umphakathi omkhulu futhi osabelayo.

Angizange ngitshele ngokuningiliziwe ukuthi umzila wenziwa kanjani, kuvele ukuthi indaba ende kakhulu.

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


U-Vladimir Protasov - I-OpenResty: ukuguqula i-NGINX ibe iseva yesicelo esigcwele

Source: www.habr.com

Engeza amazwana