OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

OpenResty: mamadika ny NGINX ho mpizara fampiharana fenoAvoakanay indray ny dika mitovy amin'ny tatitry ny fihaonambe HighLoad ++ 2016, izay natao tao Skolkovo akaikin'i Moskoa tamin'ny 7-8 Novambra tamin'ny taon-dasa. Vladimir Protasov manazava ny fomba hanitarana ny fiasa NGINX amin'ny OpenResty sy Lua.

Salama daholo, Vladimir Protasov no anarako, miasa ao amin'ny Parallels aho. Hitantara kely aminareo momba ny tenako aho. Mandany ny telo ampahefatry ny fiainako aho manoratra kaody. Lasa programmer aho amin'ny lafiny ara-bakiteny: indraindray dia mahita code ao amin'ny nofiko aho. Ny ampahefatry ny fiainana dia fampandrosoana indostrialy, fanoratana fehezan-dalàna izay mandeha mivantana amin'ny famokarana. Kaody ampiasain'ny sasany aminareo nefa tsy tonga saina.

Noho izany dia azonao ny faharatsiana. Fony aho mbola zandriny dia tonga aho ary nomena ireo tahiry roa terabyte ireo. Enta-mavesatra ho an'ny rehetra eto izao. Nankany amin'ny fihaonambe aho ary nanontany hoe: "Ry lehilahy, lazao amiko fa manana data lehibe ianao, mahafinaritra ve ny zava-drehetra? Firy ny base anananao any? Namaly ahy izy ireo hoe: “Manana 100 gigabytes izahay!” Hoy aho: “Mahafinaritra, 100 gigabytes!” Ary nieritreritra ny tenako aho hoe ahoana no hikarakarana tsara ny tarehiko poker. Mieritreritra ianao, eny, mahafinaritra ry zalahy, ary avy eo dia miverina ianao ary mitsambikina miaraka amin'ireo angona maro-terabyte ireo. Ary izany dia ny maha zandriny. Azonao sary an-tsaina ve hoe inona izany kapoka izany?

Mahay fiteny fandaharana 20 mahery aho. Zavatra tsy maintsy noheveriko izany rehefa niasa aho. Manome kaody anao izy ireo amin'ny Erlang, C, C ++, Lua, Python, Ruby, zavatra hafa, ary tsy maintsy tapahanao daholo izany. Amin'ny ankapobeny dia tsy maintsy nanao izany aho. Tsy azo natao ny nikajy ny isa marina, fa tany amin’ny manodidina ny faha-20 tany ho any no very ny isa.

Koa satria fantatry ny rehetra manatrika ny atao hoe Parallels sy ny ataontsika, dia tsy hiresaka momba ny maha-cool antsika sy ny ataontsika aho. Lazaiko aminao fotsiny fa manana birao 13 manerana izao tontolo izao izahay, mpiasa maherin'ny 300, fampandrosoana ao Moskoa, Tallinn ary Malta. Raha tianao dia azonao atao ny mandray azy ary mifindra any Malta raha mangatsiaka ny ririnina ary mila manafana ny lamosinao ianao.

Amin'ny ankapobeny, ny departemantanay dia manoratra amin'ny Python 2. Eo am-piasana izahay ary tsy manam-potoana hampiharana ny teknolojia maoderina, ka mijaly izahay. Mampiasa Django izahay satria manana ny zava-drehetra, ary nalainay izay tsy ilaina dia narianay. Ary koa MySQL, Redis ary NGINX. Manana zavatra mahafinaritra maro hafa koa izahay. Manana MongoDB izahay, manana bitro mihazakazaka, manana ny zava-drehetra izahay - fa tsy ahy izany, ary tsy manao izany aho.

OpenResty

Nitantara ny tenako aho. Andeha hojerentsika izay horesahiko anio:

  • Inona ny OpenResty ary inona no fihinanana azy?
  • Maninona no mamorona kodia hafa indray rehefa manana Python, NodeJS, PHP, Go ary zavatra mahafinaritra hafa faly ny rehetra?
  • Ary ohatra vitsivitsy amin'ny fiainana. Tsy maintsy nanapaka be ny tatitra aho satria naharitra 3,5 ora izany, noho izany dia hisy ohatra vitsivitsy.

OpenResty dia NGINX. Misaotra azy, manana mpizara tranonkala feno izahay izay voasoratra tsara ary miasa haingana. Heveriko fa ny ankamaroantsika dia mampiasa NGINX amin'ny famokarana. Fantatrareo rehetra fa haingana sy mangatsiaka izy. Nanao I/O synchronous mahafinaritra ao anatiny izy ireo, ka tsy mila mihodikodina na inona na inona isika, toy ny nataon'izy ireo tamin'ny Python. Mahafinaritra i Gevent, mahafinaritra, fa raha manoratra kaody C ianao ary misy zavatra tsy mety, dia ho lasa adala ianao amin'ny debugging azy miaraka amin'i Gevent. Nanana ny traikefako aho: nandany roa andro teo ho eo vao nahita izay tsy nety tao. Raha nisy olona tsy nandavaka nandritra ny herinandro maromaro, nahita ny olana, nanoratra tao amin'ny Internet, ary Google tsy nahita izany, dia ho lasa adala tanteraka izahay.

NGINX dia efa manana caching sy votoaty static vita. Tsy mila miahiahy momba ny fomba hanaovana izany amin'ny maha-olombelona ianao, mba tsy hihamalemy any ho any, mba tsy ho very ny famaritana any ho any. Tena mety amin'ny fametrahana ny Nginx, tsy mila mieritreritra izay tokony horaisina ianao - WSGI, PHP-FPM, Gunicorn, Unicorn. Napetraka ny Nginx, nomena ny admin, hainy ny miasa aminy. Ny Nginx dia manodina ny fangatahana amin'ny fomba voalamina. Hiresaka momba izany aho aoriana kely. Raha fintinina dia manana dingana izy rehefa nanaiky ny fangatahana fotsiny, rehefa nanomana azy, ary rehefa nanolotra ny atiny ho an'ny mpampiasa.

Mangatsiatsiaka ny Nginx, saingy misy olana iray: tsy dia azo fehezina izy io, na dia miaraka amin'ireo endri-javatra mahafinaritra rehetra izay napetraky ny bandy ao amin'ny config, na dia eo aza ny zavatra azo amboarina. Tsy ampy io hery io. Izany no nahatonga ny bandy avy any Taobao, efa ela be, toa valo taona lasa izay, nanangana an'i Lua tao anatiny. Inona no omeny?

  • habe. Kely izy io. Ny LuaJIT dia manome fitadidiana 100-200 kilobytes eo ambonin'ny loha sy ambony ambony indrindra.
  • hafainganam-pandeha. Ny mpandika teny LuaJIT dia manakaiky ny C amin'ny toe-javatra maro, amin'ny toe-javatra sasany dia resy amin'ny Java, amin'ny hafa dia mihoatra noho izany. Nandritra ny fotoana kelikely dia noheverina ho toy ny zava-kanto, ilay mpamoron-kira JIT mahafinaritra indrindra. Ankehitriny dia misy mangatsiatsiaka kokoa, saingy mavesatra be, ohatra, ilay V8 mitovy. Ny mpandika teny JS sy Java HotSpot sasany dia haingana kokoa amin'ny fotoana sasany, saingy amin'ny toerana sasany dia mbola very izy ireo.
  • Mora ianarana. Raha manana, lazao, fototry ny kaody Perl ianao, ary tsy mamandrika ianao, dia tsy hahita programmer Perl ianao. Satria tsy misy izy ireo, dia nesorina avokoa izy rehetra, ary lava sy sarotra ny fampianarana azy ireo. Raha mila programmer ianao amin'ny zavatra hafa, dia mety tsy maintsy mamerina azy ireo ihany koa ianao na mahita azy ireo. Raha ny momba an'i Lua dia tsotra ny zava-drehetra. Ny zandriny rehetra dia afaka mianatra Lua ao anatin'ny telo andro. Naharitra adiny roa teo ho eo aho vao nahalala izany. Ora roa taty aoriana dia efa nanoratra fehezan-dalàna tamin'ny famokarana aho. Herinandro teo ho eo taty aoriana dia nivantana tamin'ny famokarana izy ary lasa.

Vokatr'izany dia toa izao:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Betsaka ny eto. OpenResty dia nanangona andiana maody, na luash na maotera. Ary efa vonona ny zava-drehetra ianao - napetraka sy miasa.

ohatra

Ampy izay ny tononkira, andao hiroso amin'ny code. Ity misy Hello World kely:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Inona no ao? Ity dia toerana misy ny Engins. Tsy manahy izahay, tsy manoratra ny lalanay manokana izahay, tsy maka izay efa vita - efa manana izany ao amin'ny NGINX izahay, miaina fiainana tsara sy kamo.

content_by_lua_block dia sakana izay milaza fa manolotra votoaty amin'ny alàlan'ny script Lua izahay. Raisinay ny fari-piainan'ny Engins remote_addr ary ampidiro ao string.format. Ity dia mitovy amin'ny sprintf, ao Lua ihany, marina ihany. Ary omenay ny mpanjifa.

Ho vokany, dia ho toy izao manaraka izao:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Fa andao hiverina amin'ny tontolo tena izy. Tsy misy olona mametraka Hello World amin'ny famokarana. Matetika mandeha any amin'ny database na any an-toeran-kafa ny fampiharana ataontsika ary miandry valiny ny ankamaroan'ny fotoana.

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Mipetraka fotsiny izy dia miandry. Tsy dia tsara loatra. Rehefa tonga ny mpampiasa 100.000 dia sarotra ho anay izany. Andao àry hampiasa fampiharana tsotra ho ohatra. Hitady sary, ohatra, ny saka. Saingy tsy hikaroka fotsiny izahay, hanitatra ny teny fanalahidy ary, raha mikaroka ny "saka" ny mpampiasa, dia hahita saka, saka volom-borona, sy ny sisa. Voalohany, mila maka ny angona fangatahana amin'ny backend isika. Toa izao izy io:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Ny andalana roa dia ahafahanao maka ny masontsivana GET, tsy misy fahasarotana. Manaraka, andao atao hoe, avy amin'ny angon-drakitra misy famantarana ho an'ny teny fototra sy fanitarana, dia mahazo ity fampahalalana ity amin'ny fampiasana fangatahana SQL mahazatra. Tsotra izany. Toa izao izy io:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Mampifandray ny tranomboky resty.mysql, izay efa ananantsika ao anaty kitapo. Tsy mila mametraka na inona na inona isika, efa vonona ny zava-drehetra. Tondroinay ny fomba fampifandraisana sy fanaovana fangatahana SQL:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Somary mampatahotra ny eto, fa mandeha ny zava-drehetra. Eto dia 10 no fetra. Misintona lahatsoratra 10 izahay, kamo izahay, tsy te hampiseho bebe kokoa. Adinoko ny fetra amin'ny SQL.

Avy eo dia mahita sary ho an'ny fanontaniana rehetra isika. Manangona fangatahana marobe izahay ary mameno latabatra Lua antsoina reqs, ary manao izany izahay ngx.location.capture_multi.

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Ireo fangatahana rehetra ireo dia alefa mifanitsy, ary averina amintsika ny valiny. Ny fotoana fiasana dia mitovy amin'ny fotoana famalian'ilay miadana indrindra. Raha mitifitra ao anatin'ny 50 milisegondra isika rehetra, ary mandefa fangatahana zato, dia hahazo valiny ao anatin'ny 50 milisegondra.

Koa satria kamo izahay ary tsy te hanoratra HTTP sy fikarakarana cache, dia hataonay ny NGINX hanao ny zava-drehetra ho anay. Araka ny hitanao dia nisy ny fangatahana url/fetch, ity izy:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Ataontsika tsotra izany proxy_pass, atoronay hoe aiza no hanaovana cache, ahoana no hanaovana azy, ary miasa ho anay ny zava-drehetra.

Saingy tsy ampy izany, mbola mila manome ny angon-drakitra ho an'ny mpampiasa isika. Ny hevitra tsotra indrindra dia ny mametraka ny zava-drehetra ao amin'ny JSON, mora, amin'ny andalana roa. Manome Content-Type izahay, manome JSON izahay.

Saingy misy fahasarotana iray: tsy te hamaky JSON ny mpampiasa. Mila misarika ny mpamorona eo anoloana isika. Indraindray isika dia tsy te hanao izany amin'ny voalohany. Ary ny manam-pahaizana momba ny SEO dia hilaza fa raha mitady sary isika dia tsy mampaninona azy ireo izany. Ary raha omentsika votoaty vitsivitsy izy ireo dia hilaza izy ireo fa tsy manisy index na inona na inona ny motera fikarohanay.

Inona no hatao amin'izany? Mazava ho azy fa homentsika HTML ny mpampiasa. Tsy comme il faut ny famoronana tanana, noho izany dia te hampiasa môdely izahay. Misy tranomboky ho an'izany lua-resty-template.

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Efa hitanao angamba ireo litera telo mampatahotra OPM. Ny OpenResty dia tonga miaraka amin'ny mpitantana ny fonosana manokana, izay ahafahanao mametraka andian-dahatsoratra samihafa, indrindra indrindra, lua-resty-template. Ity dia maotera maotera tsotra, mitovy amin'ny modely Django. Any ianao dia afaka manoratra kaody ary manao fanoloana miovaova.

Vokatr'izany dia ho toy izao ny zava-drehetra:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Nalainay ny angon-drakitra ary navoakanay tamin'ny andalana roa indray ilay môdely. Faly ilay mpampiasa, nahazo saka. Koa satria nanitatra ny fangatahana izahay, dia nahazo tombo-kase volom-borona ho an'ny saka kely koa izy. Tsy fantatrao mihitsy, angamba nitady an'ity marina izy, saingy tsy afaka namolavola tsara ny fangatahany.

Mangatsiatsiaka ny zava-drehetra, saingy eo amin'ny fampandrosoana izahay ary tsy te hampiseho izany amin'ny mpampiasa. Aleo atao ny fanomezan-dàlana. Mba hanaovana izany, andeha hojerentsika ny fomba itondran'ny NGINX ny fangatahana amin'ny teny OpenResty:

  • Dingana voalohany - fidirana, rehefa tonga ny mpampiasa, ary nijery azy tamin'ny lohapejy, adiresy IP, ary angona hafa izahay. Afaka manapaka avy hatrany isika raha tsy tiantsika. Azo ampiasaina amin'ny fanomezan-dàlana izany, na raha mahazo fangatahana be dia be isika dia afaka manapaka mora foana azy ireo amin'ity dingana ity.
  • mamerina manoratra. Manoratra angona fangatahana sasany izahay.
  • afa-po. Manatitra ny atiny amin'ny mpampiasa izahay.
  • sivana lohapejy. Soloinay ny lohatenin'ny valinteny. Raha nampiasa proxy_pass, afaka manoratra lohapejy vitsivitsy isika alohan'ny hanomezana azy ny mpampiasa.
  • sivana vatana. Afaka manova ny vatana isika.
  • hiditra — logging. Azonao atao ny manoratra logs amin'ny elasticsearch tsy misy sosona fanampiny.

Ho toy izao ny fanomezan-dàlana anay:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Hampianay amin'io location, izay nofaritanay teo aloha, ary apetraho ao ity code manaraka ity:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Mijery isika raha manana marika cookie. Raha tsy izany dia mangataka alalana izahay. Fetsy ny mpampiasa ary afaka maminavina fa mila mametraka marika cookie izy ireo. Noho izany, hametraka izany ao amin'ny Redis koa isika:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Ny kaody miasa amin'ny Redis dia tena tsotra ary tsy misy hafa amin'ny fiteny hafa. Amin'izay fotoana izay ihany koa dia tsy voasakana ny fidirana/famoahana rehetra, etsy sy eroa. Raha manoratra kaody synchronous ianao dia miasa tsy mifanaraka. Saika toa an'i gevent, fa natao tsara.

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Andeha isika hanao ny fanomezan-dàlana mihitsy:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Milaza izahay fa mila mamaky ny votoatin'ny fangatahana. Mahazo tohan-kevitra POST izahay ary manamarina fa marina ny fidirana sy ny tenimiafina. Raha diso izy ireo dia mihantsy anao izahay mba hahazoana alalana. Ary raha marina, dia soraty ao amin'ny Redis ny famantarana:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Aza adino ny mametraka ny cookie, izany koa dia atao amin'ny andalana roa:

OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Tsotra sy tombantombana ny ohatra. Mazava ho azy fa tsy hanao serivisy mampiseho saka ny olona izahay. Fa iza no mahalala antsika. Andeha àry hojerentsika izay azo atao amin'ny famokarana.

  • Minimalistic backend. Indraindray dia mila mamoaka angon-drakitra kely fotsiny any amin'ny backend isika: any amin'ny toerana tokony hampidirana daty, any amin'ny toerana tokony hanehoana lisitra, lazao hoe firy ny mpampiasa ao amin'ny tranokala ankehitriny, asio kaontera na antontan'isa. Zavatra kely dia kely. Ny ampahany kely indrindra dia azo atao mora. Izany dia hahatonga azy ho haingana, mora ary mahafinaritra.
  • Fanodinana ny angona. Indraindray izahay dia te hampiditra doka ao amin'ny pejinay, ary mandray ity doka ity amin'ny fampiasana ny fangatahana API. Tena mora ny manao izany eto. Tsy mametraka ny backend izahay, izay efa mipetraka sy miasa mafy. Azonao atao ny maka sy manangona azy eto. Azontsika atao ny manambatra ny JS sasany na, ny mifanohitra amin'izany, manasaraka azy ary manodina zavatra alohan'ny hanomezana azy ny mpampiasa.
  • Facade ho an'ny microservice. Tranga tena tsara ihany koa ity, nampihariko. Talohan'izay, niasa tao amin'ny Tenzor aho, orinasa misahana ny tatitra elektronika ary manome tatitra amin'ny antsasaky ny sampan-draharaha ara-dalàna ao amin'ny firenena. Namorona serivisy izahay, zavatra maro no natao tao tamin'ny alàlan'ny mekanika mitovy: zotra, fanomezan-dàlana ary maro hafa.
    OpenResty dia azo ampiasaina ho lakaoly ho an'ny microservices anao, manome fidirana tokana amin'ny zava-drehetra sy interface iray. Koa satria ny microservices dia azo soratana amin'ny fomba izay anananao Node.js eto, PHP eto, Python eto, zavatra Erlang sasany eto, dia takatsika fa tsy te hamerina hanoratra fehezan-dalàna mitovy na aiza na aiza. Noho izany, OpenResty dia azo ampidirina eo anoloana.

  • Statistika sy analyse. Matetika ny NGINX dia eo amin'ny fidirana, ary ny fangatahana rehetra dia mandalo ao. Ao amin'io toerana io no tena mety ny fanangonana. Afaka manao kajy avy hatrany ianao ary mampakatra azy any amin'ny toerana iray, ohatra, Elasticsearch, Logstash, na soraty fotsiny amin'ny log ary alefaso any amin'ny toerana iray.
  • Rafitra mpampiasa maro. Ohatra, ny lalao an-tserasera dia tena tsara ny manao. Androany any Cape Town, Alexander Gladysh dia hiresaka momba ny fomba fanaovana prototype haingana lalao Multiplayer amin'ny alàlan'ny OpenResty.
  • Mangataka sivana (WAF). Amin'izao fotoana izao dia lamaody ny manao karazana firewall fampiharana amin'ny Internet; misy serivisy maro manome azy ireo. Amin'ny fampiasana OpenResty, azonao atao ny manao ny tenanao ho firewall fampiharana tranonkala izay hanivana tsotra sy mora ny fangatahana araka ny fepetra takinao. Raha manana Python ianao, dia azonao antoka fa tsy hiditra ao aminao ny PHP, raha tsy hoe, mazava ho azy, ianao no mamoaka azy na aiza na aiza avy amin'ny console. Fantatrao fa manana MySQL sy Python ianao. Angamba, mety hanandrana hanao karazana traversal lahatahiry izy ireo ary manindrona zavatra ao anaty angon-drakitra. Noho izany, azonao atao ny manivana fanontaniana hafahafa haingana sy mora eo aloha.
  • Fiaraha-monina. Satria ny OpenResty dia naorina amin'ny NGINX, manana tombony izy - ity Fikambanana NGINX. Tena lehibe izy io, ary ny ampahany mendrika amin'ireo fanontaniana ho azonao amin'ny voalohany dia efa voavahan'ny vondrom-piarahamonina NGINX.

    Lua developers. Omaly aho dia niresaka tamin'ireo lehilahy tonga tamin'ny andro fanofanana HighLoad++ ary naheno fa ny Tarantool ihany no nosoratana tamin'ny Lua. Tsy marina izany, betsaka ny zavatra voasoratra ao Lua. Ohatra: OpenResty, mpizara Prosody XMPP, motera lalao Love2D, Lua voasoratra ao amin'ny Warcraft sy any an-kafa. Betsaka ny mpamorona Lua, manana vondrom-piarahamonina lehibe sy mandray andraikitra izy ireo. Voavaha tao anatin'ny ora vitsivitsy ny fanontaniako Lua rehetra. Rehefa manoratra amin'ny lisitry ny mailaka ianao, ao anatin'ny minitra vitsy dia efa misy valiny marobe, mamaritra hoe inona sy ahoana, inona. Mahafinaritra izany. Indrisy anefa fa tsy eny rehetra eny ny fiaraha-monina tsara fanahy sy ara-panahy toy izany.
    Misy GitHub ho an'ny OpenResty, izay ahafahanao manokatra olana raha misy zavatra tapaka. Misy lisitra mailaka ao amin'ny Google Groups, izay ahafahanao miresaka momba ny olana ankapobeny, misy ny lisitry ny mailaka amin'ny teny sinoa - tsy fantatrao mihitsy, angamba tsy miteny anglisy ianao, fa mahay teny sinoa.

vokatra

  • Manantena aho fa afaka nampita aho fa OpenResty dia rafitra mety tsara natao ho an'ny tranonkala.
  • Izy io dia manana sakana kely amin'ny fidirana, satria mitovy amin'ny zavatra soratanay ny kaody, ny fiteny dia tsotra sy minimalista.
  • Izy io dia manome I/O asynchronous tsy misy antso an-tariby, tsy hanana paty toy ny azontsika soratana amin'ny NodeJS indraindray.
  • Mora ny fametrahana azy, satria mila NGINX miaraka amin'ny maody ilaina sy ny kaodinay izahay, ary mandeha avy hatrany ny zava-drehetra.
  • Fiaraha-monina lehibe sy mandray andraikitra.

Tsy notantaraiko tamin'ny antsipiriany ny fomba fanaovana routing fa tena lava be ilay izy.

Fidio ny Fiteninao


Vladimir Protasov - OpenResty: mamadika ny NGINX ho mpizara fampiharana feno

Source: www.habr.com

Add a comment