OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchitoTimasindikizanso zolembedwa za lipoti la msonkhano Kuthamanga Kwambiri ++ 2016, yomwe inachitikira ku Skolkovo pafupi ndi Moscow pa November 7-8 chaka chatha. Vladimir Protasov imawuza momwe mungakulitsire magwiridwe antchito a NGINX ndi OpenResty ndi Lua.

Moni nonse, dzina langa ndine Vladimir Protasov, ndimagwira ntchito ku Parallels. Ndikuuzani pang'ono za ine ndekha. Ndimathera magawo atatu mwa anayi a moyo wanga ndikulemba khodi. Ndinakhala wopanga mapulogalamu mpaka pachimake kwenikweni: Nthawi zina ndimawona code m'maloto anga. Gawo limodzi mwa magawo atatu a moyo ndi chitukuko cha mafakitale, kulemba code yomwe imapita mwachindunji kupanga. Nambala yomwe ena mwa inu mumagwiritsa ntchito koma simukudziwa.

Kuti ndikudziwitseni momwe zidalili. Ndili wamng'ono, ndinabwera ndipo anandipatsa ma terabyte awiriwa. Yafika pano kuti aliyense azikweza. Ndidapita kumisonkhano ndikufunsa kuti: "Anyamata, ndiuzeni, kodi muli ndi data yayikulu, zonse zili bwino? Kodi muli ndi maziko angati kumeneko? Iwo anandiyankha kuti: β€œTili ndi magigabaiti 100!” Ndidati: "Zozizira, magigabytes 100!" Ndipo ndinaganiza ndekha momwe ndingapulumutsire nkhope ya poker. Mukuganiza, inde, anyamatawa ndi abwino, ndiyeno mumabwereranso ndikukambirana ndi ma multi-terabyte databases. Ndipo uyu ndi kukhala junior. Kodi mungaganizire kuti kugunda kuli bwanji?

Ndikudziwa zilankhulo zopitilira 20. Izi ndi zomwe ndimayenera kuziganizira m'kati mwa ntchito. Amakupatsani kachidindo ku Erlang, ku C, ku C ++, ku Lua, ku Python, ku Ruby, muzinthu zina, ndipo muyenera kudula zonse. Mwambiri, ndinayenera kutero. Sizinali zotheka kuwerengera nambala yeniyeni, koma penapake kuzungulira 20 chiwerengerocho chinatayika.

Popeza kuti aliyense pano akudziwa kuti Parallels ndi chiyani komanso zomwe timachita, sindilankhula za momwe timasangalalira komanso zomwe timachita. Ndikungokuuzani kuti tili ndi maofesi a 13 padziko lonse lapansi, antchito oposa 300, chitukuko ku Moscow, Tallinn ndi Malta. Ngati mukufuna, mutha kutenga ndikusamukira ku Malta, ngati kukuzizira m'nyengo yozizira ndipo muyenera kutenthetsa msana wanu.

Mwachindunji, dipatimenti yathu imalemba mu Python 2. Tili mu bizinesi ndipo tilibe nthawi yodziwitsa zamakono zamakono, kotero timavutika. Tili ndi Django, chifukwa ili ndi chilichonse, ndipo tidatenga zochuluka ndikuzitaya. Komanso MySQL, Redis ndi NGINX. Tilinso ndi zinthu zina zambiri zabwino. Tili ndi MongoDB, tili ndi akalulu omwe akuyenda mozungulira, tilibe chilichonse - koma sichanga, ndipo sindichita.

OpenResty

Ndinadzifotokozera ndekha. Tiyeni tiwone zomwe ndikamba lero:

  • Kodi OpenResty ndi chiyani ndipo imadyedwa ndi chiyani?
  • Bwanji kubwezeretsanso gudumu tikakhala ndi Python, NodeJS, PHP, Go ndi zinthu zina zabwino zomwe aliyense amasangalala nazo?
  • Ndipo zitsanzo zingapo zenizeni za moyo. Ndinayenera kuchepetsa lipotilo kwambiri, chifukwa ndinalipeza kwa maola 3,5, kotero padzakhala zitsanzo zochepa.

OpenResty ndi NGINX. Tithokoze kwa iye, tili ndi seva yapaintaneti yodzaza, yomwe imalembedwa bwino, imagwira ntchito mwachangu. Ndikuganiza kuti ambiri aife timagwiritsa ntchito NGINX popanga. Inu nonse mukudziwa kuti iye ndi wofulumira komanso wozizira. Adapanga ma synchronous I / O momwemo, kotero sitifunika kuzungulira chilichonse monga momwe gevent idayendetsedwera ku Python. Gevent ndiyabwino, yoziziritsa, koma ngati mulemba C-code ndipo china chake sichikuyenda bwino ndi gevent, mudzapenga kuyisintha. Ndinali ndi chidziwitso: zinanditengera masiku awiri athunthu kuti ndizindikire chomwe chalakwika pamenepo. Ngati wina sanakumba kwa milungu ingapo m'mbuyomu, adapeza vutoli, adalemba pa intaneti, ndipo Google sanayipeze, ndiye kuti tikadapenga kwathunthu.

NGINX imachita kale caching komanso zokhazikika. Simuyenera kudandaula za momwe mungachitire mwaumunthu, kuti musachedwe kwinakwake, kuti musataye zofotokozera kwinakwake. Nginx ndiyosavuta kugwiritsa ntchito, simuyenera kuganizira zomwe mungatenge - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx idayikidwa, yoperekedwa kwa ma admins, amadziwa momwe angagwiritsire ntchito. Nginx imayendetsa zopempha m'njira yokonzedwa. Ndilankhula za izi posachedwa. Mwachidule, ali ndi gawo pamene adangovomereza pempho, pamene adakonza komanso pamene adapereka zomwe zili kwa wogwiritsa ntchito.

Nginx ndi yabwino, koma pali vuto limodzi: silisinthika mokwanira ngakhale ndi zinthu zonse zabwino zomwe anyamatawo adakankhira mu config, ngakhale kuti zikhoza kusinthidwa. Mphamvu imeneyi sikwanira. Chifukwa chake, anyamata ochokera ku Taobao kamodzi, ndikuganiza zaka eyiti zapitazo, adamanga Lua mmenemo. Amapereka chiyani?

  • kukula. Ndi yaying'ono. LuaJIT imapereka kwinakwake mozungulira 100-200 kilobytes yamakumbukidwe apamwamba komanso magwiridwe antchito pang'ono.
  • Kuthamanga. Womasulira wa LuaJIT ali pafupi ndi C nthawi zambiri, nthawi zina amataya Java, ena amadutsa. Kwa kanthawi, zinkaonedwa kuti ndi zaluso kwambiri, wopanga bwino kwambiri wa JIT. Tsopano pali ozizira, koma ndi olemera kwambiri, mwachitsanzo, V8 yomweyo. Omasulira ena a JS ndi Java HotSpot amathamanga nthawi zina, koma amataya nthawi zina.
  • Zosavuta kuphunzira. Ngati muli ndi, titi, Perl codebase ndipo simukusungitsa, simupeza opanga mapulogalamu a Perl. Chifukwa kulibe, onse adatengedwa, ndipo ndi nthawi yayitali komanso yovuta kuwaphunzitsa. Ngati mukufuna opanga mapulogalamu pazinthu zina, angafunikirenso kuphunzitsidwanso kapena kupezedwa. Pankhani ya Lua, zonse ndi zophweka. Lua atha kuphunziridwa ndi wamkulu aliyense m'masiku atatu. Zinanditengera pafupifupi maola awiri kuti ndizindikire. Maola awiri pambuyo pake, ndinali ndikulemba kale code mu kupanga. Patatha pafupifupi mlungu umodzi, iye anapita molunjika kukapanga ndipo ananyamuka.

Chifukwa chake, zikuwoneka motere:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Pali zambiri pano. OpenResty yasonkhanitsa ma module ambiri, onse a luash ndi injini. Ndipo muli ndi zonse zokonzeka - kutumizidwa ndikugwira ntchito.

zitsanzo

Nyimbo zokwanira, tiyeni tipitirire ku code. Nayi Hello World yaying'ono:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Kodi pali chiyani? awa ndi malo a injini. Sitikudandaula, sitimalemba njira zathu, sititenga zokonzekera - tili nazo kale ku NGINX, tikukhala bwino komanso mwaulesi.

content_by_lua_block ndi chipika chomwe chimati tikutumizira zinthu pogwiritsa ntchito Lua script. Timasankha injini zosiyanasiyana remote_addr ndikulowetsamo string.format. Izi ndizofanana ndi sprintf, ku Lua kokha, kulondola kokha. Ndipo timapereka kwa kasitomala.

Chifukwa chake, zikuwoneka motere:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Koma kubwerera ku dziko lenileni. Popanga, palibe amene amatumiza Hello World. Ntchito yathu nthawi zambiri imapita ku database kapena kwina kulikonse ndipo nthawi zambiri imadikirira kuyankha.

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Ingokhala ndikudikirira. Si zabwino kwambiri. Ogwiritsa 100.000 akabwera, zimakhala zovuta kwambiri kwa ife. Choncho, tiyeni tigwiritse ntchito pulogalamu yosavuta monga chitsanzo. Tidzayang'ana zithunzi, mwachitsanzo, amphaka. Kokha sitidzangofufuza, tidzakulitsa mawu osakira ndipo, ngati wogwiritsa ntchito asaka "ana amphaka", tidzapeza amphaka, fluffies, ndi zina zotero. Choyamba tiyenera kupeza deta pempho pa backend. Zikuwoneka motere:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Mizere iwiri imakulolani kuti mutenge magawo a GET, palibe zovuta. Ndiye ife, mwachitsanzo, timapeza izi kuchokera ku database yokhala ndi tebulo ndi mawu osakira ndi kuwonjezera pogwiritsa ntchito funso la SQL lokhazikika. Zonse ndi zophweka. Zikuwoneka motere:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Timagwirizanitsa laibulale resty.mysql, zomwe tili nazo kale mu kit. Sitiyenera kuyika chilichonse, zonse zakonzeka. Tchulani momwe mungalumikizire ndikupanga funso la SQL:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Ndizowopsa pang'ono, koma zimagwira ntchito. Apa 10 ndi malire. Timatulutsa zolemba 10, ndife aulesi, sitikufuna kuwonetsa zambiri. Mu SQL, ndinayiwala za malire.

Kenako timapeza zithunzi zamafunso onse. Timasonkhanitsa zopempha zambiri ndikudzaza tebulo la Lua lotchedwa reqs,ndi kuchita ngx.location.capture_multi.

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Zopempha zonsezi zimayendera limodzi, ndipo mayankho amabwezedwa kwa ife. Nthawi yothamanga ndi yofanana ndi nthawi yoyankha yochedwa kwambiri. Ngati tonse tiwombera mmbuyo mu 50 milliseconds, ndipo tinatumiza zopempha zana, ndiye tidzalandira yankho mu 50 milliseconds.

Popeza ndife aulesi ndipo sitikufuna kulemba HTTP kusamalira ndi caching, tidzapanga NGINX kutichitira chilichonse. Monga munaonera, panali pempho url/fetch, ndi uyu:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Timapanga zosavuta proxy_pass, tchulani komwe mungasungire, momwe mungachitire, ndipo chilichonse chimatigwirira ntchito.

Koma izi sizokwanira, tiyenerabe kupereka deta kwa wosuta. Lingaliro losavuta ndikusanja chilichonse ku JSON, mosavuta, m'mizere iwiri. Timapereka Content-Type, timapereka JSON.

Koma pali vuto limodzi: wosuta sakufuna kuwerenga JSON. Tiyenera kukopa opanga patsogolo. Nthawi zina sitifuna kuchita izo poyamba. Inde, ndipo akatswiri a SEO adzanena kuti ngati tikufuna zithunzi, ndiye kuti sasamala. Ndipo tikawapatsa zina, anganene kuti makina athu osakira salozera chilichonse.

Zotani nazo? Inde, tidzapatsa wogwiritsa ntchito HTML. Kupanga ndi zogwirira si comme il faut, kotero tikufuna kugwiritsa ntchito ma tempuleti. Pali laibulale ya izi lua-resty-template.

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Muyenera kuti mwawona zilembo zitatu zowopsa za OPM. OpenResty imabwera ndi woyang'anira phukusi lake, momwe mutha kukhazikitsa ma module osiyanasiyana, makamaka, lua-resty-template. Ndi injini ya template yosavuta yofanana ndi ma tempulo a Django. Kumeneko mukhoza kulemba code ndi kusintha variable m'malo.

Chifukwa chake, zonse zitha kuwoneka motere:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Tinatenga deta ndikupereka template kachiwiri mu mizere iwiri. Wogwiritsa ntchito ndi wokondwa, ali ndi amphaka. Popeza tinakulitsa pempholi, analandiranso chidindo cha ana amphaka. Simungadziwe, mwina anali kufunafuna, koma sanathe kupanga bwino pempho lake.

Chilichonse ndichabwino, koma tikukula, ndipo sitikufuna kuwonetsa ogwiritsa ntchito panobe. Tiyeni tichite chilolezo. Kuti tichite izi, tiyeni tiwone momwe NGINX imagwirizira pempholi malinga ndi OpenResty:

  • Gawo loyamba - kupeza, pamene wogwiritsa ntchito adangobwera, ndipo tinamuyang'ana pamutu, ndi adilesi ya IP, ndi deta ina. Mutha kuzidula nthawi yomweyo ngati sitikuzikonda. Izi zitha kugwiritsidwa ntchito ngati chilolezo, kapena ngati tilandila zopempha zambiri, titha kuzidula mosavuta panthawiyi.
  • lembaninso. Kulembanso zina zopempha.
  • okhutira. Timapereka zomwe zili kwa wogwiritsa ntchito.
  • fyuluta yapamutu. Sinthani mitu ya mayankho. Ngati tigwiritsa ntchito proxy_pass, titha kulembanso mitu ina tisanapereke kwa wogwiritsa ntchito.
  • thupi fyuluta. Tikhoza kusintha thupi.
  • fufuzani - kudula mitengo. Ndizotheka kulemba zipika mu elasticsearch popanda wosanjikiza wowonjezera.

Chilolezo chathu chidzawoneka motere:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Tiziwonjezera kwa izo location, zomwe tidazifotokozera kale, ndikuyika nambala iyi pamenepo:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Timayang'ana kuti tiwone ngati tili ndi chizindikiro cha cookie. Ngati sichoncho, ndiye kuti timapereka chilolezo. Ogwiritsa ntchito ndi ochenjera ndipo angaganize kuti chizindikiro cha cookie chiyenera kukhazikitsidwa. Chifukwa chake, tidzayiyikanso mu Redis:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Khodi yogwira ntchito ndi Redis ndiyosavuta komanso yosiyana ndi zilankhulo zina. Nthawi yomweyo, zolowetsa zonse / zotulutsa, zomwe zilipo, zomwe zili pano, sizikutsekereza. Ngati mulemba ma code synchronous, ndiye kuti imagwira ntchito mofanana. Monga ndi gevent, adangochita bwino.

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Tiyeni tichite chilolezo chokha:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Tikunena kuti tiyenera kuwerenga bungwe lopempha. Timalandila POST mfundo, fufuzani kuti malowedwe ndi mawu achinsinsi ndizolondola. Ngati zolakwika, ndiye kuti timaponyera chilolezo. Ndipo ngati ali olondola, ndiye timalemba chizindikiro kwa Redis:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Musaiwale kukhazikitsa cookie, izi zimachitikanso mizere iwiri:

OpenResty: kutembenuza NGINX kukhala seva yodzaza ndi ntchito

Chitsanzo ndi chosavuta, chongopeka. Ndithudi, sitidzapanga utumiki wosonyeza amphaka kwa anthu. Koma amene amatidziwa. Ndiye tiyeni tikambirane zomwe zingachitike popanga.

  • Minimalist backend. Nthawi zina timafunika kupereka zambiri ku backend: kwinakwake tiyenera kusintha tsikulo, kwinakwake tiyenera kusonyeza mtundu wina wa mndandanda, kunena kuti ndi angati omwe ali patsamba lino, wononga pa counter kapena ziwerengero. Chinachake chaching'ono kwambiri. Zidutswa zina zochepa zimatha kupangidwa mosavuta. Izi zidzakhala zachangu, zosavuta komanso zazikulu.
  • Kukonza deta. Nthawi zina timafuna kuyika zotsatsa patsamba lathu, ndipo timatenga zotsatsazi ndi zopempha za API. Izi ndizosavuta kuchita pano. Sitimakweza kumbuyo kwathu, komwe kukugwira ntchito molimbika. Mutha kunyamula ndikusonkhanitsa apa. Titha kuumba JS ina kapena, m'malo mwake, kumasula, kupangiratu china chake musanachipatse kwa wogwiritsa ntchito.
  • Facade kwa microservice. Uwunso ndi mlandu wabwino kwambiri, ndidaukhazikitsa. Izi zisanachitike, ndinkagwira ntchito ku kampani ya Tenzor, yomwe imapereka malipoti pafupifupi theka la mabungwe azamalamulo m’dzikolo. Tapanga ntchito, zinthu zambiri zimachitika kumeneko pogwiritsa ntchito njira yomweyo: mayendedwe, chilolezo, ndi zina zambiri.
    OpenResty itha kugwiritsidwa ntchito ngati guluu wa ma microservices anu kuti apereke mwayi umodzi pachilichonse komanso mawonekedwe amodzi. Popeza ma microservices amatha kulembedwa m'njira yoti muli ndi Node.js pano, muli ndi PHP pano, muli ndi Python pano, pali chinthu china cha Erlang apa, tikumvetsa kuti sitikufuna kulembanso code yomweyi kulikonse. Chifukwa chake, OpenResty imatha kulumikizidwa kutsogolo.

  • Ziwerengero ndi analytics. Nthawi zambiri NGINX ili pakhomo, ndipo zopempha zonse zimadutsamo. Ndi malo awa omwe ndi abwino kwambiri kusonkhanitsa. Mutha kuwerengera nthawi yomweyo china chake ndikuchiponya kwinakwake, mwachitsanzo, Elasticsearch yomweyo, Logstash, kapena kungolemba ku chipika ndikutumiza kwinakwake.
  • Multi-User Systems. Mwachitsanzo, masewera a pa intaneti ndi abwino kwambiri kuchita. Lero ku Cape Town Alexander Gladysh akuwuzani momwe mungapangire mwachangu masewera osewera ambiri pogwiritsa ntchito OpenResty.
  • Pemphani Sefa (WAF). Tsopano ndizowoneka bwino kupanga mitundu yonse ya ma firewall a intaneti, pali ntchito zambiri zomwe zimawapatsa. Mothandizidwa ndi OpenResty, mutha kudzipangira firewall yapaintaneti, yomwe imasefa zofunsira mosavuta malinga ndi zomwe mukufuna. Ngati muli ndi Python, ndiye kuti mukumvetsa kuti PHP sichidzabayidwa kwa inu, pokhapokha ngati mutayitulutsa paliponse kuchokera ku console. Mukudziwa kuti muli ndi MySQL ndi Python. Mwinamwake, apa atha kuyesa kupanga mtundu wina wa chikwatu chodutsa ndikulowetsa china chake mu database. Chifukwa chake, mutha kusefa zopempha zosayankhula mwachangu komanso zotsika mtengo kutsogolo.
  • Gulu. Popeza OpenResty idakhazikitsidwa ndi NGINX, ili ndi bonasi - iyi ndi Gulu la NGINX. Ndi yayikulu kwambiri, ndipo mafunso ambiri omwe mungakhale nawo poyamba ayankhidwa kale ndi gulu la NGINX.

    Madivelopa a Lua. Dzulo ndinayankhula ndi anyamata omwe adabwera ku tsiku la maphunziro a HighLoad ++ ndipo adamva kuti Tarantool yokhayo inalembedwa mu Lua. Izi siziri choncho, zinthu zambiri zalembedwa mu Lua. Zitsanzo: OpenResty, seva ya Prosody XMPP, injini yamasewera ya Love2D, Lua imalembedwa mu Warcraft ndi kwina. Pali ambiri opanga Lua, ali ndi gulu lalikulu komanso lomvera. Mafunso anga onse a Lua adayankhidwa mkati mwa maola ochepa. Mukalembera mndandanda wamakalata, kwenikweni mumphindi zochepa pali kale mulu wa mayankho, amafotokoza zomwe ndi momwe, ndi chiyani. Ndizopambana. Tsoka ilo, chitaganya chokoma mtima choterocho sichili paliponse.
    OpenResty ili ndi GitHub, komwe mungatsegule vuto ngati china chake chasweka. Pali mndandanda wamakalata pamagulu a Google komwe mungakambirane nkhani zambiri, pali mndandanda wamakalata mu Chitchaina - simudziwa, mwina simulankhula Chingerezi, koma mumadziwa Chitchaina.

Zotsatira

  • Ndikukhulupirira kuti ndidatha kuwonetsa kuti OpenResty ndi tsamba losavuta kwambiri.
  • Ili ndi malire otsika, popeza codeyo ndi yofanana ndi zomwe timalemba, chilankhulocho ndi chosavuta komanso chochepa.
  • Amapereka asynchronous I/O popanda kuyimba foni, sitidzakhala ndi Zakudyazi monga nthawi zina timalemba mu NodeJS.
  • Ili ndi kutumizidwa kosavuta, chifukwa timangofunika NGINX ndi module yoyenera ndi code yathu, ndipo chirichonse chimagwira ntchito nthawi yomweyo.
  • Anthu ambiri komanso omvera.

Sindinanene mwatsatanetsatane momwe mayendedwe amachitikira, idakhala nkhani yayitali kwambiri.

Zikomo chifukwa cha chidwi chanu!


Vladimir Protasov - OpenResty: kutembenuza NGINX kukhala seva yogwiritsira ntchito mokwanira

Source: www.habr.com

Kuwonjezera ndemanga