OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyonAmong gipatik pag-usab ang transcript sa taho gikan sa komperensya Taas nga Load++ 2016, nga gipahigayon sa Skolkovo duol sa Moscow niadtong Nobyembre 7-8 sa miaging tuig. Vladimir Protasov nagsulti kung giunsa pagpalapad ang NGINX nga gamit sa OpenResty ug Lua.

Kumusta sa tanan, ang akong ngalan mao si Vladimir Protasov, nagtrabaho ko sa Parallels. Isulti ko kanimo ang gamay bahin sa akong kaugalingon. Gigugol nako ang tulo ka quarter sa akong kinabuhi sa pagsulat sa code. Nahimo kong usa ka programmer sa kinauyokan sa literal nga diwa: Usahay makita nako ang code sa akong mga damgo. Ang usa ka quarter sa kinabuhi mao ang pag-uswag sa industriya, pagsulat sa code nga diretso sa produksiyon. Code nga gigamit sa uban kaninyo apan wala mahibalo niini.

Aron mahibal-an nimo kung unsa kini ka daotan. Sa bata pa ko, misulod ko ug gihatagan ko nila niining duha ka terabyte nga mga database. Anaa na kini alang sa tanan nga nag-highload. Miadto ko sa mga komperensya ug nangutana: "Mga lalaki, sultihi ako, aduna ka bay dagkong datos, maayo ba ang tanan? Pila ka base ang naa nimo? Gitubag nila ako: "Kami adunay 100 gigabytes!" Miingon ko: β€œCool, 100 gigabytes!” Ug naghunahuna ko sa akong kaugalingon kung unsaon pag-save sa poker face. Sa imong hunahuna, oo, ang mga lalaki cool, ug unya mobalik ka ug mag-tinker sa kini nga mga multi-terabyte nga mga database. Ug kini mao ang pagka junior. Mahunahuna ba nimo kung unsa kini ka hit?

Nakahibalo ako labaw pa sa 20 nga mga programming language. Kini ang kinahanglan nakong mahibal-an sa dagan sa trabaho. Gihatagan ka nila og code sa Erlang, sa C, sa C ++, sa Lua, sa Python, sa Ruby, sa laing butang, ug kinahanglan nimong putlon ang tanan. Sa kinatibuk-an, kinahanglan nako. Dili posible nga makalkulo ang eksaktong numero, apan sa usa ka dapit sa 20 ang numero nawala.

Tungod kay ang tanan dinhi nahibal-an kung unsa ang Parallels ug kung unsa ang among gibuhat, dili ako maghisgot kung unsa kami ka cool ug kung unsa ang among gibuhat. Sultihan ko lang kamo nga kami adunay 13 ka mga opisina sa tibuok kalibutan, labaw pa sa 300 ka mga empleyado, kalamboan sa Moscow, Tallinn ug Malta. Kung gusto nimo, mahimo nimong dad-on ug mobalhin sa Malta, kung bugnaw sa tingtugnaw ug kinahanglan nimo nga painiton ang imong likod.

Sa piho, ang among departamento nagsulat sa Python 2. Anaa kami sa negosyo ug wala kami oras sa pagpaila sa mga uso nga teknolohiya, mao nga nag-antos kami. Kami adunay Django, tungod kay kini adunay tanan, ug among gikuha ang sobra ug gilabay kini. Usab MySQL, Redis ug NGINX. Daghan usab kami nga mga cool nga butang. Kami adunay MongoDB, kami adunay mga koneho nga nagdagan, kami wala’y bisan unsa - apan dili kini akoa, ug wala ko kini buhata.

OpenResty

Gisultihan nako ang akong kaugalingon. Atong tan-awon kung unsa ang akong hisgutan karon:

  • Unsa ang OpenResty ug unsa ang gikaon niini?
  • Ngano nga gibag-o ang ligid kung kami adunay Python, NodeJS, PHP, Go ug uban pang mga cool nga butang nga nalipay ang tanan?
  • Ug pipila ka tinuod nga mga ehemplo sa kinabuhi. Kinahanglan nakong putlon ang report, tungod kay nakuha nako kini sulod sa 3,5 ka oras, mao nga adunay pipila ka mga pananglitan.

Ang OpenResty kay NGINX. Salamat kaniya, kami adunay usa ka bug-os nga web server, nga maayo ang pagkasulat, kini dali nga molihok. Sa akong hunahuna kadaghanan kanato naggamit NGINX sa produksiyon. Nahibal-an nimo tanan nga siya paspas ug cool. Gihimo nila ang cool nga kadungan nga I / O niini, mao nga dili na kinahanglan nga mag-cycle sa bisan unsa sa parehas nga paagi nga gi-cycle ang gevent sa Python. Ang Gevent cool, cool, apan kung imong isulat ang C-code ug adunay dili maayo sa gevent, mabuang ka sa pag-debug niini. Naa koy eksperyensya: nikabat ug duha ka tibuok adlaw aron mahibal-an kung unsa ang sayup didto. Kung ang usa ka tawo wala magkalot sulod sa pipila ka mga semana kaniadto, nakit-an ang problema, gisulat kini sa Internet, ug wala kini makit-an sa Google, nan mabuang na unta kami.

Ang NGINX naghimo na sa caching ug static nga sulod. Dili nimo kinahanglan mabalaka kung giunsa kini buhaton sa tawo, aron dili ka maghinayhinay bisan diin, aron dili ka mawad-an sa mga deskriptor sa bisan diin. Ang Nginx sayon ​​​​kaayo nga i-deploy, dili nimo kinahanglan nga maghunahuna kung unsa ang kuhaon - WSGI, PHP-FPM, Gunicorn, Unicorn. Gi-install ang Nginx, gihatag sa mga admin, nahibal-an nila kung giunsa kini pagtrabaho. Giproseso sa Nginx ang mga hangyo sa usa ka istruktura nga paagi. Ako maghisgot bahin niini sa ulahi. Sa laktod nga pagkasulti, naa siyay yugto nga gidawat ra niya ang hangyo, kung kanus-a niya giproseso ug kanus-a niya gihatag ang sulud sa tiggamit.

Ang Nginx cool, apan adunay usa ka problema: dili kini igo nga flexible bisan sa tanan nga mga cool nga bahin nga giduso sa mga lalaki sa config, bisan pa sa kamatuoran nga kini mahimong ipasadya. Kini nga gahum dili igo. Busa, ang mga lalaki gikan sa Taobao kaniadto, sa akong hunahuna mga walo ka tuig na ang milabay, gitukod si Lua niini. Unsay iyang gihatag?

  • gidak-on. Kini gamay. Ang LuaJIT naghatag sa usa ka dapit sa palibot sa 100-200 kilobytes sa memory overhead ug gamay nga performance overhead.
  • Dali. Ang interpreter sa LuaJIT duol sa C sa daghang mga sitwasyon, sa pipila ka mga sitwasyon mapildi kini sa Java, sa pipila kini makaapas niini. Sa makadiyot, giisip kini nga state of the art, ang labing cool nga JIT compiler. Karon adunay mga mas bugnaw, apan sila bug-at kaayo, pananglitan, ang parehas nga V8. Ang ubang mga JS interpreter ug Java HotSpot mas paspas sa pipila ka mga punto, apan mapildi gihapon sa pipila ka mga punto.
  • Sayon makat-on. Kung ikaw adunay, ingnon ta, usa ka Perl codebase ug dili ka Pag-book, dili nimo makit-an ang mga programmer sa Perl. Tungod kay wala sila didto, silang tanan gikuha, ug dugay ug lisud ang pagtudlo kanila. Kung gusto nimo ang mga programmer alang sa usa pa ka butang, mahimo usab sila nga bansay-bansayon ​​o makit-an. Sa kaso ni Lua, ang tanan yano ra. Si Lua matun-an ni bisan kinsang junior sulod sa tulo ka adlaw. Mga duha ka oras akong nahibaw-an. Paglabay sa duha ka oras, nagsulat na ko og code sa produksiyon. Paglabay sa mga usa ka semana, nidiretso siya sa produksiyon ug mibiya.

Ingon usa ka sangputanan, kini ingon niini:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Adunay daghan dinhi. Ang OpenResty nag-assemble og usa ka hugpong sa mga module, parehong luash ug engine. Ug andam na nimo ang tanan - gipakatap ug nagtrabaho.

mga panig-ingnan

Igo na ang mga liriko, ipadayon nato ang code. Ania ang gamay nga Hello World:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Unsay naa? mao ni ang lokasyon sa makina. Wala kami nabalaka, wala kami nagsulat sa among kaugalingon nga ruta, wala kami nagkuha usa nga andam na - naa na kami niini sa NGINX, nagpuyo kami nga maayo ug tapulan.

content_by_lua_block usa ka block nga nag-ingon nga nag-alagad kami og sulod gamit ang Lua script. Nagkuha kami usa ka variable sa engine remote_addr ug isulod kini string.format. Kini mao ang sama sa sprintf, sa Lua ra, sakto ra. Ug gihatag namo kini sa kliyente.

Ingon sa usa ka resulta, kini tan-awon sama niini:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Apan balik sa tinuod nga kalibutan. Sa produksiyon, walay nag-deploy sa Hello World. Ang among aplikasyon kasagaran moadto sa database o sa laing dapit ug kasagaran maghulat kini og tubag.

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Naglingkod lang ug naghulat. Dili kaayo maayo. Kung moabut ang 100.000 nga tiggamit, lisud kaayo alang kanamo. Busa, atong gamiton ang usa ka yano nga aplikasyon isip usa ka pananglitan. Mangita mig mga hulagway, pananglitan, mga iring. Dili lang kita mangita, atong palapdan ang mga keyword ug, kung ang user nangita alang sa "mga kuting", makit-an nato ang mga iring, fluffies, ug uban pa. Una kinahanglan naton makuha ang data sa hangyo sa backend. Murag mao ni:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Gitugotan ka sa duha ka linya nga makuha ang mga parameter sa GET, wala’y mga komplikasyon. Dayon kami, pananglitan, makakuha niini nga impormasyon gikan sa usa ka database nga adunay usa ka lamesa pinaagi sa keyword ug extension gamit ang usa ka regular nga SQL query. Simple ra ang tanan. Murag mao ni:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Gikonektar namo ang librarya resty.mysql, nga naa na sa kit. Dili kinahanglan nga i-install ang bisan unsang butang, andam na ang tanan. Ipiho kon unsaon pagkonektar ug paghimo og SQL nga pangutana:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Kini usa ka gamay nga makahadlok, apan kini molihok. Dinhi 10 ang limitasyon. Nag-pull out mi og 10 records, tapulan mi, di na mi gustong magpakita pa. Sa SQL, nakalimot ko sa limit.

Unya mangita mig mga hulagway para sa tanang pangutana. Nagkolekta kami usa ka hugpong sa mga hangyo ug gipuno ang usa ka lamesa sa Lua nga gitawag reqs, ug buhata ngx.location.capture_multi.

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Kining tanan nga mga hangyo managsama, ug ang mga tubag gibalik kanamo. Ang oras sa pagdagan parehas sa oras sa pagtubag sa labing hinay. Kung kitang tanan mag-shoot og balik sa 50 milliseconds, ug nagpadala kami og usa ka gatos nga hangyo, nan makadawat kami og tubag sa 50 milliseconds.

Tungod kay kami tapulan ug dili gusto nga magsulat sa HTTP nga pagdumala ug pag-cache, among buhaton ang NGINX sa tanan alang kanamo. Sama sa imong nakita, adunay usa ka hangyo alang sa url/fetch, ania siya:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Gihimo namo nga simple proxy_pass, ipiho kung asa i-cache, unsaon pagbuhat niini, ug ang tanan molihok alang kanamo.

Apan dili kini igo, kinahanglan pa namon nga ihatag ang datos sa tiggamit. Ang pinakasimple nga ideya mao ang pag-serialize sa tanan sa JSON, dali, sa duha ka linya. Gihatagan namo ang Content-Type, among gihatag ang JSON.

Apan adunay usa ka kalisud: ang user dili gusto nga mobasa sa JSON. Kinahanglan namon nga madani ang mga nag-develop sa atubangan. Usahay dili ta ganahan mubuhat ani sa una. Oo, ug ang mga espesyalista sa SEO moingon nga kung nangita kami mga litrato, nan wala sila magtagad. Ug kung hatagan namon sila pipila nga sulud, isulti nila nga ang among mga search engine wala mag-indeks bisan unsa.

Unsa ang buhaton niini? Siyempre, ihatag namo ang user HTML. Ang paghimo gamit ang mga gunitanan dili comme il faut, mao nga gusto namong mogamit og mga templates. Adunay usa ka librarya alang niini lua-resty-template.

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Nakita nimo ang tulo ka gikahadlokan nga mga letra nga OPM. Ang OpenResty adunay kaugalingon nga manager sa package, diin mahimo nimong i-install ang usa ka hugpong sa lainlaing mga module, labi na, lua-resty-template. Kini usa ka yano nga template engine susama sa Django templates. Didto mahimo nimong isulat ang code ug buhaton ang variable substitution.

Ingon usa ka sangputanan, ang tanan mahimong ingon niini:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Gikuha namo ang datos ug gihubad pag-usab ang template sa duha ka linya. Ang tiggamit malipayon, adunay mga iring. Sanglit gipalapdan namo ang hangyo, nakadawat usab siya ug fur seal para sa mga kuting. Dili nimo mahibal-an, tingali gipangita niya kini, apan dili niya maporma ang iyang hangyo sa husto.

Ang tanan cool, apan kami anaa sa pag-uswag, ug dili pa namo gusto nga ipakita ang mga tiggamit. Magbuhat ta ug awtorisasyon. Aron mahimo kini, atong tan-awon kung giunsa pagdumala sa NGINX ang hangyo sa mga termino sa OpenResty:

  • Unang hugna - access, sa dihang ang user bag-o lang miabut, ug kami mitan-aw kaniya pinaagi sa mga ulohan, pinaagi sa IP address, pinaagi sa ubang mga datos. Mahimo nimo dayon kini putlon kung dili kami ganahan. Mahimo kini gamiton alang sa pagtugot, o kung makadawat kami daghang mga hangyo, dali ra namon kini maputol sa kini nga yugto.
  • pagsulat pag-usab. Pagsulat pag-usab sa pipila ka datos sa hangyo.
  • sulod. Gihatagan namon ang sulud sa tiggamit.
  • filter sa ulohan. Usba ang mga ulohan sa tubag. Kung gigamit namo proxy_pass, mahimo natong isulat pag-usab ang pipila ka mga ulohan sa dili pa ihatag kini sa tiggamit.
  • filter sa lawas. Mahimo natong usbon ang lawas.
  • log - pag-log. Posible nga isulat ang mga troso sa elasticsearch nga wala’y dugang nga layer.

Ang among pagtugot mahimong sama niini:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Atong idugang kana location, nga among gihulagway kaniadto, ug ibutang ang mosunod nga code didto:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Gitan-aw namon kung kami adunay cookie token. Kung dili, nan among gitugyan ang pagtugot. Ang mga tiggamit maliputon ug mahimong makatag-an nga ang usa ka cookie token kinahanglan nga itakda. Busa, ibutang usab nato kini sa Redis:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Ang code alang sa pagtrabaho kauban ang Redis yano kaayo ug wala’y kalainan sa ubang mga pinulongan. Sa parehas nga oras, ang tanan nga input / output, kung unsa ang naa, kung unsa ang ania, wala kini gibabagan. Kung magsulat ka ug dungan nga code, nan kini molihok nga asynchronously. Sama sa gevent, maayo ra ang nahimo.

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Buhaton nato ang awtorisasyon mismo:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Giingon namon nga kinahanglan namon basahon ang gihangyo nga lawas. Nakadawat kami og mga argumento sa POST, susiha nga husto ang login ug password. Kung dili husto, nan among gitugyan ang pagtugot. Ug kung husto sila, nan among isulat ang timaan sa Redis:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Ayaw kalimti ang pagbutang sa cookie, gihimo usab kini sa duha ka linya:

OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Ang pananglitan mao ang yano, pangagpas. Siyempre, dili kami maghimo usa ka serbisyo nga nagpakita sa mga iring sa mga tawo. Apan kinsay nakaila kanato. Busa atong hisgotan kon unsa ang mahimo sa produksyon.

  • Minimalist nga backend. Usahay kinahanglan namon nga maghatag gamay nga datos sa backend: sa usa ka lugar kinahanglan namon nga ilisan ang petsa, kung diin kinahanglan namon ipakita ang usa ka klase nga lista, isulti kung pila ang mga tiggamit sa site karon, i-screw sa usa ka counter o estadistika. Usa ka butang nga gamay kaayo. Ang pipila ka gagmay nga mga piraso dali nga mahimo. Kini mahimong paspas, sayon ​​ug maayo.
  • Preprocessing sa datos. Usahay gusto namong i-embed ang mga ad sa among page, ug among kuhaon kini nga mga ad gamit ang API requests. Sayon ra kaayo kining buhaton dinhi. Dili namo i-load ang among backend, nga nagtrabaho na pag-ayo. Mahimo nimong kuhaon ug kolektahon dinhi. Mahimo natong hulmahan ang pipila ka JS o, sa sukwahi, unstick, iproseso ang usa ka butang sa dili pa ihatag kini sa tiggamit.
  • Facade alang sa microservice. Maayo usab kini nga kaso, gipatuman ko kini. Sa wala pa kana, nagtrabaho ko sa Tenzor, usa ka kompanya sa pagreport sa elektroniko nga naghatag pagreport sa hapit katunga sa mga ligal nga entidad sa nasud. Naghimo kami usa ka serbisyo, daghang mga butang ang gihimo didto gamit ang parehas nga mekanismo: pag-ruta, pagtugot, ug uban pa.
    Ang OpenResty mahimong gamiton ingon nga glue para sa imong mga microservice aron mahatagan ang usa ka access sa tanan ug usa ka interface. Tungod kay ang mga microservice mahimong isulat sa paagi nga ikaw adunay Node.js dinhi, ikaw adunay PHP dinhi, ikaw adunay Python dinhi, adunay pipila ka Erlang nga butang dinhi, nasabtan namo nga dili namo gusto nga isulat pag-usab ang sama nga code bisan asa. Busa, ang OpenResty mahimong isaksak sa atubangan.

  • Estadistika ug analytics. Kasagaran ang NGINX naa sa entrada, ug ang tanan nga mga hangyo moagi niini. Dinhi niining dapita sayon ​​kaayo ang pagkolekta. Mahimo nimo dayon nga kuwentahon ang usa ka butang ug ilabay kini sa usa ka dapit, pananglitan, ang sama nga Elasticsearch, Logstash, o isulat lang kini sa log ug dayon ipadala kini sa usa ka dapit.
  • Multi-User nga Sistema. Pananglitan, ang mga dula sa online maayo usab nga buhaton. Karon sa Cape Town isulti kanimo ni Alexander Gladysh kung giunsa ang dali nga pagprototype sa usa ka dula nga multiplayer gamit ang OpenResty.
  • Paghangyo sa Pagsala (WAF). Karon uso ang paghimo sa tanan nga mga lahi sa mga firewall sa aplikasyon sa web, adunay daghang mga serbisyo nga naghatag kanila. Sa tabang sa OpenResty, mahimo nimo ang imong kaugalingon nga usa ka firewall sa web application, nga yano ug dali nga magsala sa mga hangyo sumala sa imong mga kinahanglanon. Kung ikaw adunay Python, nan imong nasabtan nga ang PHP siguradong dili ma-injected kanimo, gawas kung, siyempre, imong gipatungha kini bisan asa gikan sa console. Nahibal-an nimo nga ikaw adunay MySQL ug Python. Tingali, dinhi sila makasulay sa paghimo sa usa ka matang sa direktoryo nga traversal ug pag-inject sa usa ka butang ngadto sa database. Busa, mahimo nimong ma-filter ang mga amang nga mga hangyo nga dali ug barato sa atubangan.
  • Komunidad Tungod kay ang OpenResty gibase sa NGINX, kini adunay bonus - kini NGINX nga komunidad. Kini dako kaayo, ug daghan sa imong mga pangutana sa sinugdan natubag na sa komunidad sa NGINX.

    Mga developer sa Lua. Kagahapon nakigsulti ako sa mga lalaki nga miadto sa HighLoad ++ nga adlaw sa pagbansay ug nakadungog nga ang Tarantool ra ang gisulat sa Lua. Dili kini mao, daghang mga butang ang nasulat sa Lua. Mga pananglitan: OpenResty, Prosody XMPP server, Love2D game engine, Lua is scripted sa Warcraft ug bisan asa. Adunay daghang mga developer sa Lua, sila adunay dako ug responsive nga komunidad. Ang tanan nakong pangutana sa Lua natubag sulod sa pipila ka oras. Kung nagsulat ka sa mailing list, literal sa pila ka minuto adunay na usa ka hugpong sa mga tubag, ilang gihulagway kung unsa ug giunsa, unsa. Nindot kaayo. Ikasubo, ang ingon nga mabination nga sinsero nga komunidad wala bisan diin.
    Ang OpenResty adunay GitHub, diin mahimo nimong ablihan ang usa ka isyu kung adunay maguba. Adunay usa ka mailing list sa Google Groups diin mahimo nimong hisgutan ang mga kinatibuk-ang isyu, adunay usa ka mailing list sa Intsik - wala ka mahibal-an, tingali dili ka makasulti og English, apan adunay ka kahibalo sa Intsik.

Mga resulta

  • Nanghinaut ko nga akong mapasabot nga ang OpenResty usa ka kombenyente kaayo nga web framework.
  • Kini adunay usa ka ubos nga threshold sa pagsulod, tungod kay ang code susama sa unsay atong gisulat, ang pinulongan mao ang medyo yano ug minimalistic.
  • Naghatag kini og asynchronous nga I / O nga walay mga callback, wala kami'y noodles kay usahay makasulat kami sa NodeJS.
  • Kini adunay usa ka sayon ​​nga pag-deploy, tungod kay gikinahanglan lamang nato ang NGINX nga adunay husto nga module ug ang atong code, ug ang tanan molihok dayon.
  • Dako ug responsive nga komunidad.

Wala nako gisulti sa detalye kung giunsa ang pag-ruta, nahimo kini nga usa ka taas nga istorya.

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


Vladimir Protasov - OpenResty: paghimo sa NGINX nga usa ka bug-os nga server sa aplikasyon

Source: www.habr.com

Idugang sa usa ka comment