OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirməkKonfransdan məruzənin stenoqramını yenidən dərc edirik Yüksək Yük ++ Ötən il noyabrın 2016-7-də Moskva yaxınlığındakı Skolkovoda keçirilən 8-cı il. Vladimir Protasov OpenResty və Lua ilə NGINX funksionallığını necə genişləndirməyi izah edir.

Hər kəsə salam, mənim adım Vladimir Protasov, mən Parallels üçün işləyirəm. Sizə bir az özüm haqqında danışacağam. Həyatımın dörddə üçünü kod yazmağa sərf edirəm. Mən hərfi mənada kökündən proqramçı oldum: yuxularımda hərdən kod görürəm. Həyatın dörddə biri sənaye inkişafı, birbaşa istehsala gedən kod yazmaqdır. Bəzilərinizin istifadə etdiyi, lakin bilmədiyiniz kodu yazın.

Nə qədər pis olduğunu sizə bildirmək üçün. Mən bir az kiçik olanda içəri girdim və mənə bu iki terabaytlıq verilənlər bazasını verdilər. O, indi hər kəs üçün buradadır. Konfranslara getdim və soruşdum: “Uşaqlar, mənə deyin, sizdə böyük data var, hər şey yaxşıdır? Orada neçə bazanız var? Mənə cavab verdilər: "Bizim 100 gigabaytımız var!" Mən dedim: "Əla, 100 gigabayt!" Və öz-özümə fikirləşdim ki, poker üzünü necə səliqəli şəkildə xilas edim. Düşünürsən ki, bəli, uşaqlar sərindirlər, sonra qayıdıb bu çox terabaytlıq verilənlər bazası ilə məşğul olursunuz. Və bu gənclikdir. Təsəvvür edə bilərsinizmi, bunun nə qədər hit olduğunu?

20-dən çox proqramlaşdırma dilini bilirəm. İş zamanı bunu anlamalı oldum. Erlanqda, C-də, C++-da, Lua-da, Python-da, Ruby-də, başqa bir şeydə kod verirlər və hamısını kəsməlisən. Ümumiyyətlə, məcbur oldum. Dəqiq rəqəmi hesablamaq mümkün olmayıb, amma hardasa 20-yə yaxın rəqəm itib.

Buradakı hər kəs Paralellərin nə olduğunu və nə etdiyimizi bildiyi üçün nə qədər havalı olduğumuzdan və nə etdiyimizdən danışmayacağam. Mən sizə yalnız onu deyim ki, bizim dünyada 13 ofisimiz, 300-dən çox işçimiz var, Moskvada, Tallinndə və Maltada inkişaf. İstəsəniz, qışda soyuq olarsa və kürəyinizi isitmək lazımdırsa, Maltaya gedib köçə bilərsiniz.

Konkret desək, bizim departamentimiz Python 2-də yazır. Biz biznesdəyik və dəbli texnologiyalar tətbiq etməyə vaxtımız yoxdur, ona görə əziyyət çəkirik. Bizdə Django var, çünki onda hər şey var və artıqlığı götürüb atdıq. Həmçinin MySQL, Redis və NGINX. Bir çox başqa gözəl şeylərimiz də var. Bizdə MongoDB var, dovşanlarımız var, sadəcə heç nəyimiz yoxdur - amma bu mənim deyil və mən bunu etmirəm.

OpenResty

Özüm haqqında danışdım. Bu gün nə haqqında danışacağımı görək:

  • OpenResty nədir və nə ilə yeyilir?
  • Python, NodeJS, PHP, Go və hər kəsin razı qaldığı digər ləzzətli şeylərimiz olduqda niyə təkəri yenidən kəşf edək?
  • Və bir neçə real həyat nümunəsi. Hesabatı çox ixtisar etməli oldum, çünki onu 3,5 saata almışam, ona görə də misallar az olacaq.

OpenResty NGINX-dir. Onun sayəsində bizim tam hüquqlu veb serverimiz var, o, yaxşı yazılmışdır, sürətli işləyir. Düşünürəm ki, çoxumuz istehsalda NGINX-dən istifadə edirik. Onun sürətli və sərin olduğunu hamınız bilirsiniz. Onlar orada sərin sinxron giriş/çıxış yaratdılar, ona görə də gevent-in Python-da dövrə vurduğu kimi heç bir şeyi dövrə vurmağa ehtiyacımız yoxdur. Gevent gözəldir, əladır, lakin C kodunu yazsanız və gevent ilə nəsə səhv olarsa, onu sazlamaqla dəli olacaqsınız. Mənim təcrübəm var idi: orada nəyin səhv olduğunu anlamaq üçün tam iki gün lazım idi. Əgər kimsə bundan əvvəl bir neçə həftə qazmasaydı, problemi tapsaydı, internetdə yazsaydı və Google bunu tapmasaydı, biz tamamilə dəli olardıq.

NGINX artıq keşləmə və statik məzmunu həyata keçirir. Bunu insancasına necə edəcəyiniz barədə narahat olmaq lazım deyil ki, bir yerdə yavaşlamayasınız, haradasa təsvirçiləri itirməyəsiniz. Nginx yerləşdirmək üçün çox rahatdır, nə götürəcəyinizi düşünməyə ehtiyac yoxdur - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx quraşdırılıb, adminlərə verilir, onunla necə işləməyi bilirlər. Nginx sorğuları strukturlaşdırılmış şəkildə emal edir. Bu barədə bir az sonra danışacağam. Bir sözlə, onun yeni sorğu qəbul etdiyi, emal etdiyi və məzmunu istifadəçiyə verdiyi bir mərhələ var.

Nginx sərindir, lakin bir problem var: fərdiləşdirilə bilməsinə baxmayaraq, uşaqların konfiqurasiyaya daxil etdiyi bütün bu gözəl xüsusiyyətlərə baxmayaraq, kifayət qədər çevik deyil. Bu güc kifayət deyil. Buna görə də, bir vaxtlar Taobaodan olan uşaqlar, təxminən səkkiz il əvvəl düşünürəm ki, Lua'yı onun içində qurdular. O nə verir?

  • boy. Kiçikdir. LuaJIT təxminən 100-200 kilobayt yaddaş yükü və minimal performans yükü verir.
  • Sürət. LuaJIT tərcüməçisi bir çox hallarda C-yə yaxındır, bəzi hallarda Java-ya uduzur, bəzilərində onu qabaqlayır. Bir müddət o, ən müasir, ən yaxşı JIT kompilyatoru hesab olunurdu. İndi daha soyuq olanlar var, lakin onlar çox ağırdır, məsələn, eyni V8. Bəzi JS tərcüməçiləri və Java HotSpot bəzi məqamlarda daha sürətli olsalar da, bəzi məqamlarda yenə də itirirlər.
  • Öyrənmək asandır. Əgər, məsələn, Perl kod bazanız varsa və siz Rezervasiya etmirsinizsə, Perl proqramçılarını tapa bilməyəcəksiniz. Onlar orada olmadığı üçün hamısını aparıblar və onlara öyrətmək uzun və çətindir. Əgər başqa bir şey üçün proqramçılar istəyirsinizsə, onlar da yenidən hazırlanmalı və ya tapılmalı ola bilər. Lua vəziyyətində hər şey sadədir. Lua hər hansı bir gənc tərəfindən üç gün ərzində öyrənilə bilər. Bunu anlamaq üçün mənə təxminən iki saat lazım oldu. İki saat sonra mən artıq istehsalda kod yazırdım. Təxminən bir həftə sonra o, birbaşa istehsalata getdi və getdi.

Nəticədə belə görünür:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Burada çox şey var. OpenResty həm luash, həm də mühərriklər olan bir dəstə modul yığdı. Və hər şey hazırdır - yerləşdirilir və işləyir.

Nümunələr

Mahnı sözləri kifayətdir, keçək kodlara. Budur kiçik bir Salam Dünya:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Orada nə var? bu motorların yeridir. Biz narahat deyilik, öz marşrutumuzu yazmırıq, hazır olanı götürmürük - bizdə artıq NGINX-də var, yaxşı və tənbəl yaşayırıq.

content_by_lua_block Lua skripti ilə məzmun təqdim etdiyimizi söyləyən bir blokdur. Bir mühərrik dəyişəni alırıq remote_addr və içinə sürüşdürün string.format. Bu eynidir sprintf, yalnız Lua, yalnız doğru. Və biz onu müştəriyə veririk.

Nəticədə belə görünəcək:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Ancaq real dünyaya qayıt. İstehsalda heç kim Hello World tətbiq etmir. Tətbiqimiz adətən verilənlər bazasına və ya başqa yerə gedir və çox vaxt cavab gözləyir.

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Sadəcə oturub gözləyir. Çox yaxşı deyil. 100.000 istifadəçi gələndə bizim üçün çox çətindir. Buna görə də nümunə kimi sadə bir tətbiqdən istifadə edək. Şəkilləri, məsələn, pişikləri axtaracağıq. Yalnız biz yalnız axtarış etməyəcəyik, açar sözləri genişləndirəcəyik və əgər istifadəçi "kediciklər" üçün axtarış etdisə, biz pişiklər, tüklər və s. Əvvəlcə sorğu məlumatlarını backenddə əldə etməliyik. Bu belə görünür:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

İki xətt GET parametrlərini götürməyə imkan verir, heç bir fəsad yoxdur. Sonra biz, məsələn, bu məlumatı adi SQL sorğusundan istifadə edərək açar söz və genişlənmə ilə cədvəli olan verilənlər bazasından alırıq. Hər şey sadədir. Bu belə görünür:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Kitabxananı bağlayırıq resty.mysql, ki, biz artıq dəstdə var. Heç bir şey quraşdırmaq lazım deyil, hər şey hazırdır. SQL sorğusunun necə bağlanacağını və ediləcəyini göstərin:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Bir az qorxuludur, amma işləyir. Burada hədd 10-dur. 10 rekord çıxarırıq, tənbəl oluruq, daha çox göstərmək istəmirik. SQL-də limiti unutmuşam.

Sonra bütün sorğular üçün şəkillər tapırıq. Biz bir dəstə sorğu toplayırıq və adlı Lua cədvəlini doldururuq reqs, və edin ngx.location.capture_multi.

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Bütün bu müraciətlər paralel gedir və cavablar bizə qaytarılır. İş vaxtı ən yavaş olanın cavab müddətinə bərabərdir. Hamımız 50 millisaniyədə geri çəkilsək və yüz sorğu göndərsək, 50 millisaniyə ərzində cavab alacağıq.

Biz tənbəl olduğumuza və HTTP ilə işləmə və keşləmə yazmaq istəmədiyimiz üçün NGINX-i bizim üçün hər şeyi etməyə məcbur edəcəyik. Gördüyünüz kimi bir müraciət var idi url/fetch, o, budur:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Sadə edirik proxy_pass, harada önbelleğe alınacağını, necə ediləcəyini və hər şey bizim üçün işləyir.

Ancaq bu kifayət deyil, biz hələ də məlumatları istifadəçiyə verməliyik. Ən sadə fikir, hər şeyi asanlıqla, iki sətirdə JSON-da seriallaşdırmaqdır. Content-Type veririk, JSON veririk.

Ancaq bir çətinlik var: istifadəçi JSON-u oxumaq istəmir. Biz qabaqcıl inkişaf etdiriciləri cəlb etməliyik. Bəzən ilk başda bunu etmək istəmirik. Bəli və SEO mütəxəssisləri deyəcəklər ki, əgər biz şəkillər axtarırıqsa, deməli onlara əhəmiyyət vermir. Onlara bəzi məzmunlar versək, deyəcəklər ki, axtarış sistemlərimiz heç nəyi indeksləmir.

Bununla nə etməli? Təbii ki, istifadəçiyə HTML verəcəyik. Tutacaqlarla yaratmaq qeyri-mümkündür, ona görə də şablonlardan istifadə etmək istəyirik. Bunun üçün kitabxana var lua-resty-template.

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Siz üç qorxulu OPM hərfini görmüsünüz. OpenResty öz paket meneceri ilə gəlir, onun vasitəsilə bir çox müxtəlif modulları quraşdıra bilərsiniz, xüsusən, lua-resty-template. Bu, Django şablonlarına bənzər sadə şablon mühərrikidir. Orada kod yaza və dəyişən əvəz edə bilərsiniz.

Nəticədə hər şey belə görünəcək:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Məlumatları götürdük və şablonu yenidən iki sətirdə göstərdik. İstifadəçi xoşbəxtdir, pişikləri var. Sorğunu genişləndirdiyimiz üçün o, pişik pişikləri üçün kürk möhürü də aldı. Heç bilmirsən, bəlkə də axtarırdı, amma istəyini düzgün formalaşdıra bilmədi.

Hər şey əladır, lakin biz inkişaf mərhələsindəyik və hələ istifadəçilərə göstərmək istəmirik. Gəlin icazə verək. Bunun üçün gəlin NGINX-in OpenResty baxımından sorğunu necə idarə etdiyinə baxaq:

  • Birinci mərhələ - keçid, istifadəçi yeni gələndə və biz ona başlıqlar, IP ünvanı, digər məlumatlarla baxdıq. Bəyənmədiyimiz halda dərhal kəsə bilərsiniz. Bu avtorizasiya üçün istifadə edilə bilər və ya çoxlu sorğular alsaq, bu mərhələdə onları asanlıqla kəsə bilərik.
  • yenidən yazmaq. Bəzi sorğu məlumatlarının yenidən yazılması.
  • məzmun. Biz istifadəçiyə məzmun veririk.
  • başlıq filtri. Cavab başlıqlarını dəyişdirin. İstifadə etsəydik proxy_pass, biz istifadəçiyə verməzdən əvvəl bəzi başlıqları yenidən yaza bilərik.
  • bədən filtri. Bədəni dəyişə bilərik.
  • daxil ol - giriş. Elasticsearch-da əlavə qat olmadan logları yazmaq mümkündür.

Səlahiyyətimiz belə görünəcək:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Buna əlavə edəcəyik location, əvvəl təsvir etdiyimiz və aşağıdakı kodu oraya qoyun:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Kuki nişanımız olub-olmadığını yoxlayaq. Yoxdursa, biz icazə veririk. İstifadəçilər hiyləgərdirlər və güman edə bilərlər ki, kuki işarəsi qoyulmalıdır. Buna görə də onu Redis-ə qoyacağıq:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Redis ilə işləmək üçün kod çox sadədir və digər dillərdən heç bir fərqi yoxdur. Eyni zamanda, bütün giriş / çıxış, orada nə var, burada nə var, bu blok deyil. Sinxron kod yazsanız, asinxron işləyir. Gevent ilə olduğu kimi, yalnız yaxşı iş görüldü.

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Avtorizasiyanı özü edək:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Deyirik ki, sorğu orqanını oxumaq lazımdır. POST arqumentlərini alırıq, giriş və şifrənin düzgün olduğunu yoxlayın. Səhv olarsa, avtorizasiyaya müraciət edirik. Əgər onlar düzgündürsə, o zaman Redis-ə işarə yazırıq:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Kuki qurmağı unutmayın, bu da iki sətirdə edilir:

OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Nümunə sadədir, spekulyativdir. Təbii ki, insanlara pişik göstərən bir xidmət etməyəcəyik. Amma bizi kim tanıyır. Beləliklə, istehsalda nə edilə biləcəyini nəzərdən keçirək.

  • Minimalist arxa plan. Bəzən backend-ə kifayət qədər məlumat verməliyik: haradasa tarixi əvəz etməliyik, haradasa bir növ siyahı göstərməliyik, indi saytda neçə istifadəçinin olduğunu söyləməliyik, sayğac və ya statistikaya toxunmalıyıq. Çox kiçik bir şey. Bəzi minimal parçalar çox asanlıqla edilə bilər. Bu, sürətli, asan və əla olacaq.
  • Məlumatların əvvəlcədən işlənməsi. Bəzən səhifəmizə reklam yerləşdirmək istəyirik və bu reklamları API sorğuları ilə götürürük. Bunu burada etmək çox asandır. Artıq çox işləyən backendimizi yükləmirik. Buradan götürüb yığa bilərsiniz. Biz bəzi JS-ni formalaşdıra və ya əksinə, istifadəçiyə verməzdən əvvəl nəyisə əvvəlcədən emal edə bilərik.
  • Mikroservis üçün fasad. Bu da çox yaxşı haldır, həyata keçirmişəm. Bundan əvvəl mən ölkədəki hüquqi şəxslərin təxminən yarısı üçün hesabat verən elektron hesabat şirkəti olan Tenzorda işləmişəm. Biz bir xidmət yaratdıq, orada eyni mexanizmdən istifadə etməklə çox şey edilir: marşrutlaşdırma, avtorizasiya və s.
    OpenResty, hər şeyə tək giriş və tək interfeys təmin etmək üçün mikroservisləriniz üçün yapışqan kimi istifadə edilə bilər. Mikroservislər elə yazıla bilər ki, burada Node.js var, burada PHP var, burada Python var, burada bəzi Erlang məsələsi var, başa düşürük ki, biz eyni kodu hər yerdə yenidən yazmaq istəmirik. Buna görə də, OpenResty ön hissəyə qoşula bilər.

  • Statistika və analitika. Adətən NGINX girişdə olur və bütün sorğular ondan keçir. Məhz bu yerdə toplamaq çox rahatdır. Dərhal nəyisə hesablayıb harasa ata bilərsiniz, məsələn, eyni Elasticsearch, Logstash və ya sadəcə onu jurnala yazıb sonra harasa göndərə bilərsiniz.
  • Çox istifadəçi sistemləri. Məsələn, onlayn oyunlar da etmək çox yaxşıdır. Bu gün Keyptaunda Alexander Gladysh sizə OpenResty istifadə edərək çox oyunçulu oyunun prototipini necə tez hazırlayacağınızı izah edəcək.
  • Filtrləmə sorğusu (WAF). İndi hər cür veb proqram firewallları etmək dəbdədir, onları təmin edən bir çox xidmət var. OpenResty-nin köməyi ilə siz özünüzə tələblərinizə uyğun olaraq sorğuları sadə və asanlıqla süzgəcdən keçirəcək veb tətbiqi təhlükəsizlik divarı edə bilərsiniz. Əgər sizdə Python varsa, o zaman başa düşürsünüz ki, PHP sizə mütləq yeridilməyəcək, əlbəttə ki, onu konsoldan hər hansı bir yerə yaymasanız. Bilirsiniz ki, sizdə MySQL və Python var. Yəqin ki, burada bir növ kataloq keçidi etməyə və verilənlər bazasına nəsə yeritməyə cəhd edə bilərlər. Buna görə də, lal istəkləri tez və ucuz bir şəkildə süzgəcdən keçirə bilərsiniz.
  • İcma OpenResty NGINX-ə əsaslandığı üçün onun bir bonusu var - bu NGINX icması. Bu, çox böyükdür və ilk vaxtlar sizi maraqlandıran bir çox suallara NGINX icması artıq cavab verib.

    Lua tərtibatçıları. Dünən HighLoad ++ məşq gününə gələn uşaqlarla danışdım və Lua dilində yalnız Tarantool yazıldığını eşitdim. Bu belə deyil, Luada çox şey yazılıb. Nümunələr: OpenResty, Prosody XMPP server, Love2D oyun mühərriki, Lua Warcraft və başqa yerlərdə skript edilmişdir. Çoxlu Lua tərtibatçıları var, onların böyük və həssas bir cəmiyyəti var. Bütün Lua suallarıma bir neçə saat ərzində cavab verildi. Poçt siyahısına yazdığınız zaman, sözün əsl mənasında bir neçə dəqiqədən sonra artıq bir dəstə cavab var, onlar nə və necə, nəyin nə olduğunu təsvir edirlər. Əladır. Təəssüf ki, belə mehriban səmimi camaat hər yerdə deyil.
    OpenResty-də GitHub var, burada bir şey pozulduğu təqdirdə problemi aça bilərsiniz. Google Qruplarında ümumi məsələləri müzakirə edə biləcəyiniz bir poçt siyahısı var, Çin dilində bir poçt siyahısı var - heç vaxt bilmirsiniz, bəlkə də ingilis dilini bilmirsiniz, lakin Çin dilini bilirsiniz.

Nəticələri

  • Ümid edirəm ki, OpenResty-nin çox rahat veb çərçivə olduğunu çatdıra bildim.
  • Onun aşağı giriş həddi var, çünki kod yazdıqlarımıza bənzəyir, dil olduqca sadə və minimalistdir.
  • O, geri çağırışlar olmadan asinxron I/O təmin edir, bizdə əriştə olmayacaq, çünki bəzən NodeJS-də yaza bilərik.
  • Onun asan yerləşdirilməsi var, çünki bizə yalnız düzgün modul və kodumuz olan NGINX lazımdır və hər şey dərhal işləyir.
  • Böyük və həssas icma.

Marşrutlaşdırmanın necə edildiyini ətraflı demədim, çox uzun hekayə olduğu ortaya çıxdı.

Diqqətiniz üçün təşəkkür edirik!


Vladimir Protasov - OpenResty: NGINX-i tam hüquqlu proqram serverinə çevirmək

Mənbə: www.habr.com

Добавить комментарий