OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachenMir publizéieren erëm den Transkript vum Konferenzbericht HighLoad++ 2016, déi am Skolkovo bei Moskau am November 7-8 d'lescht Joer stattfonnt huet. Vladimir Protasov erkläert wéi d'NGINX Funktionalitéit mat OpenResty a Lua verlängert gëtt.

Moien jiddereen, mäin Numm ass Vladimir Protasov, ech schaffen um Parallels. Ech soen Iech e bëssen iwwer mech selwer. Ech verbréngen dräi Véierel vu mengem Liewen Code ze schreiwen. Ech gouf e Programméierer zum Kär am wuertwiertleche Sënn: heiansdo gesinn ech Code a mengen Dreem. E Véierel vum Liewen ass industriell Entwécklung, Schreifweis Code deen direkt an d'Produktioun geet. E Code deen e puer vun iech benotzen awer et net mierken.

Also Dir verstitt wéi schlecht et war. Wéi ech e klenge Junior war, sinn ech komm a krut dës zwee-Terabyte Datenbanken. Et ass héich Belaaschtung fir jiddereen hei elo. Ech sinn op Konferenzen gaang a gefrot: "Jongen, sot mir, Dir hutt grouss Daten, ass alles cool? Wéivill Basen hutt Dir do? Si hunn mir geäntwert: "Mir hunn 100 Gigabytes!" Ech sot: "Cool, 100 Gigabytes!" An ech hu mir geduecht wéi ech meng pokeren Gesiicht virsiichteg erhalen. Dir denkt, jo, d'Kärelen sinn cool, an da gitt Dir zréck an täucht mat dëse Multi-Terabyte Datenbanken. An dëst ass e Junior. Kënnt Dir Iech virstellen wéi e Schlag dëst ass?

Ech weess méi wéi 20 Programméierungssproochen. Dëst ass eppes wat ech muss erausfannen wéi ech geschafft hunn. Si ginn Iech Code an Erlang, C, C ++, Lua, Python, Ruby, soss eppes, an Dir musst alles schneiden. Am Allgemengen, Ech hu missen. Et war net méiglech déi genee Zuel ze berechnen, awer iergendwou ëm den 20. ass d'Zuel verluer.

Well jiddereen präsent weess wat Parallels ass a wat mir maachen, wäert ech net schwätzen iwwer wéi cool mir sinn a wat mir maachen. Ech soen Iech just datt mir 13 Büroen ronderëm d'Welt hunn, méi wéi 300 Mataarbechter, Entwécklung zu Moskau, Tallinn a Malta. Wann Dir wëllt, kënnt Dir et huelen an op Malta plënneren wann et am Wanter kal ass an Dir musst de Réck waarm.

Speziell schreift eis Departement am Python 2. Mir sinn am Geschäft an hu keng Zäit fir fashionable Technologien ëmzesetzen, also leiden mir. Mir benotzen Django well et alles huet, a mir hunn dat wat onnéideg war geholl an ewechgehäit. Och MySQL, Redis an NGINX. Mir hunn och vill aner flott Saachen. Mir hunn MongoDB, mir hu Kanéngercher déi ronderëm lafen, mir hunn alles - awer et ass net mäin, an ech maachen et net.

OpenResty

Ech sot iwwer mech. Loosst eis erausfannen iwwer wat ech haut wäert schwätzen:

  • Wat ass OpenResty a mat wat gëtt et giess?
  • Firwat en anert Rad nei erfannen wann mir Python, NodeJS, PHP, Go an aner cool Saachen hunn, mat deenen jiddereen zefridden ass?
  • An e puer Beispiller aus dem Liewen. Ech hunn de Bericht vill missen ofschneiden, well et mech 3,5 Stonnen gedauert huet, also wäert et e puer Beispiller ginn.

OpenResty ass NGINX. Dank him hu mir e vollwäertege Webserver dee gutt geschriwwen ass a séier funktionnéiert. Ech mengen déi meescht vun eis benotzen NGINX an der Produktioun. Dir wësst all datt hien séier a cool ass. Si hunn cool synchron I / O an et gemaach, sou datt mir näischt brauchen ze Cycle, grad wéi se am Python hunn. Gevent ass cool, super, awer wann Dir C Code schreift an eppes geet falsch, da gitt Dir mat Gevent verréckt et ze Debuggen. Ech hat d'Erfahrung: et huet zwee ganz Deeg gedauert fir erauszefannen wat do falsch gaang ass. Wann een e puer Wochen net gegruewen hätt, de Problem fonnt, um Internet geschriwwen huet, a Google hätt et net fonnt, da wiere mir komplett verréckt ginn.

NGINX huet scho Caching a statesche Inhalt gemaach. Dir musst Iech keng Suergen iwwer wéi Dir dëst mënschlech mécht, fir datt Dir net iergendwou verlangsamt, fir datt Dir keng Descriptoren iergendwou verléiert. Nginx ass ganz bequem fir z'installéieren, Dir musst net iwwerdenken wat ze huelen - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx gouf installéiert, den Administrateuren ginn, si wësse wéi se domat schaffen. Nginx veraarbecht Ufroen op eng strukturéiert Manéier. Ech wäert e bësse méi spéit doriwwer schwätzen. Kuerz gesot, et huet eng Phase wann et d'Ufro just akzeptéiert huet, wéi se se veraarbecht huet, a wann et den Inhalt dem Benotzer servéiert huet.

Nginx ass cool, awer et gëtt e Problem: et ass net flexibel genuch, och mat all de coolen Features, déi d'Kärelen an d'Konfiguratioun agepaakt hunn, trotz der Tatsaach datt et konfiguréiert ka ginn. Dës Kraaft ass net genuch. Dofir hunn d'Kärelen aus Taobao, viru laanger Zäit, et schéngt wéi virun aacht Joer, Lua dran gebaut. Wat gëtt et?

  • Gréisst. Et ass kleng. LuaJIT gëtt ongeféier 100-200 Kilobytes vun Erënnerung Overhead a minimal Leeschtung Overhead.
  • Speed. De LuaJIT Dolmetscher ass no bei C a ville Situatiounen, an e puer Situatiounen verléiert hien op Java, an anerer iwwerpréift et. Fir eng Zäit gouf et als Staat vun der Konscht ugesinn, de coolste JIT Compiler. Elo ginn et méi cool, awer si si ganz schwéier, zum Beispill deeselwechte V8. E puer JS Dolmetscher an Java HotSpot si méi séier op e puer Punkten, awer op e puer Plazen verléieren se nach ëmmer.
  • Einfach ze léieren. Wann Dir hutt, sot, eng Perl Code Basis, an Dir sidd net Buchung, Dir wäert net Perl Programméierer fannen. Well se net existéieren, goufen se all ewechgeholl, an hinnen ze léieren ass laang a schwéier. Wann Dir Programméierer fir soss eppes wëllt, musst Dir se och nei trainéieren oder se fannen. Am Fall vu Lua ass alles einfach. All Junior kann Lua an dräi Deeg léieren. Et huet mech ongeféier zwou Stonnen gedauert fir et erauszefannen. Zwou Stonne méi spéit hunn ech scho Code an der Produktioun geschriwwen. Ongeféier eng Woch méi spéit ass hien direkt an d'Produktioun gaangen an ass fortgaang.

Als Resultat gesäit et esou aus:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Et gëtt vill hei. OpenResty huet eng Rëtsch Moduler gesammelt, souwuel Luash wéi och Motor. An Dir hutt alles prett - ofgebaut a funktionnéiert.

Beispiller

Genuch vun den Texter, loosst eis op de Code goen. Hei ass e klengen Hallo Welt:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Wat ass do? Dëst ass eng Engins Location. Mir fäerten keng Suergen, mir schreiwen net eisen eegene Routing, mir huelen net e fäerdegen - mir hunn et schonn an NGINX, mir liewen e gutt a faul Liewen.

content_by_lua_block ass e Block dee seet datt mir Inhalt mat engem Lua Skript servéieren. Mir huelen d'Engins Variabel remote_addr a setzt se an string.format. Et ass d'selwecht wéi sprintf, nëmmen zu Lua, nëmmen richteg. A mir ginn et dem Client.

Als Resultat wäert et esou ausgesinn:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Awer loosst eis zréck an d'real Welt. Keen setzt Hello World an d'Produktioun of. Eis Applikatioun geet normalerweis an d'Datebank oder soss anzwousch a waart meeschtens op eng Äntwert.

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Hie sëtzt just a waart. Et ass net ganz gutt. Wann 100.000 Benotzer kommen, ass et ganz schwéier fir eis. Also loosst eis eng einfach Applikatioun als Beispill benotzen. Mir sichen no Biller, zum Beispill, vu Kazen. Awer mir sichen net nëmmen, mir wäerten d'Schlësselwierder ausbauen an, wann de Benotzer no "Kitten" gesicht huet, fanne mir Kazen, Pelzkazen, asw. Als éischt musse mir d'Ufrodaten um Backend kréien. Et gesäit esou aus:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Zwou Linnen erlaben Iech GET Parameteren opzehuelen, keng Komplikatiounen. Als nächst, loosst eis soen, vun enger Datebank mat engem Schëld fir e Schlësselwuert an Extensioun, kréien mir dës Informatioun mat enger regulärer SQL Ufro. Et ass einfach. Et gesäit esou aus:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

D'Bibliothéik verbannen resty.mysql, déi mir schonn am Kit hunn. Mir brauchen näischt ze installéieren, alles ass prett. Mir weisen wéi Dir konnektéieren an eng SQL Ufro maachen:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Et ass e bëssen grujeleg hei, awer alles funktionnéiert. Hei ass 10 d'Limite. Mir zéien 10 Entréen eraus, mir si faul, mir wëllen net méi weisen. Ech vergiess iwwer d'Limite an SQL.

Als nächst fanne mir Biller fir all Ufroen. Mir sammelen eng Rëtsch vun Demanden an ausfëllen engem Lua Dësch genannt reqs, a mir maachen ngx.location.capture_multi.

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

All dës Ufroe sinn parallel geschéckt, an Äntwerte ginn eis zréck. D'Betribszäit ass gläich wéi d'Äntwertzäit vum luessten. Wa mir all an 50 Millisekonnen schéissen, a mir hunn honnert Ufroe geschéckt, da kréie mir eng Äntwert an 50 Millisekonnen.

Well mir faul sinn an net wëllen HTTP an Caching Handhabung schreiwen, maache mir NGINX alles fir eis. Wéi Dir gesitt, gouf et eng Demande fir url/fetch, hei ass hien:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Mir maachen et einfach proxy_pass, mir uginn wou Cache, wéi et ze maachen, an alles funktionnéiert fir eis.

Awer dëst ass net genuch, mir mussen nach ëmmer d'Donnéeën dem Benotzer ginn. Déi einfachst Iddi ass alles an JSON ze serialiséieren, einfach, an zwou Linnen. Mir ginn Inhalt-Typ, mir ginn JSON.

Awer et gëtt eng Schwieregkeet: de Benotzer wëll JSON net liesen. Mir mussen Front-End Entwéckler unzezéien. Heiansdo wëlle mir dat am Ufank net maachen. A SEO Spezialisten soen datt wa mir no Biller sichen, dann ass et hinnen egal. A wa mir hinnen e puer Inhalter ginn, wäerte se soen datt eis Sichmotoren näischt indexéieren.

Wat maachen doriwwer? Natierlech ginn mir de Benotzer HTML. Mat der Hand generéieren ass net comme il faut, also wëlle mir Templates benotzen. Et gëtt eng Bibliothéik fir dëst lua-resty-template.

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Dir hutt wahrscheinlech déi dräi grujeleg Buschtawen OPM gesinn. OpenResty kënnt mat sengem eegene Package Manager, duerch deen Dir eng Rëtsch vu verschiddene Moduler installéiere kënnt, besonnesch, lua-resty-template. Dëst ass en einfachen Templatemotor, ähnlech wéi Django Templates. Do kënnt Dir Code schreiwen a Variabel Substitutioun ausféieren.

Als Resultat wäert alles sou ausgesinn:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Mir hunn d'Donnéeën geholl an d'Schabloun gemaach, erëm an zwou Zeilen. De Benotzer ass frou, hien krut Kazen. Well mir d'Demande ausgebaut hunn, krut hien och e Pelzsiegel fir Kitten. Et weess een ni, vläicht huet hie genee no deem gesicht, awer konnt seng Demande net richteg formuléieren.

Alles ass cool, awer mir sinn an der Entwécklung a wëllen et nach net de Benotzer weisen. Loosst eis d'Autorisatioun maachen. Fir dëst ze maachen, kucke mer wéi NGINX d'Ufro an OpenResty Begrëffer handhabt:

  • Éischt Phase - Zougang, wann de Benotzer just ukomm ass, a mir hunn hien duerch Header, duerch IP Adress an aner Donnéeë gekuckt. Mir kënnen et direkt ofschneiden wa mir et net gär hunn. Dëst kann fir Autorisatioun benotzt ginn, oder wa mir vill Ufroe kréien, kënne mir se an dëser Phase einfach ofschneiden.
  • geschriwwe ginn. Mir schreiwen puer Ufro Daten.
  • Inhalt. Mir liwweren den Inhalt un de Benotzer.
  • Header Filter. Mir ersetzen d'Äntwert Header. Wa mir benotzt proxy_pass, kënne mir e puer Header iwwerschreiwe ier et dem Benotzer gëtt.
  • Kierper Filter. Mir kënnen de Kierper änneren.
  • aloggen - aloggen. Dir kënnt Logbicher an elasticsearch schreiwen ouni eng zousätzlech Schicht.

Eis Autorisatioun wäert sou ausgesinn:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Mir fügen dat derbäi location, déi mir virdru beschriwwen hunn, a setzen de folgende Code do:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Mir kucken ob mir e Cookie Token hunn. Wann net, da froe mir eng Autorisatioun. D'Benotzer si lëschteg a kënne roden datt se e Cookie Token musse setzen. Dofir wäerte mir et och an Redis setzen:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

De Code fir mat Redis ze schaffen ass ganz einfach an ass net anescht wéi aner Sproochen. Zur selwechter Zäit ass all Input / Output, hei an do, net blockéiert. Wann Dir synchrone Code schreift, funktionnéiert et asynchron. Bal wéi gevent, awer gutt gemaach.

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Loosst eis d'Autorisatioun selwer maachen:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Mir soen datt mir de Kierper vun der Ufro musse liesen. Mir kréien POST Argumenter a kontrolléieren ob de Login a Passwuert richteg sinn. Wann se falsch sinn, da fuerdere mir Iech fir d'Autorisatioun eraus. A wann et richteg ass, da schreift den Token an Redis:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

Vergiesst net de Cookie ze setzen, dëst gëtt och an zwou Zeilen gemaach:

OpenResty: NGINX an e vollwäertege Applikatiounsserver maachen

D'Beispill ass einfach a spekulativ. Natierlech wäerte mir kee Service maachen deen de Leit Kazen weist. Mee wien kennt eis. Also loosst eis iwwergoen wat an der Produktioun ka gemaach ginn.

  • Minimalistesche Backend. Heiansdo musse mir just e bëssen vun Daten op de Backend erausginn: iergendwou musse mir en Datum aginn, iergendwou musse mir eng Lëscht weisen, soen wéivill Benotzer elo um Site sinn, e Comptoir oder Statistiken befestegt. Eppes sou kleng. E puer minimal Stécker kënne ganz einfach gemaach ginn. Dëst wäert et séier, einfach a super maachen.
  • Date Virveraarbechtung. Heiansdo wëlle mir Reklammen op eis Säit embeden, a mir kréien dës Reklamm mat API Ufroen. Dëst ass ganz einfach hei ze maachen. Mir lueden net eise Backend, dee scho sëtzt a schwéier schafft. Dir kënnt et hei ophuelen a sammelen. Mir kënnen e puer JS zesummeklappen oder, am Géigendeel, et ofkoppelen an eppes virveraarbechten ier Dir et dem Benotzer gëtt.
  • Fassad fir Mikroservice. Dëst ass och e ganz gudde Fall, ech hunn et ëmgesat. Virdru hunn ech bei Tenzor geschafft, eng Firma déi sech mat elektronesche Berichterstattung beschäftegt a Berichterstattung un ongeféier d'Halschent vun de legalen Entitéiten am Land ubitt. Mir hunn e Service erstallt, vill Saache goufen do mam selwechte Mechanismus gemaach: Routing, Autorisatioun a méi.
    OpenResty kann als Klebstoff fir Är Mikroservicer benotzt ginn, en eenzegen Zougang zu alles an eng eenzeg Interface ubitt. Zënter Mikroservicer kënnen esou geschriwwe ginn datt Dir Node.js hei hutt, PHP hei, Python hei, e puer Erlang Saach hei, mir verstinn datt mir net iwwerall dee selwechte Code wëllen ëmschreiwen. Dofir kann OpenResty an der Front ugeschloss ginn.

  • Statistiken an Analyse. Normalerweis ass NGINX bei der Entrée, an all Ufroe ginn duerch. Et ass op dëser Plaz datt et ganz bequem ass ze sammelen. Dir kënnt direkt eppes berechnen an iergendwou eroplueden, zum Beispill Elasticsearch, Logstash, oder einfach op de Logbuch schreiwen an dann iergendwou schécken.
  • Multi-Benotzer Systemer. Zum Beispill, online Spiller sinn och ganz gutt ze maachen. Haut zu Cape Town schwätzt den Alexander Gladysh iwwer wéi ee séier e Multiplayer-Spill mat OpenResty prototypéiert.
  • Request Filtering (WAF). Hautdesdaags ass et moudesch all Zorte vu Webapplikatiouns Firewalls ze maachen; et gi vill Servicer déi se ubidden. Mat OpenResty kënnt Dir Iech selwer eng Webapplikatiouns Firewall maachen déi einfach an einfach Ufroen no Ären Ufuerderunge filtert. Wann Dir Python hutt, da versteet Dir datt PHP definitiv net an Iech injizéiert gëtt, ausser wann Dir selbstverständlech iwwerall vun der Konsole spawnt. Dir wësst datt Dir MySQL a Python hutt. Wahrscheinlech kënne se probéieren eng Aart Verzeechnestransfer ze maachen an eppes an d'Datebank ze sprëtzen. Dofir kënnt Dir komesch Ufroe séier a bëlleg direkt un der Front filteren.
  • Communautéit. Zënter OpenResty op NGINX gebaut ass, huet et e Bonus - dëst NGINX Gemeinschaft. Et ass ganz grouss, an en anstännegen Deel vun de Froen déi Dir am Ufank hutt, si scho vun der NGINX Gemeinschaft geléist.

    Lua Entwéckler. Gëschter hunn ech mat de Leit geschwat déi op den HighLoad++ Trainingsdag komm sinn an héieren datt nëmmen Tarantool a Lua geschriwwe gouf. Dëst ass net wouer, vill Saache sinn am Lua geschriwwen. Beispiller: OpenResty, Prosody XMPP Server, Love2D Spillmotor, Lua scripted a Warcraft a soss anzwousch. Et gi vill Lua Entwéckler, si hunn eng grouss a reaktiounsfäeger Gemeinschaft. All meng Lua Froen goufen bannent e puer Stonnen geléist. Wann Dir op d'Mailing Lëscht schreift, wuertwiertlech bannent e puer Minutten ginn et schonn eng Rëtsch Äntwerten, beschreiwen wat a wéi, wat ass wat. Et ass flott. Leider ass sou eng Aart, spirituell Gemeinschaft net iwwerall.
    Et gëtt GitHub fir OpenResty, wou Dir en Thema opmaache kënnt wann eppes futti ass. Et gëtt eng Mailinglëscht op Google Groups, wou Dir allgemeng Themen diskutéiere kënnt, et gëtt eng Mailinglëscht op Chinesesch - Dir wësst ni, vläicht schwätzt Dir net Englesch, awer Dir kennt Chinesesch.

Resultater

  • Ech hoffen ech konnt vermëttelen datt OpenResty e ganz praktesche Kader ass, dee fir de Web ugepasst ass.
  • Et huet eng niddreg Barrière fir d'Entrée, well de Code ähnlech ass wéi an deem mir schreiwen, ass d'Sprooch zimmlech einfach a minimalistesch.
  • Et bitt asynchronen I / O ouni Callbacks, mir wäerte keng Nuddelen hunn wéi mir heiansdo an NodeJS schreiwen.
  • Et huet einfach Deployment, well mir brauche just NGINX mam néidege Modul an eisem Code, an alles funktionnéiert direkt.
  • Grouss a reaktiounsfäeger Gemeinschaft.

Ech hunn net am Detail gesot wéi de Routing gemaach gëtt, et huet sech eng ganz laang Geschicht erausgestallt.

Merci fir Är Opmierksamkeet!


Vladimir Protasov - OpenResty: verwandelt NGINX zu engem vollwäertege Applikatiounsserver

Source: will.com

Setzt e Commentaire