OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzeaJardunaldiaren txostenaren transkripzioa argitaratzen ari gara berriro High Load++ 2016, iazko azaroaren 7-8an Mosku ondoko Skolkovon ospatu zen. Vladimir Protasov NGINX funtzionaltasuna nola zabaldu OpenResty eta Lua-rekin azaltzen du.

Kaixo guztioi, nire izena Vladimir Protasov da, Parallels-en egiten dut lan. Nire buruari buruz pixka bat kontatuko dizut. Nire bizitzako hiru laurdenak ematen ditut kodea idazten. Programatzaile bihurtu nintzen zentzu literalean: batzuetan kodea ikusten dut nire ametsetan. Bizitzaren laurdena garapen industriala da, zuzenean produkziora sartzen den kodea idazten. Batzuek erabiltzen baina konturatzen ez den kodea.

Beraz, ulertzen duzu zein txarra zen. Txiki txikia nintzenean, etorri nintzen eta bi terabyteko datu-base hauek eman zizkidaten. Karga handia da hemen denentzat orain. Jardunaldietara joan nintzen eta galdetu nuen: β€œMutilak, esaidazu, big data duzu, dena polita al da? Zenbat oinarri dituzu hor? Erantzun zidaten: "100 gigabyte ditugu!" Esan nuen: "Oso, 100 gigabyte!" Eta neure artean pentsatzen ari nintzen nola zaindu nire poker aurpegia kontu handiz. Uste duzu, bai, mutilak politak direla, eta gero atzera egin eta terabyte anitzeko datu-base hauekin moldatzen dituzu. Eta hau junior izatea da. Imajinatzen al duzu zer kolpea den hau?

20 programazio-lengoaia baino gehiago ezagutzen ditut. Hau lan egin ahala asmatu behar nuen zerbait da. Erlang, C, C++, Lua, Python, Ruby, beste zerbaitetan ematen dizute kodea, eta dena moztu behar duzu. Oro har, behar nuen. Ezin zen kopuru zehatza kalkulatu, baina 20. inguruan nonbait galdu zen zenbakia.

Bertaratutako guztiek Parallels zer den eta zer egiten dugun ezagutzen dutenez, ez dut hitz egingo zeinen politak garen eta zer egiten dugun. Besterik gabe, esango dizut munduan zehar 13 bulego ditugula, 300 langile baino gehiago, Moskun, Tallinn eta Maltan garapena. Nahi baduzu, hartu eta Maltara joan zaitezke neguan hotza egiten badu eta bizkarra berotu behar baduzu.

Zehazki, gure sailak Python 2-n idazten du. Negozioan gaude eta ez dugu astirik modako teknologiak ezartzeko, beraz, sufritzen dugu. Django erabiltzen dugu denetarik duelako, eta behar ez zena hartu eta bota egin genuen. Baita MySQL, Redis eta NGINX ere. Beste gauza polit asko ere baditugu. MongoDB dugu, untxiak ditugu inguruan, denetarik daukagu, baina ez da nirea, eta ez dut egiten.

OpenResty

Nire buruaz kontatu nuen. Asma dezagun zertaz hitz egingo dudan gaur:

  • Zer da OpenResty eta zerekin jaten da?
  • Zergatik berrasmatu beste gurpil bat Python, NodeJS, PHP, Go eta guztiok pozik dauden beste gauza politak ditugunean?
  • Eta bizitzako adibide batzuk. Txostena asko moztu behar izan nuen, 3,5 ordu behar izan nituenez, adibide gutxi egongo dira.

OpenResty NGINX da. Berari esker, ongi idatzitako eta azkar funtzionatzen duen web zerbitzari osoa dugu. Uste dut gehienok NGINX erabiltzen dugula ekoizpenean. Denok badakizu azkarra eta cool dela. I/O sinkrono ederrak egin zituzten bertan, beraz, ez dugu ezer ziklotu beharrik, Python-en egin zuten bezala. Gevent polita da, bikaina, baina C kodea idazten baduzu eta zerbait gaizki ateratzen baduzu, Gevent-ekin zoratu egingo zara arazketan. Esperientzia izan nuen: bi egun oso behar izan ziren han zer gertatu zen asmatzeko. Norbaitek zenbait astez inguruan zulatu, arazoa aurkitu, Interneten idatzi eta Google-k aurkitu ez balu, erabat zoratu egingo ginateke.

NGINX-ek dagoeneko egina du cachea eta eduki estatikoa. Ez duzu hau gizatasunez nola egin kezkatu behar, nonbait moteldu ez dadin, deskribatzaileak nonbait galdu ez ditzazun. Nginx zabaltzeko oso erosoa da, ez duzu zer hartu pentsatu behar - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx instalatu zen, administratzaileei eman, badakite nola lan egin. Nginx-ek eskaerak modu egituratuan prozesatzen ditu. Geroxeago hitz egingo dut honetaz. Laburbilduz, fase bat dauka eskaera onartu berri zuenean, prozesatu zuenean eta erabiltzaileari edukia zerbitzatzen zionean.

Nginx polita da, baina arazo bat dago: ez da nahikoa malgua, nahiz eta mutilek konfigurazioan sartu dituzten ezaugarri politekin, konfigura daitekeen arren. Botere hori ez da nahikoa. Horregatik, Taobaoko mutilek, aspaldi, duela zortzi urte dirudi, Lua barneratu zuten. Zer ematen du?

  • tamaina. Txikia da. LuaJIT-ek 100-200 kilobyte inguru ematen ditu memoria-gastuak eta gutxieneko errendimendu-gastuak.
  • Abiadura. LuaJIT interpretea C-tik gertu dago egoera askotan, egoera batzuetan Javaren aurka galtzen du, beste batzuetan gainditzen du. Denbora luzez artearen egoeratzat hartu zen, JIT konpilatzaile politena. Orain freskoagoak daude, baina oso astunak dira, adibidez, V8 bera. JS interprete batzuk eta Java HotSpot azkarragoak dira puntu batzuetan, baina leku batzuetan oraindik galtzen dute.
  • Ikasteko erraza. Esan, Perl kode-oinarria baduzu, eta ez bazara Booking, ez dituzu Perl programatzailerik aurkituko. Existitzen ez direnez, denak eraman zituzten, eta irakastea luzea eta zaila da. Beste zerbaitetarako programatzaileak nahi badituzu, baliteke horiek berriro trebatu edo aurkitu behar izatea. Luaren kasuan, dena sinplea da. Edozein junior ikas dezake Lua hiru egunetan. Bi ordu inguru behar izan ditut asmatzeko. Bi ordu geroago jadanik kodea idazten ari nintzen ekoizpenean. Aste bat beranduago zuzenean produkziora joan zen eta alde egin zuen.

Ondorioz, honelakoa da:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Hemen asko dago. OpenResty-k modulu mordo bat bildu ditu, luash zein motorra. Eta dena prest duzu: zabalduta eta lanean.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Nahikoa da letrarekin, kodera pasa gaitezen. Hona hemen Kaixo mundu txiki bat:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Zer dago hor? Hau Engins kokapen bat da. Ez gara kezkatzen, ez dugu gure bideratzerik idazten, ez dugu prest egindako bat hartzen - dagoeneko NGINX-en dugu, bizitza ona eta alferra bizi dugu.

content_by_lua_block Lua script bat erabiliz edukia hornitzen ari garela dioen bloke bat da. Engins aldagaia hartuko dugu remote_addr eta sartu string.format. Hau berdina da sprintf, Luan bakarrik, zuzena bakarrik. Eta bezeroari ematen diogu.

Ondorioz, itxura hau izango du:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Baina itzul gaitezen benetako mundura. Inork ez du hedatzen Hello World ekoizpenean. Gure aplikazioa normalean datu basera edo beste nonbaitera joaten da eta gehienetan erantzunaren zain egoten da.

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Esertzen da eta itxaron egiten du. Ez da oso ona. 100.000 erabiltzaile etortzen direnean, oso zaila da guretzat. Beraz, erabil dezagun aplikazio sinple bat adibide gisa. Irudiak bilatuko ditugu, adibidez, katuen. Baina ez dugu bilatuko bakarrik, gako-hitzak zabalduko ditugu eta, erabiltzaileak "katuak" bilatuz gero, katuak, katu iletsuak eta abar aurkituko ditugu. Lehenik eta behin, eskaera datuak backend-ean lortu behar ditugu. Honela dirudi:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Bi lerroek GET parametroak jasotzeko aukera ematen dute, konplikaziorik gabe. Jarraian, demagun, gako-hitz eta luzapen baten zeinua duen datu-base batetik informazio hori SQL kontsulta arrunt bat erabiliz lortzen dugula. Sinplea da. Honela dirudi:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Liburutegia konektatzea resty.mysql, kitean dagoeneko daukaguna. Ez dugu ezer instalatu behar, dena prest dago. SQL kontsulta nola konektatu eta nola egin adierazten dugu:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Hemen beldur pixka bat ematen du, baina denak funtzionatzen du. Hemen 10 da muga. 10 sarrera ateratzen ditugu, alferrak gara, ez dugu gehiago erakutsi nahi. SQL-n mugaz ahaztu zait.

Ondoren, kontsulta guztietarako argazkiak aurkituko ditugu. Eskaera mordoa bildu eta izeneko Lua taula bat betetzen dugu reqs, eta egiten dugu ngx.location.capture_multi.

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Eskaera horiek guztiak paraleloki bidaltzen dira, eta erantzunak itzultzen zaizkigu. Eragiketa denbora motelenaren erantzun denboraren berdina da. Denok 50 milisegundotan filmatzen badugu, eta ehun eskaera bidaltzen baditugu, 50 milisegundotan jasoko dugu erantzuna.

Alferrak garenez eta ez dugunez HTTP eta cachearen maneiua idatzi nahi, NGINX-ek dena egingo digu. Ikusi duzun bezala, eskaera bat zegoen url/fetch, hona hemen:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Sinple egiten dugu proxy_pass, non gorde behar den, nola egin eta dena funtzionatzen diguna adierazten dugu.

Baina hau ez da nahikoa, oraindik erabiltzaileari eman behar dizkiogu datuak. Ideia errazena JSON-en dena serializatzea da, erraz, bi lerrotan. Content-Type ematen dugu, JSON ematen dugu.

Baina bada zailtasun bat: erabiltzaileak ez du JSON irakurri nahi. Frontend garatzaileak erakarri behar ditugu. Batzuetan ez dugu hau egin nahi hasieran. Eta SEO espezialistek esango dute argazkiak bilatzen ari bagara, ez zaiela axola. Eta eduki batzuk ematen badizkiegu, esango dute gure bilatzaileek ez dutela ezer indexatzen.

Zer egin horren aurrean? Noski, erabiltzaileari HTML emango diogu. Eskuz sortzea ez da comme il faut, beraz, txantiloiak erabili nahi ditugu. Horretarako liburutegi bat dago lua-resty-template.

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Ziurrenik OPM hiru letra beldurgarriak ikusi dituzu. OpenResty-k pakete kudeatzaile propioarekin dator, zeinaren bidez modulu ugari instalatu ditzakezu, bereziki, lua-resty-template. Hau txantiloi-motor sinple bat da, Django txantiloien antzekoa. Bertan kodea idatzi eta aldagaien ordezkapena egin dezakezu.

Ondorioz, dena honelakoa izango da:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Datuak hartu eta txantiloia errendatu genuen, berriro bi lerrotan. Erabiltzailea pozik dago, katuak jaso zituen. Eskaera zabaldu genuenez, katutxoentzako ile zigilua ere jaso zuen. Inoiz ez dakizu, beharbada hori bilatzen ari zen, baina ezin izan zuen bere eskaera behar bezala formulatu.

Dena polita da, baina garapenean gaude eta oraindik ez dugu erabiltzaileei erakutsi nahi. Egin dezagun baimena. Horretarako, ikus dezagun NGINX-ek OpenResty terminoetan eskaera nola kudeatzen duen:

  • Lehen fasea - sarbidea, erabiltzailea iritsi berri zenean, eta goiburuen, IP helbidearen eta beste datu batzuen arabera begiratu genion. Berehala moztu dezakegu gustatzen ez bazaigu. Hau baimentzeko erabil daiteke, edo eskaera asko jasotzen baditugu, erraz moztu ditzakegu fase honetan.
  • berridazketa. Eskaera datu batzuk berridazten ditugu.
  • edukia. Edukia erabiltzaileari entregatzen diogu.
  • goiburuen iragazkia. Erantzunen goiburuak ordezkatzen ditugu. Erabili bagenu proxy_pass, goiburu batzuk berridatzi ditzakegu erabiltzaileari eman aurretik.
  • gorputz-iragazkia. Gorputza alda dezakegu.
  • saioa hasi - erregistroa. Erregistroak idatz ditzakezu elasticsearch-en geruza gehigarririk gabe.

Gure baimena honelakoa izango da:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Honi gehituko diogu location, aurretik deskribatu duguna, eta bertan kode hau jarri:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Cookie-token bat ote dugun begiratzen dugu. Hala ez bada, baimena eskatzen dugu. Erabiltzaileak maltzurrak dira eta cookie-token bat ezarri behar dutela asma dezakete. Horregatik, Redis-en ere jarriko dugu:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Redis-ekin lan egiteko kodea oso erraza da eta ez da desberdina beste hizkuntzetatik. Aldi berean, sarrera/irteera guztiak, han eta hemen, ez dira blokeatzen. Kode sinkronoa idazten baduzu, modu asinkronoan funtzionatzen du. Gevent bezala ia, baina ondo eginda.

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Egin dezagun baimena bera:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Eskaeraren gorputza irakurri behar dugula esaten dugu. POST argumentuak jasotzen ditugu eta saioa hasteko eta pasahitza zuzenak direla egiaztatzen dugu. Okerrak badira, baimena eskatzen dizugu. Eta zuzena bada, idatzi tokena Redis-en:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Ez ahaztu cookiea ezartzea, hau ere bi lerrotan egiten da:

OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Adibidea sinplea eta espekulatiboa da. Jakina, ez dugu jendeari katuak erakusten dituen zerbitzurik egingo. Baina nork ezagutzen gaitu. Beraz, ikus dezagun zer egin daitekeen ekoizpenean.

  • Backend minimalista. Batzuetan, datu apur bat atera behar dugu backend-era: nonbait data bat txertatu behar dugu, nonbait zerrenda bat erakutsi behar dugu, esan zenbat erabiltzaile dauden gunean orain, kontagailu bat edo estatistikak erantsi. Hain txikia den zerbait. Pieza minimo batzuk oso erraz egin daitezke. Horrek azkarra, erraza eta bikaina egingo du.
  • Datuen aurreprozesatzea. Batzuetan, publizitatea gure orrian txertatu nahi dugu, eta API eskaerak erabiliz jasotzen dugu publizitate hori. Hau oso erraza da hemen egitea. Ez dugu gure backend-a kargatzen, dagoeneko eserita eta gogor lanean ari dena. Hemen jaso eta jaso dezakezu. JS batzuk bildu ditzakegu edo, alderantziz, desakoplatu eta zerbait aurrez prozesatu erabiltzaileari eman aurretik.
  • Mikrozerbitzurako fatxada. Hau ere oso kasu ona da, inplementatu dut. Aurretik, Tenzor-en lan egin nuen, txosten elektronikoak lantzen dituen eta herrialdeko pertsona juridikoen erdiei gutxi gorabehera txostenak ematen dizkien enpresan. Zerbitzu bat sortu genuen, han gauza asko egiten ziren mekanismo bera erabiliz: bideratzea, baimena eta abar.
    OpenResty zure mikrozerbitzuetarako kola gisa erabil daiteke, guztietarako sarbide bakarra eta interfaze bakarra eskainiz. Mikrozerbitzuak Node.js hemen, PHP hemen, Python hemen, Erlang gauzaren bat hemen daukazun moduan idatzi daitezkeenez, ulertzen dugu ez dugula kode bera nonahi berridatzi nahi. Hori dela eta, OpenResty aurrealdean konekta daiteke.

  • Estatistika eta analitika. Normalean NGINX sarreran dago, eta eskaera guztiak bertatik pasatzen dira. Leku honetan oso erosoa da biltzea. Berehala kalkula dezakezu zerbait eta nonbait kargatu, adibidez, Elasticsearch, Logstash, edo, besterik gabe, erregistroan idatzi eta gero nonbait bidali.
  • Erabiltzaile anitzeko sistemak. Adibidez, online jokoak ere oso onak dira egiteko. Gaur Lurmutur Hirian, Alexander Gladysh-ek OpenResty erabiliz jokalari anitzeko joko bat azkar nola prototipatzeari buruz hitz egingo du.
  • Eskaerak iragaztea (WAF). Gaur egun modan dago era guztietako web aplikazioen suebakiak egitea; asko dira horiek eskaintzen dituzten zerbitzuak. OpenResty erabiliz, zure eskakizunen arabera eskaerak erraz eta erraz iragaziko dituen web aplikazioen suebaki bat egin dezakezu. Python baduzu, ulertzen duzu PHP ez zaizula injektatuko, jakina, kontsolatik edozein lekutan sortzen ez baduzu behintzat. Badakizu MySQL eta Python dituzula. Seguruenik, direktorioen zeharkatze moduko bat egiten saiatuko dira eta datu-basean zerbait sartzen. Hori dela eta, kontsulta bitxiak azkar eta merke iragazi ditzakezu aurrealdean.
  • Komunitatea. OpenResty NGINX-en eraikita dagoenez, bonus bat du - hau NGINX komunitatea. Oso handia da, eta hasieran izango dituzun galderen zati duin bat dagoeneko konpondu du NGINX komunitateak.

    Lua garatzaileak. Atzo HighLoad++ entrenamendu jardunaldira etorri ziren mutilekin hitz egin nuen eta Tarantool bakarrik Luan idatzita zegoela entzun nuen. Hau ez da egia, gauza asko Luan idazten dira. Adibideak: OpenResty, Prosody XMPP zerbitzaria, Love2D joko-motorra, Lua Warcraft-en eta beste leku batzuetan idatzitako gidoia. Lua garatzaile asko daude, komunitate handi eta sentikorra dute. Nire Lua galdera guztiak ordu gutxiren buruan konpondu ziren. Posta-zerrendan idazten duzunean, literalki, minutu gutxiren buruan erantzun mordoa dago jada, zer eta nola, zer den deskribatuz. Ikaragarria da. Zoritxarrez, halako komunitate espiritual eta atsegina ez dago nonahi.
    OpenResty-rako GitHub dago, non arazo bat ireki dezakezu zerbait apurtzen bada. Google Groups-en posta-zerrenda bat dago, non gai orokorrak eztabaidatu ditzakezun, posta-zerrenda bat dago txineraz - ez dakizu, agian ez duzu ingelesez hitz egiten, baina txinera badaki.

Emaitzak

  • Espero dut OpenResty sarerako egokitutako esparru oso erosoa dela aditzera eman ahal izan nuela.
  • Sartzeko oztopo txikia du, kodea idazten dugunaren antzekoa denez, hizkuntza nahiko sinplea eta minimalista da.
  • I/O asinkronoa eskaintzen du deirik gabe, ez dugu fideorik izango batzuetan NodeJS-en idazteko moduan.
  • Inplementazio erraza du, NGINX behar den moduluarekin eta gure kodearekin bakarrik behar baitugu, eta dena berehala funtzionatzen du.
  • Komunitate handia eta sentikorra.

Ez nuen zehatz-mehatz kontatu bideratzea nola egiten den, oso istorio luzea izan zen.

Eskerrik asko zure arreta!


Vladimir Protasov - OpenResty: NGINX erabateko aplikazio zerbitzari bihurtzea

Iturria: www.habr.com

Gehitu iruzkin berria