OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

OpenResty: NGINXти толук кандуу колдонмо серверине айландырууКонференциянын докладынын стенограммасын кайрадан жарыялайбыз HighLoad++ 2016-жылы өткөн жылдын 7-8-ноябрында Москванын жанындагы Сколководо өткөн. Владимир Протасов OpenResty жана Lua менен NGINX функциясын кантип кеңейтүү керектигин айтат.

Баарына салам, менин атым Владимир Протасов, мен Parallels компаниясында иштейм. Мен өзүм жөнүндө бир аз айтып берейин. Мен өмүрүмдүн төрттөн үч бөлүгүн код жазууга жумшайм. Мен түз маанисинде программист болдум: кээде түшүмдө кодду көрөм. Өмүрдүн төрттөн бир бөлүгү өнөр жайлык өнүгүү, түз өндүрүшкө кирген код жазуу. Кээ бириңиздер колдонгон, бирок билбеген код.

Канчалык жаман болгонун билсин деп. Кичинекей кезимде кирдим, алар мага ушул эки терабайт маалымат базасын беришти. Ал азыр бул жерде бардык жогорку жүктөмдөр үчүн. Мен конференцияларга барып: «Балдар, айткылачы, силерде чоң маалыматтар барбы, баары сонунбу? Сизде канча база бар? Алар мага: "Бизде 100 гигабайт бар!" Мен: "Сонун, 100 гигабайт!" Анан кантип покер жүзүн тыкан сактап калам деп ойлодум. Сиз ойлойсуз, ооба, балдар сонун, анан кайра келип, бул көп терабайттык маалымат базалары менен алектенесиз. Ал эми бул кенже болуу. Бул кандай хит экенин элестете аласызбы?

Мен 20дан ашык программалоо тилдерин билем. Бул иштин жүрүшүндө түшүнүшүм керек болчу. Алар сага Эрлангда, Сиде, С++ тилинде, Луада, Pythonдо, Rubyде, башка бир нерседе код беришет жана мунун баарын кесип салыш керек. Жалпысынан, мен керек болчу. Так санын эсептөөгө мүмкүн болгон жок, бирок кайсы бир жерде 20га жакын сан жоголду.

Бул жердегилердин баары Параллелдер деген эмне экенин жана биз эмне кылганыбызды билишкендиктен, мен биз кандай сонун экенибизди жана эмне кылганыбызды айтпай эле коёюн. Мен сизге гана айта кетейин, биздин дүйнө жүзү боюнча 13 кеңсебиз бар, 300дөн ашык кызматкер, Москвада, Таллинде жана Мальтада өнүгүү. Кааласаңыз, кышында суук болуп, белиңизди жылытышыңыз керек болсо, Мальтага барып көчүп кетсеңиз болот.

Тактап айтканда, биздин бөлүм Python 2де жазат. Биз бизнестебиз жана модалуу технологияларды киргизүүгө убактыбыз жок, ошондуктан кыйналып жатабыз. Бизде Джанго бар, анткени анда баары бар, ашыкчасын алып ыргытып жибердик. Ошондой эле MySQL, Redis жана NGINX. Бизде дагы башка көптөгөн сонун нерселер бар. Бизде MongoDB бар, бизде коёндор чуркап жүрөт, бизде эч нерсе жок - бирок бул меники эмес, мен аны кылбайм.

OpenResty

Мен өзүм жөнүндө айттым. Келгиле, бүгүн эмне жөнүндө сүйлөшөөрүмдү карап көрөлү:

  • OpenResty деген эмне жана аны эмне менен жейт?
  • Эмне үчүн бизде Python, NodeJS, PHP, Go жана бардыгы ыраазы болгон башка сонун нерселер болгондо дөңгөлөктү кайра ойлоп табуу керек?
  • Жана бир нече реалдуу турмуштук мисалдар. Мен отчетту бир топ кыскартууга туура келди, анткени мен аны 3,5 саатка алдым, ошондуктан мисалдар аз болот.

OpenResty бул NGINX. Анын аркасында бизде толук кандуу веб-сервер бар, ал жакшы жазылган, тез иштейт. Менимче, көпчүлүгүбүз өндүрүштө NGINX колдонобуз. Анын тез жана салкын экенин баарыңар билесиңер. Алар андагы салкын синхрондук киргизүү/чыгарууну жасашты, андыктан биз Pythonдо гевент айланткандай эч нерсени айлантуунун кереги жок. Gevent сонун, сонун, бирок C-кодун жазсаңыз жана gevent менен бир нерсе туура эмес болуп калса, аны оңдоодо жинди болуп каласыз. Менде тажрыйба бар болчу: ал жерде эмне туура эмес болгонун түшүнүү үчүн эки күн талап кылынды. Эгер кимдир бирөө бир нече жума мурун казып, көйгөйдү таап, Интернетке жазып, Google аны таппай калса, анда биз таптакыр жинди болуп калмакпыз.

NGINX буга чейин кэштөө жана статикалык мазмунду жасайт. Кандайдыр бир жерде басаңдабаш үчүн, бир жерде дескрипторлорду жоготуп албаш үчүн, муну адамдык түрдө кантип жасоо керек деп тынчсыздануунун кереги жок. Nginx жайгаштыруу үчүн абдан ыңгайлуу, эмнени алуу жөнүндө ойлонуунун кажети жок - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx орнотулду, админдерге берилди, алар аны менен кантип иштөөнү билишет. Nginx сурамдарды структураланган жол менен иштетет. Мен бул тууралуу бир аз кийинчерээк сүйлөшөм. Кыскасы, ал өтүнүчтү жаңы эле кабыл алган, иштеп чыккан жана колдонуучуга мазмун берген фазасы бар.

Nginx сонун, бирок бир көйгөй бар: ал ыңгайлаштырылышы мүмкүн экендигине карабастан, балдар конфигурацияга киргизген бардык сонун өзгөчөлүктөр менен жетиштүү ийкемдүү эмес. Бул күч жетпейт. Ошондуктан, бир жолу Таобао жигиттери, мен ойлойм, мындан сегиз жыл мурун, Луаны ага курушкан. Ал эмне берет?

  • көлөм. Бул кичинекей. LuaJIT болжол менен 100-200 килобайт эстутумду жана минималдуу аткарууну берет.
  • ылдамдык. LuaJIT котормочу көп кырдаалдарда Сге жакын, кээ бир учурларда Javaга утулуп калат, кээ биринде аны басып өтүп кетет. Бир аз убакытка чейин ал эң сонун JIT компилятору болуп эсептелген. Азыр муздактары бар, бирок алар абдан оор, мисалы, ошол эле V8. Кээ бир JS котормочулары жана Java HotSpot кээ бир учурларда ылдамыраак, бирок кээ бир учурларда утулуп калышат.
  • Үйрөнүү оңой. Эгер сизде, айталы, Perl код базасы болсо жана сиз Booking жок болсоңуз, анда Perl программисттерин таба албайсыз. Алар жок болгондуктан, баарын алып кетишкен, аларды үйрөтүү узак жана кыйын. Эгерде сиз башка нерсеге программисттерди кааласаңыз, аларды кайра даярдоого же табууга туура келет. Луа учурда, баары жөнөкөй. Луаны каалаган кенже үч күндүн ичинде үйрөнө алат. Аны түшүнүүгө эки сааттай убакыт кетти. Эки сааттан кийин мен өндүрүштө код жазып жаткам. Бир жумадай убакыт өткөндөн кийин түз эле өндүрүшкө кирип кетип калды.

Натыйжада, мындай көрүнөт:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Бул жерде көп. OpenResty бир топ модулдарды, luash жана моторлорду чогулткан. Жана сизде баары даяр - жайгаштырылган жана иштеп жатат.

мисалдар

Ырдын сөздөрү жетиштүү, кодго өтөбүз. Бул жерде бир аз Hello World:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Эмне бар? бул мотордун жайгашкан жери. Биз кабатырланбайбыз, өз маршрутубузду жазбайбыз, даяр маршрутту албайбыз - бизде NGINXте бар, биз жакшы жана жалкоо жашайбыз.

content_by_lua_block Луа скриптин колдонуп мазмунду тейлеп жатканыбызды айткан блок. Биз кыймылдаткычтын өзгөрмөсүн алабыз remote_addr жана аны сүзүп коюңуз string.format. Бул ошол эле sprintf, Луада гана, туура. А биз кардарга беребиз.

Натыйжада, ал төмөнкүдөй болот:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Бирок чыныгы дүйнөгө кайтуу. Өндүрүштө Hello World программасын эч ким колдонбойт. Биздин тиркеме адатта маалымат базасына же башка жерге барат жана көпчүлүк учурда жооп күтөт.

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Жөн эле отуруп, күтөт. Бул абдан жакшы эмес. 100.000 XNUMX колдонуучу келгенде биз үчүн абдан кыйын. Ошондуктан, мисал катары жөнөкөй тиркемени колдонолу. Биз сүрөттөрдү издейбиз, мисалы, мышыктар. Болгону биз жөн гана издебейбиз, ачкыч сөздөрдү кеңейтебиз жана эгер колдонуучу "котята" деп издеген болсо, мышыктарды, үлпүлүштүктөрдү ж.б. Биринчиден, биз backend боюнча суроо-талап маалыматтарын алышыбыз керек. Бул төмөнкүдөй көрүнөт:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Эки сызык GET параметрлерин тандоого мүмкүндүк берет, эч кандай кыйынчылыктар жок. Анда биз, мисалы, бул маалыматты кадимки SQL сурамынын жардамы менен ачкыч сөз жана кеңейтүү боюнча таблицасы бар маалымат базасынан алабыз. Баары оңой. Бул төмөнкүдөй көрүнөт:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Биз китепкананы бириктиребиз resty.mysql, бизде комплектте бар. Бизге эч нерсе орнотуунун кереги жок, баары даяр. Кантип туташуу жана SQL суроосун жасоону көрсөтүңүз:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Бул бир аз коркунучтуу, бирок ал иштейт. Бул жерде 10 чек болуп саналат. 10 пластинка сууруп чыгабыз, жалкообуз, дагы көрсөткүбүз келбейт. SQLде мен чек жөнүндө унутуп калдым.

Андан кийин биз бардык суроолор үчүн сүрөттөрдү табабыз. Биз бир топ суроо-талаптарды чогултуп, Луа таблицасын толтурабыз reqs, жана жаса ngx.location.capture_multi.

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Бул өтүнүчтөрдүн баары параллелдүү жүрүп, жооптор бизге кайтарылып берилет. Иштөө убактысы эң жайдын жооп берүү убактысына барабар. Эгерде баарыбыз 50 миллисекундда кайра атып, жүз сурам жөнөтсөк, анда 50 миллисекундда жооп алабыз.

Биз жалкоо болгондуктан жана HTTP иштетүү жана кэш жазууну каалабагандыктан, NGINX биз үчүн бардыгын жасайт. Өзүңөр көргөндөй, өтүнүч бар эле url/fetch, Мына ал:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Жөнөкөй кылабыз proxy_pass, кайда кэш керек экенин, аны кантип жасоону жана бардыгы биз үчүн иштейт.

Бирок бул аздык кылат, биз дагы эле колдонуучуга маалыматтарды беришибиз керек. Эң жөнөкөй идея - бардыгын эки сапта оңой JSONге сериялаштыруу. Биз Content-Type беребиз, биз JSON беребиз.

Бирок бир кыйынчылык бар: колдонуучу JSON окугусу келбейт. Биз алдыңкы иштеп чыгуучуларды тартуубуз керек. Кээде алгач муну кылгыбыз келбей калат. Ооба, жана SEO адистери биз сүрөттөрдү издеп жаткан болсок, анда алар баары бир деп айтышат. Эгер биз аларга кандайдыр бир мазмунду берсек, алар биздин издөө системалары эч нерсени индекстебейт деп айтышат.

аны менен эмне кылуу керек? Албетте, биз колдонуучуга HTML беребиз. Туткучтар менен генерациялоо оңой эмес, андыктан биз шаблондорду колдонгубуз келет. Бул үчүн китепкана бар lua-resty-template.

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Сиз үч коркунучтуу OPM тамгасын көргөн болушуңуз керек. OpenResty өзүнүн пакет менеджери менен келет, анын жардамы менен сиз ар кандай модулдардын бир тобун орното аласыз, атап айтканда, lua-resty-template. Бул Django үлгүлөрүнө окшош жөнөкөй шаблон кыймылдаткычы. Ал жерде сиз код жазып, өзгөрмө алмаштырууну жасай аласыз.

Натыйжада, баары төмөнкүдөй болот:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Биз маалыматтарды алып, шаблонду кайра эки сапта рендердик. Колдонуучу бактылуу, мышыктары бар. Биз өтүнүчтү кеңейткендиктен, ал мышыктар үчүн мөөрдү да алды. Сиз эч качан билесиз, балким ал издеп жаткандыр, бирок өтүнүчүн туура түзө алган эмес.

Баары сонун, бирок биз иштеп чыгуудабыз жана азырынча колдонуучуларга көрсөткүбүз келбейт. Келгиле авторизация кылалы. Бул үчүн, келгиле, NGINX өтүнүчтү OpenResty жагынан кантип чечерин карап көрөлү:

  • Биринчи фаза - мүмкүндүк алуу, колдонуучу жаңы келгенде, биз ага баштар, IP даректер, башка маалыматтар боюнча карадык. Бизге жакпаса дароо кесип алсаңыз болот. Муну авторизациялоо үчүн колдонсо болот же биз көп сурамдарды алсак, аларды ушул этапта оңой эле кесип алабыз.
  • кайра жазуу. Кээ бир сурам дайындары кайра жазылууда.
  • ыраазы. Биз колдонуучуга мазмунду беребиз.
  • баш чыпкасы. Жооптун аталыштарын өзгөртүңүз. колдонсок proxy_pass, колдонуучуга берүүдөн мурун кээ бир аталыштарды кайра жаза алабыз.
  • дене чыпкасы. Биз денени өзгөртө алабыз.
  • журналы - токойду кесүү. Elasticsearchте журналдарды кошумча катмарсыз жазууга болот.

Биздин уруксатыбыз төмөнкүдөй болот:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Биз ага кошобуз location, биз мурда сүрөттөгөн жана ал жерге төмөнкү кодду коюңуз:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Бизде куки белгиси бар-жогун карап көрөлү. Болбосо, анда биз уруксатты ыргытабыз. Колдонуучулар куу жана куки энбелгисин коюу керек деп ойлошу мүмкүн. Ошондуктан, биз аны Редиске да коёбуз:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Redis менен иштөө коду өтө жөнөкөй жана башка тилдерден эч кандай айырмасы жок. Ошол эле учурда, бардык киргизүү / чыгаруу, эмне бар, бул жерде эмне, ал бөгөттөлгөн эмес. Эгер сиз синхрондуу код жазсаңыз, анда ал асинхрондуу иштейт. Gevent сыяктуу эле, жакшы гана аткарылды.

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Келгиле авторизацияны өзү жасайлы:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Сураныч органын окушубуз керек деп жатабыз. Биз POST аргументтерин алабыз, логин менен сырсөздүн туура экенин текшеребиз. Эгер туура эмес болсо, анда биз авторизацияга тапшырабыз. Эгерде алар туура болсо, анда биз Редиске белги жазабыз:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Куки коюуну унутпаңыз, бул да эки сапта жасалат:

OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Мисал жөнөкөй, спекуляциялык. Албетте, элге мышык көрсөткөн кызматты кылбайбыз. Бирок бизди ким билет. Ошентип, өндүрүштө эмне кылуу мүмкүн экенин карап көрөлү.

  • Минималист бэкэнд. Кээде биз бэкендге бир аз маалыматтарды беришибиз керек: бир жерде биз датаны алмаштыруубуз керек, кайсы бир жерде тизмени көрсөтүшүбүз керек, азыр сайтта канча колдонуучу бар экенин айтышыбыз керек, эсептегичти же статистиканы бурушубуз керек. Ушунчалык кичинекей нерсе. Кээ бир минималдуу бөлүктөр абдан оңой жасалышы мүмкүн. Бул тез, жеңил жана сонун болот.
  • Маалыматтарды алдын ала иштетүү. Кээде биз баракчабызга жарнамаларды киргизгибиз келет жана бул жарнамаларды API сурамдары менен алабыз. Бул жерде муну жасоо абдан оңой. Биз ансыз деле катуу иштеп жаткан биздин артыбызды жүктөбөйбүз. Бул жерден алып, чогулта аласыз. Биз кээ бир JSти калыпка келтирип же, тескерисинче, аны колдонуучуга берүүдөн мурун бир нерсени алдын ала иштете алабыз.
  • Микросервис үчүн фасад. Бул да абдан жакшы иш, мен аны ишке ашырдым. Ага чейин мен өлкөдөгү юридикалык жактардын жарымына жакыны үчүн отчеттуулукту камсыз кылган электрондук отчет берүүчү Tenzor компаниясында иштегем. Биз кызмат жасадык, ал жерде бир эле механизмдин жардамы менен көп нерселер жасалат: маршрутизация, авторизация жана башкалар.
    OpenResty микросервисиңиз үчүн клей катары колдонулушу мүмкүн, бул бардыгына бир жетүү мүмкүнчүлүгүн жана бирдиктүү интерфейсти камсыз кылуу. Микросервистерди сизде Node.js, бул жерде PHP бар, бул жерде Python бар, бул жерде кандайдыр бир Erlang нерсе бар, биз бир эле кодду бардык жерде кайра жазгыбыз келбейт деп түшүнөбүз. Ошондуктан, OpenResty алдыга сайылышы мүмкүн.

  • Статистика жана аналитика. Адатта NGINX кире бериште болот жана бардык сурамдар ал аркылуу өтөт. Бул жерде чогултуу үчүн абдан ыңгайлуу болуп саналат. Сиз дароо бир нерсени эсептеп, аны бир жерге ыргыта аласыз, мисалы, ошол эле Elasticsearch, Logstash, же жөн эле журналга жазып, анан бир жакка жөнөтө аласыз.
  • Көп колдонуучу системалары. Мисалы, онлайн оюндар да абдан жакшы эмне үчүн. Бүгүн Кейптаун шаарында Александр Гладиш сизге OpenResty аркылуу көп оюнчу оюнун кантип тез прототиптөө керектигин айтып берет.
  • Сурам чыпкалоо (WAF). Азыр веб-тиркемелердин ар кандай брандмауэрлерин жасоо мода болуп калды, аларды камсыз кылган көптөгөн кызматтар бар. OpenResty менен сиз өзүңүздүн талаптарыңызга ылайык суроо-талаптарды жөнөкөй жана оңой чыпкалай турган веб-тиркеме брандмауэрин жасай аласыз. Эгер сизде Python болсо, анда сиз аны консолдун каалаган жерине чыгарбасаңыз, анда PHP сөзсүз сизге сайылбай турганын түшүнөсүз. Сиз MySQL жана Python бар экенин билесиз. Балким, алар кандайдыр бир каталогду кыдырып, маалымат базасына бир нерсе киргизүүгө аракет кылышы мүмкүн. Ошондуктан, сиз дудук суроо-талаптарды алдын ала тез жана арзан чыпкалай аласыз.
  • Коомчулук. OpenResty NGINXге негизделгендиктен, анын бонусу бар - бул NGINX коомчулугу. Бул абдан чоң жана сизде пайда болгон көптөгөн суроолорго NGINX коомчулугу буга чейин жооп берген.

    Lua иштеп чыгуучулары. Кечээ мен HighLoad ++ машыгуу күнүнө келген балдар менен сүйлөшүп, Луада бир гана Tarantool жазылганын уктум. Бул андай эмес, Луада көп нерсе жазылган. Мисалдар: OpenResty, Prosody XMPP сервери, Love2D оюн кыймылдаткычы, Луа Warcraft жана башка жерлерде скрипттелген. Lua иштеп чыгуучулары көп, алардын чоң жана жооп берүүчү коомчулугу бар. Менин Луа боюнча бардык суроолорума бир нече сааттын ичинде жооп берилди. Почта тизмесине жазганыңызда, бир нече мүнөттөн кийин бир топ жооптор бар, алар эмнени жана кантип, эмнени сүрөттөп беришет. Ал сонун. Тилекке каршы, мындай боорукер ак ниет жамаат бардык жерде эмес.
    OpenRestyде GitHub бар, анда бир нерсе бузулуп калса, маселени ача аласыз. Google Топторунда жалпы маселелерди талкуулай турган почта тизмеси бар, кытай тилиндеги почта тизмеси бар - сиз эч качан билбейсиз, балким, сиз англисче сүйлөбөйсүз, бирок сизде кытай тили бар.

натыйжалары

  • Мен OpenResty абдан ыңгайлуу веб алкак экенин айта алдым деп үмүттөнөм.
  • Анын кирүү босогосу төмөн, анткени код биз жазганга окшош, тил абдан жөнөкөй жана минимализм.
  • Ал кайра чалууларсыз асинхрондук I/O камсыз кылат, бизде кесме болбойт, анткени кээде NodeJSде жаза алабыз.
  • Анын оңой жайгаштырылышы бар, анткени бизге туура модулу жана биздин код менен NGINX гана керек жана баары дароо иштейт.
  • Чоң жана жооп берүүчү коомчулук.

Маршрутизация кантип жасалганын майда-чүйдөсүнө чейин айткан жокмун, бул өтө узун окуя болуп чыкты.

Конул бурганын учун рахмат!


Владимир Протасов - OpenResty: NGINXти толук кандуу колдонмо серверине айландыруу

Source: www.habr.com

Комментарий кошуу