OpenResty: kugeuza NGINX kuwa seva ya programu kamili

OpenResty: kugeuza NGINX kuwa seva ya programu kamiliTunachapisha upya nakala ya ripoti kutoka kwa mkutano HighLoad ++ 2016, ambayo ilifanyika Skolkovo karibu na Moscow mnamo Novemba 7-8 mwaka jana. Vladimir Protasov inaelezea jinsi ya kupanua utendaji wa NGINX na OpenResty na Lua.

Hello kila mtu, jina langu ni Vladimir Protasov, ninafanya kazi kwa Sambamba. Nitakuambia kidogo juu yangu mwenyewe. Ninatumia robo tatu ya maisha yangu kuandika msimbo. Nikawa mtayarishaji programu kwa maana halisi: wakati mwingine mimi huona msimbo katika ndoto zangu. Robo ya maisha ni maendeleo ya viwanda, kuandika kanuni ambayo huenda moja kwa moja katika uzalishaji. Nambari ambayo baadhi yenu hutumia lakini hamjui.

Ili kukujulisha jinsi ilivyokuwa mbaya. Nilipokuwa mdogo, nilikuja na wakanipa hifadhidata hizi mbili za terabyte. Sasa iko hapa kwa kila mtu kupakia. Nilienda kwenye mikutano na kuuliza: "Jamani, niambieni, mna data kubwa, kila kitu ni sawa? Una besi ngapi hapo? Walinijibu: β€œTuna gigabaiti 100!” Nilisema: "Poa, gigabytes 100!" Na nilijifikiria jinsi ya kuokoa uso wa poker vizuri. Unafikiri, ndiyo, wavulana wako vizuri, halafu unarudi na kuchezea hifadhidata hizi za terabyte nyingi. Na hii ni kuwa junior. Unaweza kufikiria ni hit gani?

Ninajua zaidi ya lugha 20 za programu. Hili ndilo nililopaswa kufikiri wakati wa kazi. Wanakupa msimbo katika Erlang, katika C, katika C++, katika Lua, katika Python, katika Ruby, katika kitu kingine, na inabidi kuikata yote. Kwa ujumla, ilibidi. Haikuwezekana kuhesabu nambari halisi, lakini mahali fulani karibu 20 nambari ilipotea.

Kwa kuwa kila mtu hapa anajua Sambamba ni nini na tunafanya nini, sitazungumza kuhusu jinsi tulivyo baridi na kile tunachofanya. Nitakuambia tu kwamba tuna ofisi 13 duniani kote, wafanyakazi zaidi ya 300, maendeleo huko Moscow, Tallinn na Malta. Ikiwa unataka, unaweza kuchukua na kuhamia Malta, ikiwa ni baridi wakati wa baridi na unahitaji joto nyuma yako.

Hasa, idara yetu inaandika katika Python 2. Sisi ni katika biashara na hatuna muda wa kuanzisha teknolojia za mtindo, kwa hiyo tunateseka. Tuna Django, kwa sababu ina kila kitu, na tulichukua ziada na kuitupa. Pia MySQL, Redis na NGINX. Pia tuna mambo mengine mengi mazuri. Tuna MongoDB, tuna sungura wanaozunguka, hatuna chochote - lakini sio yangu, na sifanyi hivyo.

OpenResty

Niliambia juu yangu mwenyewe. Wacha tuone nitazungumza nini leo:

  • OpenResty ni nini na inaliwa na nini?
  • Kwa nini anzisha tena gurudumu wakati tuna Python, NodeJS, PHP, Go na mambo mengine mazuri ambayo kila mtu anafurahiya nayo?
  • Na mifano michache ya maisha halisi. Ilinibidi kupunguza ripoti sana, kwa sababu niliipata kwa masaa 3,5, kwa hivyo kutakuwa na mifano michache.

OpenResty ni NGINX. Shukrani kwake, tuna seva kamili ya wavuti, ambayo imeandikwa vizuri, inafanya kazi haraka. Nadhani wengi wetu hutumia NGINX katika uzalishaji. Ninyi nyote mnajua kuwa yeye ni mwepesi na mzuri. Walifanya I/O ifanane ndani yake, kwa hivyo hatuhitaji kuzungusha chochote kwa njia ile ile ambayo gevent ilizungushwa kwenye Python. Gevent ni nzuri, nzuri, lakini ukiandika C-code na kitu kitaenda vibaya na gevent, utaenda wazimu kuisuluhisha. Nilikuwa na uzoefu: ilichukua siku mbili nzima kubaini ni nini kilienda vibaya huko. Ikiwa mtu hakuwa na kuchimba kwa wiki chache kabla, alipata tatizo, akaiandika kwenye mtandao, na Google haikupata, basi tungekuwa wazimu kabisa.

NGINX tayari hufanya caching na yaliyomo tuli. Huna haja ya kuwa na wasiwasi kuhusu jinsi ya kufanya hivyo kwa kibinadamu, ili usipunguze mahali fulani, ili usipoteze maelezo mahali fulani. Nginx ni rahisi sana kupeleka, huna haja ya kufikiria juu ya nini cha kuchukua - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx iliwekwa, iliyotolewa kwa wasimamizi, wanajua jinsi ya kufanya kazi nayo. Nginx hushughulikia maombi kwa njia iliyopangwa. Nitazungumza juu ya hili baadaye kidogo. Kwa kifupi, ana awamu alipokubali ombi tu, aliposhughulikia na alipotoa yaliyomo kwa mtumiaji.

Nginx ni nzuri, lakini kuna shida moja: haibadilika vya kutosha hata na huduma hizo zote nzuri ambazo watu walisukuma kwenye usanidi, licha ya ukweli kwamba inaweza kubinafsishwa. Nguvu hii haitoshi. Kwa hivyo, watu kutoka Taobao hapo zamani, nadhani kama miaka minane iliyopita, walijenga Lua ndani yake. Anatoa nini?

  • Ukubwa. Ni ndogo. LuaJIT inatoa mahali fulani karibu kilobaiti 100-200 za juu ya kumbukumbu na utendakazi mdogo zaidi.
  • Kasi. Mkalimani wa LuaJIT yuko karibu na C katika hali nyingi, katika hali zingine hupoteza kwa Java, kwa zingine huipita. Kwa muda, ilizingatiwa hali ya sanaa, mkusanyaji mzuri zaidi wa JIT. Sasa kuna baridi zaidi, lakini ni nzito sana, kwa mfano, V8 sawa. Baadhi ya wakalimani wa JS na Java HotSpot wana kasi zaidi katika baadhi ya maeneo, lakini bado wanapoteza katika baadhi ya pointi.
  • Rahisi kujifunza. Ikiwa unayo, sema, msingi wa kanuni wa Perl na haujahifadhi, hautapata watengenezaji programu wa Perl. Kwa sababu hawapo, wote walichukuliwa, na ni muda mrefu na vigumu kuwafundisha. Ikiwa unataka waandaaji programu kwa kitu kingine, wanaweza pia kulazimika kufunzwa tena au kupatikana. Katika kesi ya Lua, kila kitu ni rahisi. Lua inaweza kujifunza na junior yoyote katika siku tatu. Ilinichukua kama masaa mawili kuelewa. Masaa mawili baadaye, nilikuwa tayari kuandika kanuni katika uzalishaji. Takriban wiki moja baadaye, alienda moja kwa moja kwenye uzalishaji na akaondoka.

Kama matokeo, inaonekana kama hii:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Kuna mengi hapa. OpenResty imekusanya rundo la moduli, zote mbili luash na injini. Na una kila kitu tayari - kupelekwa na kufanya kazi.

mifano

Maneno ya kutosha, hebu tuendelee kwenye kanuni. Hapa kuna Ulimwengu mdogo wa Hello:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Kuna nini? hii ndio eneo la injini. Hatuna wasiwasi, hatuandiki uelekezaji wetu wenyewe, hatuchukui iliyotengenezwa tayari - tayari tunayo huko NGINX, tunaishi vizuri na kwa uvivu.

content_by_lua_block ni kizuizi kinachosema kuwa tunatoa maudhui kwa kutumia hati ya Lua. Tunachukua tofauti ya injini remote_addr na kuiingiza ndani string.format. Hii ni sawa na sprintf, tu katika Lua, sahihi tu. Na tunampa mteja.

Kama matokeo, itaonekana kama hii:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Lakini kurudi kwenye ulimwengu wa kweli. Katika uzalishaji, hakuna mtu anayetumia Hello World. Maombi yetu kwa kawaida huenda kwenye hifadhidata au mahali pengine na mara nyingi husubiri jibu.

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Anakaa tu na kungoja. Sio nzuri sana. Watumiaji 100.000 wanapokuja, ni vigumu sana kwetu. Kwa hivyo, wacha tutumie programu rahisi kama mfano. Tutatafuta picha, kwa mfano, paka. Ni sisi tu hatutafuta tu, tutapanua maneno muhimu na, ikiwa mtumiaji alitafuta "kittens", tutapata paka, fluffies, na kadhalika. Kwanza tunahitaji kupata data ya ombi kwenye backend. Inaonekana kama hii:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Mistari miwili hukuruhusu kuchukua vigezo vya GET, hakuna shida. Kisha sisi, kwa mfano, tunapata habari hii kutoka kwa hifadhidata iliyo na jedwali kwa neno kuu na ugani kwa kutumia swali la kawaida la SQL. Kila kitu ni rahisi. Inaonekana kama hii:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Tunaunganisha maktaba resty.mysql, ambayo tayari tunayo kwenye kit. Hatuhitaji kusakinisha chochote, kila kitu kiko tayari. Bainisha jinsi ya kuunganisha na kufanya swali la SQL:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Inatisha kidogo, lakini inafanya kazi. Hapa 10 ndio kikomo. Tunatoa rekodi 10, sisi ni wavivu, hatutaki kuonyesha zaidi. Katika SQL, nilisahau kuhusu kikomo.

Kisha tunapata picha kwa maswali yote. Tunakusanya rundo la maombi na kujaza meza ya Lua inayoitwa reqs, na kufanya ngx.location.capture_multi.

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Maombi haya yote yanakwenda sambamba, na majibu yanarudishwa kwetu. Muda wa kukimbia ni sawa na wakati wa kujibu wa polepole zaidi. Ikiwa sote tutarejesha katika milisekunde 50, na tukatuma maombi mia moja, basi tutapokea jibu katika milisekunde 50.

Kwa kuwa sisi ni wavivu na hatutaki kuandika utunzaji na uhifadhi wa HTTP, tutafanya NGINX itufanyie kila kitu. Kama ulivyoona, kulikuwa na ombi la url/fetch, huyu hapa:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Tunafanya rahisi proxy_pass, taja wapi cache, jinsi ya kufanya hivyo, na kila kitu kinatufanyia kazi.

Lakini hii haitoshi, bado tunahitaji kutoa data kwa mtumiaji. Wazo rahisi zaidi ni kusasisha kila kitu kwa JSON, kwa urahisi, katika mistari miwili. Tunatoa Aina ya Maudhui, tunatoa JSON.

Lakini kuna ugumu mmoja: mtumiaji hataki kusoma JSON. Tunahitaji kuvutia watengenezaji wa mbele. Wakati mwingine hatujisikii kufanya hivyo mwanzoni. Ndio, na wataalamu wa SEO watasema kwamba ikiwa tunatafuta picha, basi hawajali. Na ikiwa tutawapa maudhui fulani, watasema kwamba injini zetu za utafutaji haziorodheshi chochote.

Nini cha kufanya nayo? Bila shaka, tutampa mtumiaji HTML. Kuzalisha kwa vishikizo si jambo la kawaida, kwa hivyo tunataka kutumia violezo. Kuna maktaba kwa hii lua-resty-template.

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Lazima umeona herufi tatu za kutisha OPM. OpenResty inakuja na meneja wake wa kifurushi, kupitia ambayo unaweza kusanikisha rundo la moduli tofauti, haswa, lua-resty-template. Ni injini ya kiolezo rahisi sawa na violezo vya Django. Huko unaweza kuandika nambari na ubadilishe tofauti.

Kama matokeo, kila kitu kitaonekana kama hii:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Tulichukua data na kutoa template tena katika mistari miwili. Mtumiaji anafurahi, ana paka. Kwa kuwa tulipanua ombi, pia alipokea muhuri wa manyoya kwa kittens. Huwezi kujua, labda alikuwa akiitafuta, lakini hakuweza kuunda ombi lake kwa usahihi.

Kila kitu ni kizuri, lakini tuko katika maendeleo, na bado hatutaki kuwaonyesha watumiaji. Wacha tufanye idhini. Ili kufanya hivyo, hebu tuone jinsi NGINX inavyoshughulikia ombi kulingana na OpenResty:

  • Awamu ya kwanza - kupata, wakati mtumiaji alikuja tu, na tukamtazama kwa vichwa, kwa anwani ya IP, na data nyingine. Unaweza kuikata mara moja ikiwa hatupendi. Hii inaweza kutumika kwa idhini, au ikiwa tutapokea maombi mengi, tunaweza kuyakata kwa urahisi katika awamu hii.
  • rewrite. Kuandika upya baadhi ya data ya ombi.
  • yaliyomo. Tunatoa maudhui kwa mtumiaji.
  • kichujio cha kichwa. Badilisha vichwa vya majibu. Ikiwa tulitumia proxy_pass, tunaweza kuandika upya baadhi ya vichwa kabla ya kumpa mtumiaji.
  • chujio cha mwili. Tunaweza kubadilisha mwili.
  • logi - ukataji miti. Inawezekana kuandika magogo katika elasticsearch bila safu ya ziada.

Uidhinishaji wetu utaonekana kama hii:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Tutaongeza kwa hilo location, ambayo tulielezea hapo awali, na kuweka nambari ifuatayo hapo:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Tunaangalia ikiwa tuna ishara ya kuki. Ikiwa sivyo, basi tunatupa idhini. Watumiaji ni wajanja na wanaweza kudhani kuwa ishara ya kuki inahitaji kuwekwa. Kwa hivyo, tutaiweka pia katika Redis:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Nambari ya kufanya kazi na Redis ni rahisi sana na haina tofauti na lugha zingine. Wakati huo huo, pembejeo / pato zote, ni nini, ni nini hapa, sio kuzuia. Ikiwa utaandika msimbo wa kusawazisha, basi inafanya kazi kwa usawa. Kama na gevent, imefanya vizuri tu.

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Wacha tufanye idhini yenyewe:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Tunasema kwamba tunahitaji kusoma mwili wa ombi. Tunapokea hoja za POST, angalia ikiwa kuingia na nenosiri ni sahihi. Ikiwa sio sahihi, basi tunatupa idhini. Na ikiwa ni sawa, basi tunaandika ishara kwa Redis:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Usisahau kuweka kuki, hii pia inafanywa kwa mistari miwili:

OpenResty: kugeuza NGINX kuwa seva ya programu kamili

Mfano ni rahisi, wa kubahatisha. Bila shaka, hatutafanya huduma inayoonyesha paka kwa watu. Lakini ni nani anayetujua. Kwa hivyo wacha tuchunguze kile kinachoweza kufanywa katika uzalishaji.

  • Mandhari ya chini kabisa. Wakati mwingine tunahitaji kutoa data kidogo kabisa kwa mazingira ya nyuma: mahali fulani tunahitaji kubadilisha tarehe, mahali fulani tunahitaji kuonyesha aina fulani ya orodha, sema ni watumiaji wangapi walio kwenye tovuti sasa, futa kaunta au takwimu. Kitu kidogo sana. Vipande vingine vidogo vinaweza kufanywa kwa urahisi sana. Hii itakuwa haraka, rahisi na nzuri.
  • Usindikaji wa data. Wakati mwingine tunataka kupachika matangazo katika ukurasa wetu, na tunachukua matangazo haya kwa maombi ya API. Hii ni rahisi sana kufanya hapa. Hatupakii backend yetu, ambayo tayari inafanya kazi kwa bidii. Unaweza kuchukua na kukusanya hapa. Tunaweza kuunda baadhi ya JS au, kinyume chake, kubatilisha, kuchakata kitu kabla ya kumpa mtumiaji.
  • Facade kwa microservice. Hii pia ni kesi nzuri sana, niliitekeleza. Kabla ya hapo, nilifanyia kazi Tenzor, kampuni ya kuripoti kielektroniki ambayo hutoa ripoti kwa takriban nusu ya mashirika ya kisheria nchini. Tumetengeneza huduma, mambo mengi yanafanywa huko kwa kutumia utaratibu sawa: uelekezaji, uidhinishaji, na zaidi.
    OpenResty inaweza kutumika kama gundi ya huduma ndogo zako ili kutoa ufikiaji mmoja kwa kila kitu na kiolesura kimoja. Kwa kuwa huduma ndogo zinaweza kuandikwa kwa njia ambayo unayo Node.js hapa, unayo PHP hapa, una Python hapa, kuna kitu cha Erlang hapa, tunaelewa kuwa hatutaki kuandika tena msimbo sawa kila mahali. Kwa hivyo, OpenResty inaweza kuunganishwa mbele.

  • Takwimu na uchanganuzi. Kawaida NGINX iko kwenye mlango, na maombi yote hupitia. Ni mahali hapa kwamba ni rahisi sana kukusanya. Unaweza mara moja kuhesabu kitu na kutupa mahali fulani, kwa mfano, Elasticsearch sawa, Logstash, au tu kuandika kwa logi na kisha kutuma mahali fulani.
  • Mifumo ya Watumiaji wengi. Kwa mfano, michezo ya mtandaoni pia ni nzuri sana kufanya. Leo huko Cape Town Alexander Gladysh atakuambia jinsi ya kuunda haraka mchezo wa wachezaji wengi kwa kutumia OpenResty.
  • Ombi la Kuchuja (WAF). Sasa ni mtindo kufanya kila aina ya firewalls ya maombi ya mtandao, kuna huduma nyingi zinazowapa. Kwa msaada wa OpenResty, unaweza kujitengenezea firewall ya programu ya wavuti, ambayo itachuja maombi kwa urahisi na kwa urahisi kulingana na mahitaji yako. Ikiwa unayo Python, basi unaelewa kuwa PHP hakika haitadungwa kwako, isipokuwa, kwa kweli, utaitoa popote kutoka kwa koni. Unajua unayo MySQL na Python. Labda, hapa wanaweza kujaribu kufanya aina fulani ya upitishaji wa saraka na kuingiza kitu kwenye hifadhidata. Kwa hivyo, unaweza kuchuja maombi bubu haraka na kwa bei nafuu hapo mbele.
  • Jamii. Kwa kuwa OpenResty inategemea NGINX, ina bonasi - hii ni Jumuiya ya NGINX. Ni kubwa sana, na maswali mengi ambayo utakuwa nayo mwanzoni tayari yamejibiwa na jumuiya ya NGINX.

    Watengenezaji wa Lua. Jana nilizungumza na wavulana waliokuja kwenye siku ya mafunzo ya HighLoad ++ na nikasikia kwamba Tarantool pekee imeandikwa kwa Kilua. Hii sivyo, mambo mengi yameandikwa kwa Lua. Mifano: OpenResty, seva ya Prosody XMPP, injini ya mchezo ya Love2D, Lua imeandikwa katika Warcraft na kwingineko. Kuna watengenezaji wengi wa Lua, wana jumuiya kubwa na sikivu. Maswali yangu yote ya Lua yalijibiwa ndani ya masaa machache. Unapoandika kwa orodha ya barua, kwa kweli katika dakika chache tayari kuna rundo la majibu, wanaelezea nini na jinsi gani, ni nini. Ni nzuri. Kwa bahati mbaya, jamii ya dhati kama hiyo haipo kila mahali.
    OpenResty ina GitHub, ambapo unaweza kufungua suala ikiwa kitu kitavunjika. Kuna orodha ya wanaotuma barua pepe kwenye Vikundi vya Google ambapo unaweza kujadili masuala ya jumla, kuna orodha ya wanaotuma barua kwa Kichina - huwezi kujua, labda huzungumzi Kiingereza, lakini unajua Kichina.

Matokeo ya

  • Natumai niliweza kuwasilisha kwamba OpenResty ni mfumo rahisi sana wa wavuti.
  • Ina kizingiti cha chini cha kuingia, kwa kuwa msimbo ni sawa na kile tunachoandika, lugha ni rahisi sana na ndogo.
  • Inatoa I/O asynchronous bila callbacks, hatutakuwa na noodles kama tunaweza kuandika wakati mwingine katika NodeJS.
  • Ina kupelekwa kwa urahisi, kwa sababu tunahitaji tu NGINX na moduli sahihi na msimbo wetu, na kila kitu hufanya kazi mara moja.
  • Jumuiya kubwa na inayoitikia.

Sikusema kwa undani jinsi uelekezaji unafanywa, iligeuka kuwa hadithi ndefu sana.

Asante!


Vladimir Protasov - OpenResty: kugeuza NGINX kuwa seva ya maombi kamili

Chanzo: mapenzi.com

Kuongeza maoni