OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

OpenResty: ho fetola NGINX ho seva sa kopo se felletsengRe boetse re phatlalatsa sengoloa sa tlaleho ea kopano Phahameng++ 2016, e ileng ea etsahala Skolkovo haufi le Moscow ka November 7-8 selemong se fetileng. Vladimir Protasov e hlalosa mokhoa oa ho holisa ts'ebetso ea NGINX ka OpenResty le Lua.

Lumelang bohle, lebitso la ka ke Vladimir Protasov, ke sebetsa Parallels. Ke tla u bolella hanyenyane ka 'na. Ke qeta kotara tse tharo tsa bophelo ba ka ke ngola khoutu. Ke ile ka ba moqapi oa mananeo ho ea mantlha ka kutloisiso ea sebele: ka linako tse ling ke bona khoutu litorong tsa ka. Kotara ea bophelo ke nts'etsopele ea indasteri, ho ngola khoutu e kenang ka kotloloho tlhahiso. Khoutu eo ba bang ba lona ba e sebelisang empa le sa e hlokomele.

Kahoo ua utloisisa hore na ho ne ho le hobe hakae. Ha ke sa le monyenyane, ke ile ka tla 'me ka fuoa li-database tsena tsa li-terabyte tse peli. Ke mojaro o phahameng ho motho e mong le e mong mona hona joale. Ke ile ka ea likopanong 'me ka botsa: "Banna, mpolelleng, le na le data e kholo, na ntho e' ngoe le e 'ngoe e monate? U na le litsi tse kae moo? Ba ile ba nkaraba: “Re na le li-gigabyte tse 100!” Ke ile ka re: “Ho lokile, li-gigabyte tse 100!” 'Me ke ne ke inahanela ho boloka sefahleho sa ka sa poker ka hloko. U nahana, ee, bashanyana ba pholile, ebe u khutlela morao 'me u nahana ka li-database tsena tsa multi-terabyte. 'Me sena ke ho ba mocha. A na u ka inahanela hore na see ke sefefo sefe?

Ke tseba lipuo tse fetang 20 tsa mananeo. Ena ke ntho eo ke neng ke tlameha ho e utloisisa ha ke ntse ke sebetsa. Ba u fa khoutu ho Erlang, C, C++, Lua, Python, Ruby, ntho e 'ngoe,' me u tlameha ho e khaola kaofela. Ka kakaretso, ke ne ke tlameha ho. Ho ne ho sa khonehe ho bala palo e tobileng, empa kae-kae ho pota 20 palo e ile ea lahleha.

Kaha e mong le e mong ea teng oa tseba hore na Parallels ke eng le hore na re etsa eng, nke ke ka bua ka hore na re pholile hakae le hore na re etsa eng. Ke tla u bolella feela hore re na le liofisi tsa 13 lefatšeng ka bophara, basebetsi ba fetang 300, nts'etsopele ea Moscow, Tallinn le Malta. Haeba u lakatsa, u ka e nka 'me ua fallela Malta haeba ho bata mariha 'me u hloka ho futhumatsa mokokotlo oa hau.

Ka ho khetheha, lefapha la rona le ngola ka Python 2. Re khoebong 'me ha re na nako ea ho kenya ts'ebetsong theknoloji ea feshene, kahoo re utloa bohloko. Re sebelisa Django hobane e na le ntho e ’ngoe le e ’ngoe, ’me re ile ra nka se neng se sa hlokahale ’me ra e lahla. Hape, MySQL, Redis le NGINX. Re boetse re na le tse ling tse ngata tse monate. Re na le MongoDB, re na le mebutlanyana e potolohang, re na le tsohle - empa ha se ea ka, 'me ha ke e etse.

OpenResty

Ke ile ka bolela ka nna. Ha re bone hore na ke tla bua ka eng kajeno:

  • OpenResty ke eng mme e jeoa ka eng?
  • Hobaneng re qapa lebili le leng ha re na le Python, NodeJS, PHP, Go le lintho tse ling tse monate tseo motho e mong le e mong a li thabelang?
  • Le mehlala e seng mekae ho tloha bophelong. Ke ile ka tlameha ho khaola tlaleho haholo hobane ho nkukile lihora tse 3,5, kahoo ho tla ba le mehlala e fokolang.

OpenResty ke NGINX. Ka lebaka la hae, re na le setsi sa marang-rang se feletseng se ngotsoeng hantle le se sebetsang ka potlako. Ke nahana hore boholo ba rona re sebelisa NGINX tlhahiso. Kaofela lea tseba hore o potlakile ebile o pholile. Ba entse I / O e pholileng ka har'a eona, kahoo ha ho hlokahale hore re potlakele letho, joalo ka ha ba entse gevent Python. Gevent e monate, e ntle, empa haeba u ngola khoutu ea C 'me ho na le ho hong ho sa tsamaeeng hantle, ka Gevent u tla hlanya ho e lokisa. Ke bile le boiphihlelo: ho nkile matsatsi a mabeli kaofela ho fumana hore na ho etsahetse eng moo. Haeba motho e mong a ne a sa cheka ho pota-pota ka libeke tse 'maloa, a fumana bothata, a ngola Inthaneteng,' me Google e sa ka ea e fumana, joale re ka be re hlanya ka ho feletseng.

NGINX e se e ntse e e-na le caching le litaba tse tsitsitseng tse entsoeng. Ha ho hlokahale hore u tšoenyehe ka mokhoa oa ho etsa sena ka botho, e le hore u se ke ua lieha kae-kae, e le hore u se ke ua lahleheloa ke litlhaloso kae-kae. Nginx e bonolo haholo ho e sebelisa, ha ho hlokahale hore u nahane ka seo u lokelang ho se nka - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx e kentsoe, e fuoe li-admins, ba tseba ho sebetsa le eona. Nginx e sebetsana le likopo ka mokhoa o hlophisitsoeng. Ke tla bua ka taba ena hamorao. Ka bokhuts'oane, e na le karolo ha e amohela kopo feela, ha e e sebetsa, le ha e ne e sebeletsa mosebelisi.

Nginx e pholile, empa ho na le bothata bo le bong: ha e fetohe ka ho lekaneng, leha e na le likarolo tsohle tse pholileng tseo bashanyana ba li kentseng ho config, ho sa tsotellehe se ka lokisoang. Matla ana ha a lekana. Ke ka lebaka leo bashanyana ba tsoang Taobao, khale, ho bonahalang eka lilemong tse robeli tse fetileng, ba hahile Lua ho eona. E fana ka eng?

  • boholo. E nyane. LuaJIT e fana ka li-kilobyte tse ka bang 100-200 tsa mohopolo o holimo le ts'ebetso e nyane haholo.
  • Lebelo. Mofetoleli oa LuaJIT o haufi le C maemong a mangata, maemong a mang o lahleheloa ke Java, ho tse ling o o feta. Ka nako e itseng e ne e nkoa e le boemo ba bonono, moqapi o pholileng ka ho fetisisa oa JIT. Hona joale ho na le tse pholileng, empa li boima haholo, mohlala, V8 e tšoanang. Bafetoleli ba bang ba JS le Java HotSpot ba potlakile lintlheng tse ling, empa libakeng tse ling ba ntse ba lahleheloa.
  • Ho bonolo ho ithuta. Haeba u na le, e re, motheo oa khoutu ea Perl, 'me ha u Booking, u ke ke ua fumana baetsi ba mananeo a Perl. Hobane ha li eo, li ile tsa nkoa kaofela, ’me ho li ruta ke nako e telele ’me ho thata. Haeba u batla baetsi ba mananeo bakeng sa ntho e 'ngoe, u ka tlameha ho ba koetlisa hape kapa ho ba fumana. Tabeng ea Lua, ntho e 'ngoe le e' ngoe e bonolo. Motho leha e le ofe e monyenyane a ka ithuta Lua ka matsatsi a mararo. Ho nkile lihora tse ka bang peli ho e utloisisa. Lihora tse peli hamorao ke ne ke se ke ntse ke ngola khoutu ka tlhahiso. Hoo e ka bang beke hamorao o ile a toba tlhahiso 'me a tsamaea.

Ka lebaka leo, e shebahala tjena:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Ho na le tse ngata mona. OpenResty e bokelletse bongata ba li-module, tse luash le tsa enjine. 'Me u na le tsohle tse lokiselitsoeng - tse sebelisoang le ho sebetsa.

mehlala

Ho lekane mantsoe a pina, ha re feteleng pele ho khoutu. Mona ke Hello World e nyane:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Ho na le eng? Sena ke sebaka sa Engins. Ha re tšoenyehe, ha re ngole tsela ea rona, ha re nke e seng e lokiselitsoe - re se re ntse re e-na le eona NGINX, re phela bophelo bo botle le bo botsoa.

content_by_lua_block ke block e reng re sebeletsa litaba re sebelisa mongolo oa Lua. Re nka Engins e feto-fetohang remote_addr mme o e kenye string.format. Hoa tšoana le sprintf, feela ka Lua, e nepahetse feela. 'Me re e fa mofani.

Ka lebaka leo, e tla shebahala tjena:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Empa a re khutleleng lefatšeng la sebele. Ha ho motho ea sebelisang Hello World ho hlahisa. Hangata kopo ea rona e ea ho database kapa kae-kae 'me boholo ba nako e emela karabo.

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

O dula feela mme a leta. Ha e ntle haholo. Ha basebelisi ba 100.000 ba tla, ho thata haholo ho rona. Kahoo ha re sebeliseng kopo e bonolo joalo ka mohlala. Re tla sheba litšoantšo, mohlala, likatse. Empa re ke ke ra batla feela, re tla atolosa mantsoe a bohlokoa, 'me haeba mosebedisi a batlile "likatiana," re tla fumana likatse, likatse tse boea, joalo-joalo. Taba ea pele, re hloka ho fumana data ea kopo ho backend. E shebahala tjena:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Mehala e 'meli e u lumella ho nka liparamente tsa GET, ha ho na mathata. Ka mor'a moo, ha re re, ho tswa ho database e nang le letšoao bakeng sa lentsoe la sehlooho le katoloso, re fumana boitsebiso bona ka ho sebelisa potso e tloaelehileng ea SQL. Ho bonolo. E shebahala tjena:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Ho hokela laeborari resty.mysql, eo re seng re e-na le eona ka har'a kit. Ha ho hlokahale hore re kenye letho, tsohle li lokile. Re bonts'a mokhoa oa ho hokahanya le ho etsa potso ea SQL:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Hoa tšosa hanyane mona, empa tsohle lia sebetsa. Mona 10 ke moeli. Re ntša likhakanyo tsa 10, re botsoa, ​​ha re batle ho bontša ho feta. Ke lebetse ka moeli oa SQL.

Ka mor'a moo re fumana litšoantšo bakeng sa lipotso tsohle. Re bokella sehlopha sa likopo ebe re tlatsa tafole ea Lua e bitsoang reqs, 'me re etsa joalo ngx.location.capture_multi.

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Likōpo tsena kaofela li romeloa ka nako e tšoanang, ’me likarabo li khutlisetsoa ho rōna. Nako ea ts'ebetso e lekana le nako ea karabo ea e liehang ka ho fetisisa. Haeba bohle re thunya ka 50 milliseconds, 'me re rometse likōpo tse lekholo, joale re tla fumana karabo ka 50 milliseconds.

Kaha re botsoa 'me ha re batle ho ngola HTTP le caching handling, re tla etsa hore NGINX e re etsetse ntho e' ngoe le e 'ngoe. Joalokaha u bone, ho ne ho e-na le kopo bakeng sa url/fetch, ke enoa:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Re e etsa e bonolo proxy_pass, re bontša moo re ka bolokang, mokhoa oa ho e etsa, 'me ntho e' ngoe le e 'ngoe e sebetsa molemong oa rona.

Empa sena ha sea lekana, re ntse re hloka ho fana ka data ho mosebelisi. Mohopolo o bonolo ke ho hlophisa ntho e ngoe le e ngoe ho JSON, habonolo, ka mela e 'meli. Re fana ka Content-Type, re fa JSON.

Empa ho na le bothata bo le bong: mosebelisi ha a batle ho bala JSON. Re hloka ho hohela baetsi ba pele. Ka linako tse ling ha re batle ho etsa sena qalong. Mme litsebi tsa SEO li tla re haeba re batla litšoantšo, ha ho na taba ho bona. 'Me haeba re ba fa litaba, ba tla re lienjineri tsa rona tsa ho batla ha li supe letho.

Seo u lokelang ho se etsa ka eona? Ehlile, re tla fa mosebelisi HTML. Ho hlahisa ka letsoho ha se ntho e ntle, kahoo re batla ho sebelisa litempele. Ho na le laebrari ea sena lua-resty-template.

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Mohlomong u bone litlhaku tse tharo tse tšosang OPM. OpenResty e tla le mookameli oa eona oa sephutheloana, eo ka eona u ka kenyang sehlopha sa li-module tse fapaneng, haholo-holo, lua-resty-template. Ena ke enjine e bonolo ea template, e ts'oanang le litempele tsa Django. Ha u le moo u ka ngola khoutu 'me u etsa phetoho e fapaneng.

Ka lebaka leo, ntho e 'ngoe le e' ngoe e tla shebahala tjena:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Re nkile data mme ra fana ka template, hape ka mela e 'meli. Mosebelisi o thabile, o amohetse likatse. Kaha re ile ra atolosa kōpo, o ile a boela a fumana tiiso ea boea bakeng sa likatsana. Ha u tsebe, mohlomong o ne a batla sena hantle, empa a sitoa ho etsa kopo ea hae ka nepo.

Ntho e ngoe le e ngoe e ntle, empa re nts'etsopele mme ha re batle ho e bonts'a basebelisi hajoale. Ha re etseng tumello. Ho etsa sena, a re shebeng hore na NGINX e sebetsana joang le kopo ka mantsoe a OpenResty:

  • Mohato oa pele - fihlella, ha mosebelisi a sa tsoa fihla, 'me re mo shebile ka lihlooho, ka aterese ea IP, le ka lintlha tse ling. Re ka e khaola hang-hang haeba re sa e rate. Sena se ka sebelisoa bakeng sa tumello, kapa haeba re fumana likopo tse ngata, re ka li khaola habonolo mothating ona.
  • ngola hape. Re ngola hape lintlha tse ling tsa kopo.
  • dikahare. Re isa litaba ho mosebelisi.
  • sefa sa lihlooho. Re fetola lihlooho tsa karabo. Haeba re sebelisa proxy_pass, re ka ngola lihlooho tse ling hape pele re e fa mosebelisi.
  • sefefo sa mmele. Re ka fetola 'mele.
  • kena - ho rema lifate. U ka ngola li-log ho elasticsearch ntle le lera le eketsehileng.

Tumello ea rona e tla shebahala tjena:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Re tla eketsa sena ho eane location, eo re e hlalositseng pele, mme re beha khoutu e latelang moo:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Re sheba ho bona hore na re na le letšoao la cookie. Haeba ho se joalo, joale re kopa tumello. Basebelisi ba bolotsana 'me ba ka hakanya hore ba hloka ho beha lets'oao la cookie. Ka hona, re tla e beha hape ho Redis:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Khoutu ea ho sebetsa le Redis e bonolo haholo ebile ha e fapane le lipuo tse ling. Ka nako e ts'oanang, tsohle tse kenyang / tlhahiso, mona le mane, ha li thibele. Haeba u ngola khoutu e lumellanang, e sebetsa ka mokhoa o ts'oanang. E batla e tšoana le gevent, empa e entsoe hantle.

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Ha re etseng tumello ka bo eona:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Re re re lokela ho bala 'mele oa kopo. Re amohela likhang tsa POST mme re hlahloba hore na ho kena le password li nepahetse. Haeba li fosahetse, re u phephetsa bakeng sa tumello. 'Me haeba ho nepahetse, joale ngola letšoao ho Redis:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

U se ke ua lebala ho beha cookie, sena se boetse se etsoa ka mela e 'meli:

OpenResty: ho fetola NGINX ho seva sa kopo se felletseng

Mohlala o bonolo ebile oa inahanela. Ha e le hantle, re ke ke ra etsa tšebeletso e bontšang batho likatse. Empa re tseba mang. Kahoo ha re hlahlobeng se ka etsoang tlhahisong.

  • Minimalistic backend. Ka nako e 'ngoe re hloka ho hlahisa boitsebiso bo fokolang feela ho backend: kae-kae re hloka ho kenya letsatsi, kae-kae re hloka ho bonts'a lethathamo, re bolele hore na ke basebelisi ba bakae ba setšeng hona joale, hokela k'haontareng kapa lipalo-palo. Ntho e nyane haholo. Likarolo tse ling tse nyane li ka etsoa habonolo haholo. Sena se tla etsa hore ho be bonolo, ho be bonolo ebile ho be monate.
  • Ts'ebetso ea data esale pele. Ka linako tse ling re batla ho kenya papatso leqepheng la rona, 'me re fumana papatso ena re sebelisa likopo tsa API. Sena se bonolo haholo ho se etsa mona. Ha re jare mokokotlo oa rona, o seng o lutse mme o sebetsa ka thata. U ka e lata 'me ua e bokella mona. Re ka kopanya JS e 'ngoe kapa, ka lehlakoreng le leng, ra e hlakola ebe re lokisa ntho e itseng pele re e fa mosebelisi.
  • Facade bakeng sa microservice. Taba ena le eona ke taba e ntle haholo, ke e kentse tšebetsong. Pele ho moo, ke ne ke sebetsa Tenzor, k'hamphani e sebetsanang le tlaleho ea elektroniki 'me e fana ka tlaleho ho hoo e ka bang halofo ea mekhatlo ea molao naheng ena. Re thehile tšebeletso, lintho tse ngata li entsoe moo ho sebelisoa mochine o tšoanang: ho tsamaisa, ho fana ka tumello le tse ling.
    OpenResty e ka sebelisoa e le sekhomaretsi sa li-microservices tsa hau, e fana ka phihlello e le 'ngoe ho tsohle le sebopeho se le seng. Kaha li-microservices li ka ngoloa ka tsela eo u nang le Node.js mona, PHP mona, Python mona, ntho e 'ngoe ea Erlang mona, rea utloisisa hore ha re batle ho ngola khoutu e tšoanang hohle. Ka hona, OpenResty e ka hokeloa ka pele.

  • Lipalopalo le analytics. Hangata NGINX e monyako, 'me likopo tsohle li ea ho eona. Ke sebakeng sena moo ho leng bonolo haholo ho bokella. Hang-hang u ka bala ntho e itseng 'me ua e kenya kae-kae, mohlala, Elasticsearch, Logstash, kapa u e ngolle feela ho log ebe u e romela kae-kae.
  • Sistimi ea basebelisi ba bangata. Mohlala, lipapali tsa inthaneteng le tsona li ntle haholo ho li etsa. Kajeno Cape Town, Alexander Gladysh o tla bua ka mokhoa oa ho tšoaea papali ea libapali tse ngata ka potlako o sebelisa OpenResty.
  • Kopa ho Sefa (WAF). Matsatsing ana ho feshene ho etsa mefuta eohle ea li-firewall tsa marang-rang; ho na le lits'ebeletso tse ngata tse fanang ka tsona. U sebelisa OpenResty, u ka iketsetsa firewall ea kopo ea webo e tla sefa likopo habonolo ho latela litlhoko tsa hau. Haeba u na le Python, joale ua utloisisa hore PHP e ke ke ea kenngoa ho uena, ntle le haeba, ehlile, u ka e hlahisa kae kapa kae ho tsoa ho khomphutha. Ua tseba hore u na le MySQL le Python. Mohlomong, ba ka 'na ba leka ho etsa mofuta o mong oa ho fetisoa ha directory le ho kenya ntho e itseng ka har'a database. Ka hona, o ka sefa lipotso tse makatsang kapele le ka theko e tlase hantle ka pele.
  • Sechaba. Kaha OpenResty e hahiloe ho NGINX, e na le bonase - ena Sechaba sa NGINX. E kholo haholo, 'me karolo e ntle ea lipotso tseo u tla ba le tsona qalong li se li rarollotsoe ke sechaba sa NGINX.

    Bahlahisi ba Lua. Maobane ke buile le bashanyana ba tlileng letsatsing la koetliso la HighLoad ++ 'me ba utloa hore Tarantool feela e ngotsoe ka Lua. Sena ha se 'nete, lintho tse ngata li ngotsoe ka Lua. Mehlala: OpenResty, Seva ea Prosody XMPP, enjine ea papali ea Love2D, Lua e ngotsoeng ho Warcraft le libakeng tse ling. Ho na le baetsi ba Lua ba bangata, ba na le sechaba se seholo le se arabelang. Lipotso tsohle tsa ka tsa Lua li ile tsa rarolloa ka mor'a lihora tse 'maloa. Ha u ngolla lethathamong la mangolo, ha e le hantle ka mor'a metsotso e seng mekae ho se ho ntse ho e-na le likarabo tse ngata, tse hlalosang hore na joang le joang, ke eng. Ho nepahetse. Ka bomalimabe, sechaba se joalo se mosa, sa moea ha se hohle.
    Ho na le GitHub bakeng sa OpenResty, moo o ka bulang bothata haeba ho na le ho hong ho robehileng. Ho na le lethathamo la mangolo ho Google Groups, moo o ka buisanang ka litaba tse akaretsang, ho na le lethathamo la mangolo ka Sechaena - ha u tsebe, mohlomong ha u bue Senyesemane, empa u tseba Sechaena.

Liphello

  • Ke ts'epa hore ke khonne ho fetisa hore OpenResty ke moralo o bonolo haholo o etselitsoeng marang-rang.
  • E na le tšitiso e tlase ea ho kena, kaha khoutu e ts'oana le seo re se ngolang, puo e bonolo ebile e nyane.
  • E fana ka Asynchronous I/O ntle le li-callbacks, re ke ke ra ba le li-noodle joalo ka ha ka linako tse ling re ka ngola ho NodeJS.
  • E na le ho tsamaisoa habonolo, kaha re hloka NGINX feela ka module e hlokahalang le khoutu ea rona, 'me ntho e' ngoe le e 'ngoe e sebetsa hang-hang.
  • Sechaba se seholo le se arabelang.

Ha kea bolela ka botlalo hore na routing e etsoa joang, e bile pale e telele haholo.

Kea le leboha ka tlhokomelo ea hau!


Vladimir Protasov - OpenResty: ho fetola NGINX ho seva ea kopo e felletseng

Source: www.habr.com

Eketsa ka tlhaloso