OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirishBiz yana konferentsiya hisobotining stenogrammasini e'lon qilamiz Yuqori yuk ++ O'tgan yilning 2016-7 noyabr kunlari Moskva yaqinidagi Skolkovoda bo'lib o'tgan 8 yil. Vladimir Protasov OpenResty va Lua bilan NGINX funksiyasini qanday kengaytirishni tushuntiradi.

Hammaga salom, mening ismim Vladimir Protasov, men Parallelsda ishlayman. Men sizga o'zim haqimda bir oz aytib beraman. Men hayotimning to'rtdan uch qismini kod yozishga sarflayman. Men tom ma'noda dasturchi bo'ldim: ba'zida tushimda kodni ko'raman. Hayotning to'rtdan bir qismi sanoat rivojlanishi, to'g'ridan-to'g'ri ishlab chiqarishga kiradigan kod yozish. Ba'zilaringiz foydalanadigan, lekin buni tushunmaydigan kod.

Shunday qilib, siz qanchalik yomon ekanligini tushunasiz. Men bir oz kichik bo'lganimda, menga ikki terabaytlik ma'lumotlar bazalarini berishdi. Hozir bu yerda hamma uchun katta yuk. Men konferentsiyalarga bordim va so'radim: “Yigitlar, ayting-chi, sizda katta ma'lumotlar bor, hammasi zo'rmi? U yerda qancha bazangiz bor? Ular menga javob berishdi: "Bizda 100 gigabayt bor!" Men: "Ajoyib, 100 gigabayt!" Va men o'zimning poker yuzimni qanday qilib ehtiyotkorlik bilan saqlashni o'yladim. Sizningcha, ha, yigitlar zo'r, keyin siz orqaga qaytib, bu ko'p terabaytli ma'lumotlar bazalari bilan shug'ullanasiz. Va bu - kichik bo'lish. Bu qanday zarba ekanligini tasavvur qila olasizmi?

Men 20 dan ortiq dasturlash tillarini bilaman. Buni men ishlaganimda tushunishim kerak edi. Ular sizga Erlang, C, C++, Lua, Python, Ruby va boshqa biror narsada kod beradilar va barchasini kesib tashlashingiz kerak. Umuman olganda, men majbur bo'ldim. Aniq raqamni hisoblashning iloji bo'lmadi, lekin 20-yilda bir joyda raqam yo'qoldi.

Hozir hamma Parallels nima ekanligini va nima qilayotganimizni bilganligi sababli, men qanchalik ajoyib ekanligimiz va nima qilayotganimiz haqida gapirmayman. Sizga shuni aytamanki, bizning dunyo bo'ylab 13 ta ofisimiz, 300 dan ortiq xodimimiz, Moskva, Tallin va Maltada rivojlanish. Agar xohlasangiz, qishda sovuq bo'lsa va orqangizni isitishingiz kerak bo'lsa, uni olib, Maltaga ko'chishingiz mumkin.

Xususan, bizning bo'lim Python 2 da yozadi. Biz biznes bilan shug'ullanamiz va zamonaviy texnologiyalarni joriy etishga vaqtimiz yo'q, shuning uchun biz qiynaymiz. Biz Django-dan foydalanamiz, chunki unda hamma narsa bor va biz keraksiz narsalarni olib tashladik. Shuningdek, MySQL, Redis va NGINX. Bundan tashqari, bizda juda ko'p boshqa ajoyib narsalar bor. Bizda MongoDB bor, bizda quyonlar yuguradi, bizda hamma narsa bor - lekin bu meniki emas va men buni qilmayman.

OpenResty

Men o'zim haqimda aytdim. Keling, bugun nima haqida gaplashmoqchi ekanligimni aniqlaylik:

  • OpenResty nima va u nima bilan iste'mol qilinadi?
  • Nega bizda Python, NodeJS, PHP, Go va hamma mamnun bo'lgan boshqa ajoyib narsalar mavjud bo'lsa, boshqa g'ildirakni qayta ixtiro qilish kerak?
  • Va hayotdan bir nechta misollar. Hisobotni juda ko'p kesishim kerak edi, chunki bu menga 3,5 soat vaqtni oldi, shuning uchun bir nechta misollar bo'ladi.

OpenResty - bu NGINX. Unga rahmat, bizda yaxshi yozilgan va tez ishlaydigan to'liq veb-server mavjud. O'ylaymanki, ko'pchiligimiz ishlab chiqarishda NGINX dan foydalanamiz. Hammangiz uning tez va zo'r ekanligini bilasiz. Ular unda ajoyib sinxron I/U ni yaratdilar, shuning uchun Python-da gevent qilganidek, biz hech narsani aylantirishimiz shart emas. Gevent juda zo'r, zo'r, lekin agar siz C kodini yozsangiz va biror narsa noto'g'ri bo'lsa, Gevent bilan uni tuzatishda aqldan ozgan bo'lasiz. Menda tajriba bor edi: u erda nima noto'g'ri bo'lganini aniqlash uchun ikki kun kerak bo'ldi. Agar kimdir bir necha hafta davomida qazilmagan bo'lsa, muammoni topsa, Internetda yozsa va Google buni topa olmasa, biz butunlay aqldan ozgan bo'lardik.

NGINX allaqachon keshlash va statik tarkibga ega. Buni insoniy tarzda qanday qilish kerakligi haqida tashvishlanishning hojati yo'q, shunda siz biron bir joyda sekinlashtirmaysiz, shuning uchun siz biron bir joyda tavsiflovchilarni yo'qotmaysiz. Nginx-ni joylashtirish juda qulay, siz nima olish kerakligi haqida o'ylashingiz shart emas - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx o'rnatildi, administratorlarga berildi, ular u bilan qanday ishlashni bilishadi. Nginx so'rovlarni tuzilgan tarzda qayta ishlaydi. Bu haqda biroz keyinroq gaplashaman. Muxtasar qilib aytganda, u so'rovni hozirgina qabul qilgan, uni qayta ishlagan va kontentni foydalanuvchiga taqdim etgan bosqichga ega.

Nginx juda zo'r, ammo bitta muammo bor: u sozlash mumkin bo'lgan narsalarga qaramay, yigitlar konfiguratsiyaga kiritgan barcha ajoyib xususiyatlarga ega bo'lsa ham, etarlicha moslashuvchan emas. Bu kuch etarli emas. Shuning uchun Taobao yigitlari, uzoq vaqt oldin, sakkiz yil oldin, Luani unga qurishganga o'xshaydi. Bu nima beradi?

  • hajmi. Bu kichik. LuaJIT taxminan 100-200 kilobayt xotira yukini va minimal ishlash yukini beradi.
  • tezlik. LuaJIT tarjimoni ko'p holatlarda C ga yaqin, ba'zi holatlarda Java-ga yutqazadi, ba'zilarida esa undan ustun turadi. Bir muncha vaqt u eng zamonaviy JIT kompilyatori hisoblangan. Endi sovuqroqlari bor, lekin ular juda og'ir, masalan, bir xil V8. Ba'zi JS tarjimonlari va Java HotSpot ba'zi nuqtalarda tezroq, lekin ba'zi joylarda ular hali ham yo'qotadilar.
  • O'rganish oson. Agar sizda, aytaylik, Perl kod bazasi bo'lsa va siz bron qilmasangiz, Perl dasturchilarini topa olmaysiz. Ular mavjud bo'lmagani uchun hammasi olib ketilgan va ularni o'rgatish uzoq va qiyin. Agar siz boshqa biror narsa uchun dasturchilarni xohlasangiz, ularni qayta tayyorlashingiz yoki topishingiz kerak bo'lishi mumkin. Lua misolida hamma narsa oddiy. Har qanday o'smir Luani uch kun ichida o'rganishi mumkin. Buni aniqlash uchun menga ikki soatcha vaqt ketdi. Ikki soatdan keyin men allaqachon ishlab chiqarishda kod yozayotgan edim. Taxminan bir hafta o'tgach, u to'g'ridan-to'g'ri ishlab chiqarishga ketdi va ketdi.

Natijada, u quyidagicha ko'rinadi:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Bu yerda ko'p narsa bor. OpenResty bir qator modullarni, ham luash, ham dvigatellarni to'pladi. Va sizda hamma narsa tayyor - joylashtirilgan va ishlaysiz.

misollar

Qo‘shiq matni yetarli, keling kodga o‘tamiz. Mana bir oz Salom Dunyo:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Nima bor? Bu Engins manzili. Biz tashvishlanmaymiz, biz o'z marshrutimizni yozmaymiz, tayyor marshrutni olmaymiz - bizda NGINX-da allaqachon mavjud, biz yaxshi va dangasa hayot kechiramiz.

content_by_lua_block Lua skripti yordamida tarkibga xizmat ko'rsatayotganimizni aytadigan blok. Biz Engins o'zgaruvchisini olamiz remote_addr va uni qo'ying string.format. Bu xuddi shunday sprintf, faqat Luada, faqat to'g'ri. Va biz uni mijozga beramiz.

Natijada, u quyidagicha ko'rinadi:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Ammo keling, haqiqiy dunyoga qaytaylik. Hech kim Hello World-ni ishlab chiqarishga joylashtirmaydi. Bizning arizamiz odatda ma'lumotlar bazasiga yoki boshqa joyga boradi va ko'pincha javob kutadi.

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

U shunchaki o'tiradi va kutadi. Bu unchalik yaxshi emas. 100.000 XNUMX foydalanuvchi kelganda, bu biz uchun juda qiyin. Shunday qilib, misol sifatida oddiy dasturdan foydalanamiz. Biz, masalan, mushuklarning rasmlarini qidiramiz. Lekin biz shunchaki qidirmaymiz, biz kalit so'zlarni kengaytiramiz va agar foydalanuvchi "mushukchalar" ni qidirgan bo'lsa, biz mushuklar, tukli mushuklar va hokazolarni topamiz. Birinchidan, biz so'rov ma'lumotlarini backendda olishimiz kerak. Bu shunday ko'rinadi:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Ikki chiziq GET parametrlarini tanlashga imkon beradi, hech qanday asorat yo'q. Keyinchalik, aytaylik, kalit so'z va kengaytma belgisi bo'lgan ma'lumotlar bazasidan biz ushbu ma'lumotni oddiy SQL so'rovi yordamida olamiz. Hammasi oddiy. Bu shunday ko'rinadi:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Kutubxonani ulash resty.mysql, bizda allaqachon to'plamda mavjud. Hech narsa o'rnatishimiz shart emas, hamma narsa tayyor. SQL so'rovini qanday ulash va qilish kerakligini ko'rsatamiz:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Bu erda biroz qo'rqinchli, lekin hamma narsa ishlaydi. Bu erda 10 ta chegara. Biz 10 ta yozuvni chiqaramiz, biz dangasamiz, ko'proq ko'rsatishni xohlamaymiz. Men SQL-dagi chegarani unutganman.

Keyin barcha so'rovlar uchun rasmlarni topamiz. Biz bir nechta so'rovlarni yig'amiz va Lua jadvalini to'ldiramiz reqs, va biz qilamiz ngx.location.capture_multi.

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Ushbu so'rovlarning barchasi parallel ravishda yuboriladi va javoblar bizga qaytariladi. Ishlash vaqti eng sekinning javob vaqtiga teng. Agar biz hammamiz 50 millisekundda suratga tushsak va biz yuzta so'rov yuborsak, javobni 50 millisekundda olamiz.

Biz dangasa va HTTP yozishni va keshlash bilan ishlashni istamaganimiz uchun biz NGINXni biz uchun hamma narsani qilishga majburlaymiz. Ko'rib turganingizdek, so'rov bor edi url/fetch, u mana:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Biz buni oddiy qilamiz proxy_pass, biz qayerda keshlashni, buni qanday qilishni ko'rsatamiz va hamma narsa biz uchun ishlaydi.

Ammo bu etarli emas, biz hali ham ma'lumotlarni foydalanuvchiga berishimiz kerak. Eng oddiy g'oya JSON-dagi hamma narsani osongina, ikki qatorda ketma-ketlashtirishdir. Biz Content-Type-ni beramiz, JSON-ni beramiz.

Ammo bitta qiyinchilik bor: foydalanuvchi JSONni o'qishni xohlamaydi. Biz front-end ishlab chiquvchilarni jalb qilishimiz kerak. Ba'zan biz avvaliga buni qilishni xohlamaymiz. Va SEO mutaxassislari, agar biz rasmlarni qidirayotgan bo'lsak, ular uchun bu muhim emasligini aytishadi. Va agar biz ularga biron bir tarkibni bersak, ular bizning qidiruv tizimlarimiz hech narsani indekslamasligini aytishadi.

Bu haqda nima qilish kerak? Albatta, biz foydalanuvchiga HTML beramiz. Qo'lda yaratish comme il faut emas, shuning uchun biz shablonlardan foydalanmoqchimiz. Buning uchun kutubxona mavjud lua-resty-template.

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Siz uchta qo'rqinchli OPM harfini ko'rgan bo'lsangiz kerak. OpenResty o'zining paket menejeri bilan birga keladi, bu orqali siz turli xil modullarni o'rnatishingiz mumkin, xususan, lua-resty-template. Bu Django shablonlariga o'xshash oddiy shablon mexanizmi. U erda siz kod yozishingiz va o'zgaruvchan almashtirishni amalga oshirishingiz mumkin.

Natijada, hamma narsa shunday ko'rinadi:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Biz ma'lumotlarni oldik va shablonni yana ikki qatorda ko'rsatdik. Foydalanuvchi xursand, u mushuklarni oldi. Biz so'rovni kengaytirganimiz sababli, u mushukchalar uchun mo'ynali muhrni ham oldi. Siz hech qachon bilmaysiz, ehtimol u aynan shu narsani qidirayotgandir, lekin so'rovini to'g'ri shakllantira olmadi.

Hammasi zo'r, lekin biz ishlab chiqilmoqda va uni hali foydalanuvchilarga ko'rsatmoqchi emasmiz. Keling, avtorizatsiya qilaylik. Buning uchun keling, NGINX so‘rovni OpenResty shartlarida qanday hal qilishini ko‘rib chiqamiz:

  • Birinchi bosqich - foydalanish, foydalanuvchi hozirgina kelganida va biz unga sarlavhalar, IP-manzil va boshqa ma'lumotlar bo'yicha qaradik. Agar bizga yoqmasa, darhol kesib tashlashimiz mumkin. Bu avtorizatsiya uchun ishlatilishi mumkin yoki agar biz juda ko'p so'rovlar olsak, ularni ushbu bosqichda osongina kesib tashlashimiz mumkin.
  • qayta yozish. Biz ba'zi so'rov ma'lumotlarini qayta yozamiz.
  • kontent. Biz kontentni foydalanuvchiga yetkazib beramiz.
  • sarlavhalar filtri. Biz javob sarlavhalarini almashtiramiz. Agar foydalansak proxy_pass, biz foydalanuvchiga berishdan oldin ba'zi sarlavhalarni qayta yozishimiz mumkin.
  • tana filtri. Biz tanani o'zgartirishimiz mumkin.
  • log - jurnallar. Elasticsearch-da qo'shimcha qatlamsiz jurnallarni yozishingiz mumkin.

Bizning avtorizatsiyamiz quyidagicha ko'rinadi:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Biz buni unga qo'shamiz location, biz ilgari tasvirlab bergan va u erga quyidagi kodni qo'ying:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Bizda cookie tokeni bor yoki yo'qligini tekshiramiz. Agar yo'q bo'lsa, biz ruxsat so'raymiz. Foydalanuvchilar ayyor va ular cookie tokenini o'rnatish kerakligini taxmin qilishlari mumkin. Shuning uchun biz uni Redis-ga ham joylashtiramiz:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Redis bilan ishlash uchun kod juda oddiy va boshqa tillardan farq qilmaydi. Shu bilan birga, bu erda va u erda barcha kirish / chiqish bloklanmaydi. Agar siz sinxron kod yozsangiz, u asinxron ishlaydi. Deyarli gevent kabi, lekin yaxshi bajarilgan.

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Keling, avtorizatsiyani o'zi bajaraylik:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Biz so'rovning asosiy qismini o'qishimiz kerakligini aytamiz. Biz POST argumentlarini olamiz va login va parol to'g'ri ekanligini tekshiramiz. Agar ular noto'g'ri bo'lsa, biz sizni avtorizatsiyaga chaqiramiz. Va agar to'g'ri bo'lsa, Redis-ga tokenni yozing:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Cookie-ni o'rnatishni unutmang, bu ham ikki qatorda amalga oshiriladi:

OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Misol oddiy va spekulyativdir. Albatta, biz odamlarga mushuklarni ko'rsatadigan xizmatni yaratmaymiz. Lekin bizni kim biladi. Keling, ishlab chiqarishda nima qilish mumkinligini ko'rib chiqaylik.

  • Minimalistik backend. Ba'zan biz backendga ozgina ma'lumot chiqarishimiz kerak: qayerdadir sana kiritishimiz kerak, qayerdadir ro'yxatni ko'rsatishimiz, hozir saytda qancha foydalanuvchi borligini aytishimiz, hisoblagich yoki statistikani biriktirishimiz kerak. Juda kichik narsa. Ba'zi minimal qismlar juda oson bajarilishi mumkin. Bu uni tez, oson va ajoyib qiladi.
  • Ma'lumotlarni oldindan qayta ishlash. Ba'zan biz reklamani sahifamizga joylashtirmoqchimiz va biz bu reklamani API so'rovlari yordamida olamiz. Bu erda buni qilish juda oson. Biz allaqachon o'tirgan va qattiq ishlayotgan backendimizni yuklamaymiz. Siz uni olib, bu erda to'plashingiz mumkin. Biz ba'zi JS-larni birlashtira olamiz yoki aksincha, uni ajratib, foydalanuvchiga berishdan oldin biror narsani oldindan qayta ishlashimiz mumkin.
  • Mikroservis uchun fasad. Bu ham juda yaxshi holat, men uni amalga oshirdim. Bungacha men elektron hisobotlar bilan shug'ullanuvchi va mamlakatdagi yuridik shaxslarning qariyb yarmiga hisobot taqdim etuvchi Tenzor kompaniyasida ishlaganman. Biz xizmat yaratdik, u yerda bir xil mexanizm yordamida ko‘p ishlar amalga oshirildi: marshrutlash, avtorizatsiya va boshqalar.
    OpenResty mikroservislaringiz uchun elim sifatida ishlatilishi mumkin, bu hamma narsaga yagona kirish va bitta interfeysni ta'minlaydi. Mikroservislarni shunday yozish mumkinki, sizda Node.js bu yerda, PHP bu yerda, Python bu yerda, ba'zi Erlang narsasi bu yerda, biz hamma joyda bir xil kodni qayta yozishni xohlamasligimizni tushunamiz. Shuning uchun, OpenResty-ni old qismga ulash mumkin.

  • Statistikalar va tahlillar. Odatda NGINX kirishda bo'ladi va barcha so'rovlar u orqali o'tadi. Aynan shu joyda yig'ish juda qulay. Siz darhol biror narsani hisoblab, uni biror joyga yuklashingiz mumkin, masalan, Elasticsearch, Logstash yoki oddiygina uni jurnalga yozib, keyin biror joyga yuborishingiz mumkin.
  • Ko'p foydalanuvchili tizimlar. Misol uchun, onlayn o'yinlar qilish ham juda yaxshi. Bugun Keyptaunda Aleksandr Gladish OpenResty yordamida ko'p o'yinchi o'yinining prototipini qanday tezda yaratish haqida gapiradi.
  • Filtrni talab qilish (WAF). Hozirgi kunda barcha turdagi veb-ilovalar xavfsizlik devorini yaratish moda bo'lib, ularni taqdim etadigan ko'plab xizmatlar mavjud. OpenResty-dan foydalanib, siz o'zingizning talablaringiz bo'yicha so'rovlarni oddiy va oson filtrlaydigan veb-ilovaning xavfsizlik devorini yaratishingiz mumkin. Agar sizda Python bo'lsa, unda siz PHP sizga albatta kiritilmasligini tushunasiz, agar siz uni konsoldan biron joyga qo'ymasangiz. Sizda MySQL va Python borligini bilasiz. Ehtimol, ular ma'lumotlar bazasiga biron bir ma'lumotni kiritishga harakat qilishlari mumkin. Shunday qilib, siz g'alati so'rovlarni old tomondan tez va arzon tarzda filtrlashingiz mumkin.
  • Hamjamiyat. OpenResty NGINX-da qurilganligi sababli, u bonusga ega - bu NGINX hamjamiyati. Bu juda katta va birinchi navbatda sizda paydo bo'ladigan savollarning munosib qismi NGINX hamjamiyati tomonidan hal qilingan.

    Lua ishlab chiquvchilari. Kecha men HighLoad++ mashg'ulot kuniga kelgan bolalar bilan gaplashdim va Luada faqat Tarantool yozilganligini eshitdim. Bu to'g'ri emas, Luada ko'p narsa yozilgan. Misollar: OpenResty, Prosody XMPP serveri, Love2D o'yin mexanizmi, Warcraft va boshqa joylarda skriptlangan Lua. Lua ishlab chiquvchilari juda ko'p, ular katta va sezgir hamjamiyatga ega. Mening barcha Lua savollarim bir necha soat ichida hal qilindi. Pochta ro'yxatiga yozganingizda, tom ma'noda bir necha daqiqadan so'ng, nima va qanday qilib, nima ekanligini tasvirlaydigan ko'plab javoblar paydo bo'ladi. Juda zo'r. Afsuski, bunday mehribon, ma’naviyatli jamoa hamma joyda ham mavjud emas.
    OpenResty uchun GitHub mavjud, agar biror narsa buzilgan bo'lsa, muammoni ochishingiz mumkin. Google Groups-da umumiy masalalarni muhokama qilishingiz mumkin bo'lgan pochta ro'yxati mavjud, xitoy tilida pochta ro'yxati bor - siz hech qachon bilmaysiz, ehtimol siz ingliz tilini bilmaysiz, lekin siz xitoy tilini bilasiz.

natijalar

  • Umid qilamanki, men OpenResty veb uchun moslashtirilgan juda qulay ramka ekanligini etkaza oldim.
  • Kirish uchun past to'siq bor, chunki kod biz yozgan narsaga o'xshaydi, til juda sodda va minimalist.
  • U qayta qo'ng'iroqlarsiz asinxron kiritish-chiqarishni ta'minlaydi, bizda ba'zan NodeJS da yozishimiz mumkin bo'lgan noodlelar bo'lmaydi.
  • Uni joylashtirish oson, chunki bizga faqat kerakli modul va kodimiz bilan NGINX kerak va hamma narsa darhol ishlaydi.
  • Katta va sezgir hamjamiyat.

Men marshrutlash qanday amalga oshirilishini batafsil aytib bermadim, bu juda uzoq hikoya bo'lib chiqdi.

E'tiboringiz uchun tashakkur!


Vladimir Protasov - OpenResty: NGINX-ni to'liq huquqli dastur serveriga aylantirish

Manba: www.habr.com

a Izoh qo'shish