OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

OpenResty: vire NGINX nan yon sèvè aplikasyon konplèNou ap pibliye ankò transkripsyon rapò konferans lan HighLoad ++ 2016, ki te fèt nan Skolkovo toupre Moskou sou Novanm 7-8 ane pase. Vladimir Protasov eksplike kijan pou pwolonje fonksyon NGINX ak OpenResty ak Lua.

Bonjou tout moun, non mwen se Vladimir Protasov, mwen travay nan Parallels. Mwen pral di ou yon ti kras sou tèt mwen. Mwen pase twa ka nan lavi mwen ekri kòd. Mwen te vin tounen yon pwogramè nan nwayo a nan sans literal: pafwa mwen wè kòd nan rèv mwen. Yon ka nan lavi se devlopman endistriyèl, ekri kòd ki ale tou dwat nan pwodiksyon an. Yon kòd ke kèk nan nou itilize men pa reyalize li.

Se konsa, ou konprann kouman li te move. Lè m 'te yon ti kras jinyò, mwen te vini epi yo te bay baz done sa yo de-terabyte. Li se gwo chaj pou tout moun isit la kounye a. Mwen te ale nan konferans epi mwen te mande: "Mesye, di m, ou gen gwo done, èske tout bagay fre? Konbyen baz ou genyen la? Yo reponn mwen: "Nou gen 100 gigaokte!" Mwen te di: "Koul, 100 jigokte!" Apre sa, mwen te panse nan tèt mwen ki jan ak anpil atansyon kenbe figi pokè mwen an. Ou panse, wi, mesye yo se fre, epi Lè sa a, ou tounen ak tinker ak baz done milti-terabyte sa yo. Ak sa a se ke yo te yon jinyò. Èske ou ka imajine sa yon souflèt sa a ye?

Mwen konnen plis pase 20 lang pwogramasyon. Sa a se yon bagay mwen te oblije konnen pandan mwen te travay. Yo ba ou kòd nan Erlang, C, C++, Lua, Python, Ruby, yon lòt bagay, epi ou dwe koupe li tout. An jeneral, mwen te oblije. Li pa t posib pou kalkile nimewo egzak la, men yon kote alantou 20yèm lan nimewo a te pèdi.

Piske tout moun ki prezan yo konnen kisa Parallels ye ak sa n ap fè, mwen p ap pale sou jan nou fre ak sa n ap fè. Mwen pral jis di ou ke nou gen 13 biwo atravè mond lan, plis pase 300 anplwaye, devlopman nan Moskou, Tallinn ak Malta. Si ou vle, ou ka pran li epi ale nan Malta si li fè frèt nan sezon fredi epi ou bezwen chofe do ou.

Espesyalman, depatman nou an ekri nan Python 2. Nou nan biznis epi nou pa gen tan aplike teknoloji alamòd, kidonk nou soufri. Nou itilize Django paske li gen tout bagay, epi nou pran sa ki pa nesesè epi nou jete li. Epitou MySQL, Redis ak NGINX. Nou menm tou nou gen anpil lòt bagay fre. Nou gen MongoDB, nou gen lapen kap kouri, nou gen tout bagay - men li pa mwen, epi mwen pa fè li.

OpenResty

Mwen te pale de tèt mwen. Ann kalkile sou kisa mwen pral pale jodi a:

  • Ki sa ki OpenResty ak kisa li manje?
  • Poukisa reenvante yon lòt wou lè nou gen Python, NodeJS, PHP, Go ak lòt bagay fre ke tout moun kontan ak?
  • Ak kèk egzanp nan lavi. Mwen te oblije koupe rapò a anpil paske li te pran m '3,5 èdtan, kidonk pral gen kèk egzanp.

OpenResty se NGINX. Gras a li, nou gen yon sèvè entènèt plen véritable ki byen ekri ak travay byen vit. Mwen panse ke pifò nan nou itilize NGINX nan pwodiksyon an. Ou tout konnen li rapid ak fre. Yo te fè fre I/O synchrone ladan l, kidonk nou pa bezwen sikile anyen, menm jan yo te fè Gevent nan Python. Gevent se fre, gwo, men si ou ekri kòd C ak yon bagay ale mal, Lè sa a, ak Gevent ou pral fou debogaj li. Mwen te gen eksperyans nan: li te pran de jou antye pou evalye sa ki te mal la. Si yon moun pa t 'fouye alantou pandan plizyè semèn, jwenn pwoblèm nan, ekri sou entènèt la, ak Google pa t' jwenn li, Lè sa a, nou ta ale konplètman fou.

NGINX deja gen kach ak kontni estatik fè. Ou pa bezwen enkyete w sou fason pou w fè sa imen, pou w pa ralanti yon kote, pou w pa pèdi deskriptè yon kote. Nginx trè pratik pou deplwaye, ou pa bezwen reflechi sou sa pou w pran - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx te enstale, bay admin yo, yo konnen ki jan yo travay avèk li. Nginx trete demann nan yon fason estriktire. Mwen pral pale sou sa yon ti kras pita. Nan ti bout tan, li gen yon faz lè li jis aksepte demann lan, lè li trete li, ak lè li te sèvi kontni an bay itilizatè a.

Nginx se fre, men gen yon pwoblèm: li pa fleksib ase, menm ak tout karakteristik yo fre ke mesye yo te anpile nan konfigirasyon an, malgre lefèt ke li ka configuré. Pouvwa sa a pa ase. Se poutèt sa mesye yo soti nan Taobao, yon bon bout tan de sa, li sanble tankou uit ane de sa, bati Lua nan li. Kisa li bay?

  • gwosè. Li piti. LuaJIT bay anviwon 100-200 kilobyte memwa anlè ak pèfòmans minim.
  • Speed. Entèprèt LuaJIT la tou pre C nan anpil sitiyasyon, nan kèk sitiyasyon li pèdi nan Java, nan lòt moun li depase li. Pou kèk tan li te konsidere kòm eta a nan atizay, pi koul du JIT la. Koulye a, gen pi fre, men yo trè lou, pou egzanp, V8 la menm. Gen kèk entèprèt JS ak Java HotSpot ki pi rapid nan kèk pwen, men nan kèk kote yo toujou pèdi.
  • Fasil pou aprann. Si ou genyen, di, yon baz kòd Perl, epi ou pa Booking, ou p ap jwenn pwogramasyon Perl. Paske yo pa egziste, yo tout te pran, epi anseye yo se long ak difisil. Si ou vle pwogramasyon pou yon lòt bagay, ou gendwa gen tou pou yo antrene yo oswa jwenn yo. Nan ka Lua, tout bagay se senp. Nenpòt ki jinyò ka aprann Lua nan twa jou. Li te pran m 'apeprè de zè de tan konnen li soti. De zè de tan pita mwen te deja ekri kòd nan pwodiksyon an. Apeprè yon semèn pita li te ale tou dwat nan pwodiksyon epi li ale.

Kòm yon rezilta, li sanble sa a:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Genyen anpil isit la. OpenResty te kolekte yon pakèt modil, tou de luash ak motè. Epi ou gen tout bagay pare - deplwaye ak travay.

egzanp

Ase nan lyrics yo, ann deplase sou kòd la. Men yon ti bonjou mond:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Ki sa ki genyen? Sa a se yon kote Engins. Nou pa enkyete, nou pa ekri pwòp routage nou, nou pa pran kèk pare-fè yon sèl - nou deja genyen li nan NGINX, nou viv yon lavi bon ak parese.

content_by_lua_block se yon blòk ki di ke nou ap sèvi kontni lè l sèvi avèk yon script Lua. Nou pran varyab Engins la remote_addr epi mete l ladann string.format. Sa a se menm jan ak sprintf, sèlman nan Lua, sèlman kòrèk. Epi nou bay kliyan an li.

Kòm yon rezilta, li pral sanble tankou sa a:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Men, ann retounen nan mond reyèl la. Pèsonn pa deplwaye Hello World nan pwodiksyon an. Aplikasyon nou an anjeneral ale nan baz done a oswa yon lòt kote epi pi fò nan tan an ap tann pou yon repons.

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Li jis chita epi tann. Li pa trè bon. Lè 100.000 itilizatè yo vini, li trè difisil pou nou. Se konsa, kite a sèvi ak yon aplikasyon senp kòm yon egzanp. Nou pral chèche foto, pou egzanp, nan chat. Men, nou pa pral jis rechèch, nou pral elaji mo kle yo epi, si itilizatè a chache "ti chat," nou pral jwenn chat, chat fourur, ak sou sa. Premyèman, nou bezwen jwenn done demann lan sou backend la. Li sanble sa a:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

De liy pèmèt ou ranmase paramèt GET, pa gen okenn konplikasyon. Apre sa, ann di, nan yon baz done ki gen yon siy pou yon mo kle ak ekstansyon, nou jwenn enfòmasyon sa a lè l sèvi avèk yon rechèch SQL regilye. Li senp. Li sanble sa a:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Konekte bibliyotèk la resty.mysql, ke nou deja genyen nan twous la. Nou pa bezwen enstale anyen, tout bagay pare. Nou endike ki jan yo konekte ak fè yon rechèch SQL:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Li se yon ti kras pè isit la, men tout bagay ap mache. Isit la 10 se limit la. Nou rale 10 antre, nou parese, nou pa vle montre plis. Mwen bliye sou limit la nan SQL.

Apre sa, nou jwenn foto pou tout demann. Nou kolekte yon pakèt moun sou demann epi ranpli yon tab Lua rele reqs, epi nou fè ngx.location.capture_multi.

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Yo voye tout demann sa yo an paralèl, epi yo voye repons yo ba nou. Tan fonksyònman an egal ak tan repons lan ki pi dousman an. Si nou tout tire nan 50 milisgond, epi nou voye yon santèn demann, Lè sa a, nou pral resevwa yon repons nan 50 milisgond.

Depi nou parese epi nou pa vle ekri HTTP ak manyen kachèt, nou pral fè NGINX fè tout bagay pou nou. Kòm ou te wè, te gen yon demann pou url/fetch, isit la li ye:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Nou fè li senp proxy_pass, nou endike ki kote yo kachèt, ki jan fè li, ak tout bagay ap travay pou nou.

Men, sa a se pa ase, nou toujou bezwen bay done yo itilizatè a. Lide ki pi senp la se seri tout bagay nan JSON, fasil, nan de liy. Nou bay Content-Type, nou bay JSON.

Men, gen yon sèl difikilte: itilizatè a pa vle li JSON. Nou bezwen atire devlopè front-end. Pafwa nou pa vle fè sa nan premye. Ak espesyalis SEO yo pral di ke si nou ap chèche pou foto, Lè sa a, li pa enpòtan yo. Men, si nou ba yo kèk kontni, yo pral di ke motè rechèch nou an pa endèks anyen.

Kisa pou fè sou li? Natirèlman, nou pral bay itilizatè a HTML. Jenerasyon alamen pa comme il faut, kidonk nou vle sèvi ak modèl. Gen yon bibliyotèk pou sa lua-resty-template.

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Ou te pwobableman wè twa lèt pè OPM yo. OpenResty vini ak pwòp manadjè pake li yo, atravè ki ou ka enstale yon pakèt moun sou modil diferan, an patikilye, lua-resty-template. Sa a se yon motè modèl senp, menm jan ak modèl Django. Gen ou ka ekri kòd epi fè sibstitisyon varyab.

Kòm yon rezilta, tout bagay pral sanble yon bagay tankou sa a:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Nou te pran done yo epi rann modèl la, ankò nan de liy. Itilizatè a kontan, li te resevwa chat. Depi nou te elaji demann lan, li te resevwa tou yon fok fouri pou ti chat. Ou pa janm konnen, petèt li te kap chèche egzakteman sa a, men li pa t 'kapab fòmile demann li kòrèkteman.

Tout bagay se fre, men nou nan devlopman epi nou pa vle montre li bay itilizatè yo ankò. Ann fè otorizasyon an. Pou fè sa, ann gade ki jan NGINX jere demann lan an tèm OpenResty:

  • Premye faz - aksè, lè itilizatè a jis rive, epi nou gade l 'pa headers, pa adrès IP, ak pa lòt done. Nou ka koupe li imedyatman si nou pa renmen li. Sa a ka itilize pou otorizasyon, oswa si nou resevwa yon anpil nan demann, nou ka fasilman koupe yo nan faz sa a.
  • reyekri. Nou reekri kèk done demann.
  • kontni. Nou delivre kontni an bay itilizatè a.
  • headers filtre. Nou ranplase tèt repons yo. Si nou te itilize proxy_pass, nou ka reekri kèk headers anvan nou bay itilizatè a li.
  • kò filtre. Nou ka chanje kò a.
  • louvri sesyon - antre. Ou ka ekri mòso bwa nan elasticsearch san yon kouch adisyonèl.

Otorizasyon nou an pral sanble yon bagay tankou sa a:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Nou pral ajoute sa a nan yon sèl sa a location, ke nou te dekri anvan, epi mete kòd sa a la:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Nou gade pou wè si nou gen yon cookie token. Si ou pa, lè sa a nou mande pou otorizasyon. Itilizatè yo malen epi yo ka devine ke yo bezwen mete yon siy bonbon. Se poutèt sa, nou pral mete li tou nan Redis:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Kòd pou travay ak Redis trè senp epi li pa diferan de lòt lang. An menm tan an, tout D '/sòti, isit la ak la, se pa bloke. Si ou ekri kòd synchrone, li travay asynchrone. Prèske tankou gevent, men fè byen.

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Ann fè otorizasyon an tèt li:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Nou di ke nou bezwen li kò a nan demann lan. Nou resevwa agiman POST epi tcheke si login ak modpas yo kòrèk. Si yo pa kòrèk, lè sa a nou defye w pou otorizasyon. Men, si kòrèk, Lè sa a, ekri siy la nan Redis:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Pa bliye mete bonbon an, sa a tou fè nan de liy:

OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Egzanp lan se senp ak spéculatif. Natirèlman, nou pa pral fè yon sèvis ki montre moun chat. Men kiyès ki konnen nou. Se konsa, ann ale sou sa ki ka fè nan pwodiksyon an.

  • Backend minimalist. Pafwa nou bezwen pwodiksyon jis yon ti kras nan done nan backend la: yon kote nou bezwen mete yon dat, yon kote nou bezwen montre yon lis, di konbyen itilizatè yo sou sit la kounye a, tache yon kontwa oswa estatistik. Yon bagay konsa piti. Gen kèk moso minimòm ka fè trè fasil. Sa a pral fè li rapid, fasil ak gwo.
  • Done pre-traitement. Pafwa nou vle entegre piblisite nan paj nou an, epi nou resevwa piblisite sa a lè l sèvi avèk demann API. Sa a se trè fasil fè isit la. Nou pa chaje backend nou an, ki deja chita ak travay di. Ou ka pran li epi kolekte li isit la. Nou ka kob ansanm kèk JS oswa, Okontrè, dekonekte li ak preprocess yon bagay anvan yo bay li bay itilizatè a.
  • Fasad pou microservice. Sa a se tou yon ka trè bon, mwen aplike li. Anvan sa, mwen te travay nan Tenzor, yon konpayi ki fè fas ak rapò elektwonik ak bay rapò a apeprè mwatye nan antite legal nan peyi a. Nou te kreye yon sèvis, anpil bagay yo te fè la lè l sèvi avèk menm mekanis la: routage, otorizasyon ak plis ankò.
    OpenResty ka itilize kòm lakòl pou mikwosèvis ou yo, bay yon sèl aksè a tout bagay ak yon sèl koòdone. Depi mikwosèvis yo ka ekri nan yon fason ke ou gen Node.js isit la, PHP isit la, Python isit la, kèk bagay Erlang isit la, nou konprann ke nou pa vle reekri menm kòd la toupatou. Se poutèt sa, OpenResty ka ploge nan devan an.

  • Estatistik ak analytics. Anjeneral NGINX se nan papòt la, ak tout demann ale nan li. Li se nan kote sa a ke li trè pratik yo kolekte. Ou ka imedyatman kalkile yon bagay epi telechaje li yon kote, pou egzanp, Elasticsearch, Logstash, oswa tou senpleman ekri li nan boutèy la epi voye li yon kote.
  • Sistèm plizyè itilizatè. Pou egzanp, jwèt sou entènèt yo tou trè bon fè. Jodi a nan Cape Town, Alexander Gladysh pral pale sou ki jan yo byen vit pwototip yon jwèt multijoueurs lè l sèvi avèk OpenResty.
  • Filtrage demann (WAF). Sèjousi li alamòd pou fè tout kalite pare-feu aplikasyon entènèt; gen anpil sèvis ki bay yo. Sèvi ak OpenResty, ou ka fè tèt ou yon pare-feu aplikasyon entènèt ki pral tou senpleman ak fasil filtre demann selon kondisyon ou yo. Si ou gen Python, Lè sa a, ou konprann ke PHP definitivman pa pral enjekte nan ou, sof si, nan kou, ou anjandre li nenpòt kote nan konsole a. Ou konnen ou gen MySQL ak Python. Pwobableman, yo ta ka eseye fè kèk kalite travèse anyè epi enjekte yon bagay nan baz done a. Se poutèt sa, ou ka filtre demann etranj byen vit ak bon mache dwat devan an.
  • Kominote. Depi OpenResty bati sou NGINX, li gen yon bonis - sa a Kominote NGINX. Li trè gwo, epi yon pati desan nan kesyon ou pral genyen nan premye yo te deja rezoud pa kominote a NGINX.

    Lua devlopè. Yè mwen te pale ak mesye yo ki te vini nan jounen fòmasyon HighLoad++ la e mwen te tande se sèlman Tarantool ki te ekri nan Lua. Sa a se pa vre, anpil bagay yo ekri nan Lua. Egzanp: OpenResty, sèvè Prosody XMPP, motè jwèt Love2D, script Lua nan Warcraft ak lòt kote. Gen yon anpil nan devlopè Lua, yo gen yon kominote gwo ak reponn. Tout kesyon Lua mwen yo te rezoud nan kèk èdtan. Lè ou ekri nan lis adrès la, literalman nan kèk minit gen deja yon pakèt moun nan repons, ki dekri ki sa ak ki jan, ki sa ki nan sa. Li gwo. Malerezman, yon kominote kalite espirityèl konsa pa tout kote.
    Gen GitHub pou OpenResty, kote ou ka louvri yon pwoblèm si yon bagay kase. Gen yon lis adrès sou Google Groups, kote ou ka diskite sou pwoblèm jeneral, gen yon lis adrès an Chinwa - ou pa janm konnen, petèt ou pa pale angle, men ou konnen Chinwa.

Rezilta

  • Mwen espere ke mwen te kapab transmèt ke OpenResty se yon fondasyon trè pratik pwepare pou entènèt la.
  • Li gen yon baryè ki ba pou antre, depi kòd la sanble ak sa nou ekri nan, lang nan se byen senp ak minimalist.
  • Li bay I/O asynchrone san callbacks, nou p ap gen okenn nouy tankou nou ka pafwa ekri nan NodeJS.
  • Li gen deplwaman fasil, paske nou sèlman bezwen NGINX ak modil ki nesesè yo ak kòd nou an, ak tout bagay ap travay touswit.
  • Gwo kominote reponn.

Mwen pa t 'di an detay ki jan routage yo fè, li te tounen soti nan yon istwa trè long.

Mèsi pou atansyon ou!


Vladimir Protasov - OpenResty: vire NGINX nan yon sèvè aplikasyon konplè

Sous: www.habr.com

Add nouvo kòmantè