OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksiJulkaisemme uudelleen konferenssin raportin tekstin HighLoad++ 2016, joka pidettiin Skolkovossa Moskovan lähellä 7.-8. viime vuonna. Vladimir Protasov kertoo, kuinka NGINX-toiminnallisuutta voidaan laajentaa OpenRestyllä ja Lualla.

Hei kaikki, nimeni on Vladimir Protasov, työskentelen Parallelsilla. Kerron vähän itsestäni. Käytän kolme neljäsosaa elämästäni koodin kirjoittamiseen. Minusta tuli ohjelmoija pohjimmiltaan kirjaimellisessa mielessä: näen joskus koodia unissani. Neljännes elämästä on teollista kehitystä, koodin kirjoittamista, joka menee suoraan tuotantoon. Koodi, jota jotkut teistä käyttävät, mutta ette tiedä sitä.

Ilmoittaakseen kuinka huonosti se oli. Kun olin pieni, tulin sisään ja minulle annettiin nämä kahden teratavun tietokannat. Se on nyt täällä kaikille highload. Menin konferensseihin ja kysyin: "Kaverit, kertokaa minulle, onko sinulla big dataa, onko kaikki siistiä? Kuinka monta tukikohtaa sinulla on siellä? He vastasivat minulle: "Meillä on 100 gigatavua!" Sanoin: "Hienoa, 100 gigatavua!" Ja mietin itsekseni, kuinka pelastaisin siististi pokerikasvot. Ajattelet, kyllä, kaverit ovat siistejä, ja sitten palaat ja puuhastelet näitä usean teratavun tietokantoja. Ja tämä on juniorina olemista. Voitteko kuvitella, mikä hitti se on?

Tiedän yli 20 ohjelmointikieltä. Tämä minun piti selvittää työn aikana. He antavat sinulle koodin Erlangissa, C:ssä, C++:ssa, Luassa, Pythonissa, Rubyssa, jossain muussa, ja sinun on leikattava kaikki. Yleensä minun oli pakko. Tarkkaa lukua ei voitu laskea, mutta jossain 20:n tienoilla luku hävisi.

Koska kaikki täällä tietävät, mitä Parallels on ja mitä teemme, en aio puhua siitä, kuinka siistejä olemme ja mitä teemme. Kerron vain, että meillä on 13 toimistoa ympäri maailmaa, yli 300 työntekijää, kehitystä Moskovassa, Tallinnassa ja Maltalla. Halutessasi voit ottaa ja muuttaa Maltalle, jos talvella on kylmä ja sinun täytyy lämmittää selkää.

Erityisesti osastomme kirjoittaa Python 2:lla. Olemme liiketoiminnassa, eikä meillä ole aikaa esitellä muodikkaita teknologioita, joten kärsimme. Meillä on Django, koska siinä on kaikki, ja otimme ylimääräisen ja heitimme sen pois. Myös MySQL, Redis ja NGINX. Meillä on myös paljon muuta kivaa. Meillä on MongoDB, meillä on kaneja juoksentelemassa, meillä ei vain ole mitään - mutta se ei ole minun, enkä tee sitä.

OpenResty

Kerroin itsestäni. Katsotaanpa, mistä puhun tänään:

  • Mikä OpenResty on ja minkä kanssa sitä syödään?
  • Miksi keksiä pyörää uudelleen, kun meillä on Python, NodeJS, PHP, Go ja muita hienoja juttuja, joihin kaikki ovat tyytyväisiä?
  • Ja muutama esimerkki tosielämästä. Minun piti leikata raporttia paljon, koska sain sen 3,5 tuntia, joten esimerkkejä tulee vähän.

OpenResty on NGINX. Hänen ansiosta meillä on täysi verkkopalvelin, joka on hyvin kirjoitettu, se toimii nopeasti. Luulen, että useimmat meistä käyttävät NGINX:ää tuotannossa. Te kaikki tiedätte, että hän on nopea ja viileä. He tekivät siihen hienon synkronisen I / O:n, joten meidän ei tarvitse pyörittää mitään samalla tavalla kuin gevent pyöräiltiin Pythonissa. Gevent on siistiä, hienoa, mutta jos kirjoitat C-koodin ja jotain menee pieleen geventissä, tulet hulluksi sen virheenkorjauksessa. Minulla oli kokemusta: kesti kaksi kokonaista päivää selvittää, mikä siellä meni pieleen. Jos joku ei olisi kaivanut muutamaan viikkoon ennen, löytänyt ongelman, kirjoittanut sitä Internetiin, eikä Google olisi löytänyt sitä, olisimme menneet täysin hulluiksi.

NGINX suorittaa jo välimuistin ja staattisen sisällön. Sinun ei tarvitse huolehtia siitä, kuinka se tehdään inhimillisesti, jotta et hidasta jossain, jotta et menetä kuvauksia jonnekin. Nginx on erittäin kätevä ottaa käyttöön, sinun ei tarvitse miettiä mitä ottaa - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx asennettiin, annettiin järjestelmänvalvojille, he osaavat työskennellä sen kanssa. Nginx käsittelee pyynnöt jäsennellysti. Puhun tästä hieman myöhemmin. Lyhyesti sanottuna hänellä on vaihe, jolloin hän vain hyväksyi pyynnön, kun hän käsitteli ja kun hän antoi sisällön käyttäjälle.

Nginx on siisti, mutta siinä on yksi ongelma: se ei ole tarpeeksi joustava edes kaikilla niillä hienoilla ominaisuuksilla, joita kaverit työnsivät konfiguraatioon, huolimatta siitä, että sitä voidaan mukauttaa. Tämä voima ei riitä. Siksi Taobaon tyypit kerran, mielestäni noin kahdeksan vuotta sitten, rakensivat Luan siihen. Mitä hän antaa?

  • koko. Se on pieni. LuaJIT antaa noin 100-200 kilotavua muistia ja minimaalisen suorituskyvyn.
  • Nopeus. LuaJIT-tulkki on monissa tilanteissa lähellä C:tä, joissain tilanteissa se häviää Javalle, joissain ohittaa sen. Jonkin aikaa sitä pidettiin huippumodernina, tyylikkäimpana JIT-kääntäjänä. Nyt on viileämpiä, mutta ne ovat erittäin raskaita, esimerkiksi sama V8. Jotkut JS-tulkit ja Java HotSpot ovat joissain kohdissa nopeampia, mutta häviävät silti joissain kohdissa.
  • Helppo oppia. Jos sinulla on esimerkiksi Perl-koodikanta etkä ole Bookingissa, et löydä Perl-ohjelmoijia. Koska he eivät ole siellä, heidät vietiin kaikki pois, ja heidän opettaminen on pitkä ja vaikeaa. Jos haluat ohjelmoijia johonkin muuhun, heidät on ehkä myös koulutettava uudelleen tai löydettävä. Luan tapauksessa kaikki on yksinkertaista. Kuka tahansa juniori voi oppia luan kolmessa päivässä. Kesti noin kaksi tuntia tajuta se. Kaksi tuntia myöhemmin kirjoitin jo koodia tuotannossa. Noin viikkoa myöhemmin hän siirtyi suoraan tuotantoon ja lähti.

Tuloksena se näyttää tältä:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Täällä on paljon. OpenResty on koonnut joukon moduuleja, sekä luashia että moottoreita. Ja sinulla on kaikki valmiina – käytössä ja toiminnassa.

Примеры

Sanoitukset riittää, siirrytään koodiin. Tässä pieni Hello World:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Mitä siellä on? tämä on moottoreiden sijainti. Emme ole huolissamme, emme kirjoita omaa reititystämme, emme ota valmiita - meillä on se jo NGINX:ssä, elämme hyvin ja laiskasti.

content_by_lua_block on lohko, joka sanoo, että tarjoamme sisältöä Lua-skriptillä. Otamme moottorin muuttujan remote_addr ja sujauta se sisään string.format. Tämä on sama kuin sprintf, vain Luassa, vain oikein. Ja annamme sen asiakkaalle.

Tämän seurauksena se näyttää tältä:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Mutta takaisin todelliseen maailmaan. Tuotannossa kukaan ei ota Hello Worldiä käyttöön. Sovelluksemme menee yleensä tietokantaan tai muualle ja odottaa useimmiten vastausta.

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Istuu vain ja odottaa. Se ei ole kovin hyvä. Kun 100.000 XNUMX käyttäjää tulee, se on meille erittäin vaikeaa. Siksi käytetään esimerkkinä yksinkertaista sovellusta. Etsimme kuvia, esimerkiksi kissoja. Emme vain etsi, vaan laajennamme avainsanoja, ja jos käyttäjä teki haun sanalla "pennut", löydämme kissoja, pörröisiä ja niin edelleen. Ensin meidän on saatava pyyntötiedot taustajärjestelmästä. Se näyttää tältä:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Kahden rivin avulla voit poimia GET-parametreja ilman komplikaatioita. Sitten saamme nämä tiedot esimerkiksi tietokannasta, jossa on taulukko avainsanan ja päätteen mukaan tavallisella SQL-kyselyllä. Kaikki on yksinkertaista. Se näyttää tältä:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Yhdistämme kirjaston resty.mysql, joka meillä on jo pakkauksessa. Meidän ei tarvitse asentaa mitään, kaikki on valmiina. Määritä yhteyden muodostaminen ja SQL-kyselyn tekeminen:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Se on vähän pelottavaa, mutta se toimii. Tässä 10 on raja. Vedämme 10 levyä, olemme laiskoja, emme halua näyttää enempää. SQL:ssä unohdin rajan.

Sitten löydämme kuvia kaikkiin kyselyihin. Keräämme joukon pyyntöjä ja täytämme Lua-taulukon nimeltä reqs, ja tee ngx.location.capture_multi.

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Kaikki nämä pyynnöt menevät rinnakkain, ja vastaukset palautetaan meille. Ajoaika on yhtä suuri kuin hitaimman vasteaika. Jos me kaikki ammumme takaisin 50 millisekunnissa ja lähetimme sata pyyntöä, saamme vastauksen 50 millisekunnissa.

Koska olemme laiskoja emmekä halua kirjoittaa HTTP-käsittelyä ja välimuistia, saamme NGINX:n tekemään kaiken puolestamme. Kuten näit, oli pyyntö url/fetchtässä se on:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Teemme yksinkertaista proxy_pass, määritä, mihin välimuistiin tallennetaan, miten se tehdään, ja kaikki toimii puolestamme.

Mutta tämä ei riitä, meidän on silti annettava tiedot käyttäjälle. Yksinkertaisin idea on sarjoittaa kaikki JSONiin helposti kahdella rivillä. Annamme sisältötyypin, annamme JSONin.

Mutta on yksi vaikeus: käyttäjä ei halua lukea JSON:ia. Meidän täytyy houkutella etupään kehittäjiä. Joskus emme tee sitä aluksi. Kyllä, ja SEO-asiantuntijat sanovat, että jos etsimme kuvia, he eivät välitä. Ja jos annamme heille sisältöä, he sanovat, että hakukoneemme eivät indeksoi mitään.

Mitä tehdä sen kanssa? Tietenkin annamme käyttäjälle HTML-koodin. Kahvojen avulla luominen ei ole itsestään selvää, joten haluamme käyttää malleja. Tätä varten on kirjasto lua-resty-template.

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Olet varmaan nähnyt kolme pelättyä kirjainta OPM. OpenResty sisältää oman paketinhallinnan, jonka kautta voit asentaa joukon erilaisia ​​moduuleja, erityisesti lua-resty-template. Se on yksinkertainen mallimoottori, joka muistuttaa Django-malleja. Siellä voit kirjoittaa koodia ja korvata muuttujia.

Tämän seurauksena kaikki näyttää suunnilleen tältä:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Otimme tiedot ja renderöimme mallin uudelleen kahdella rivillä. Käyttäjä on tyytyväinen, sai kissoja. Koska laajensimme pyyntöä, hän sai myös turkishylkeen kissanpennuille. Et koskaan tiedä, ehkä hän etsi sitä, mutta hän ei osannut muotoilla pyyntöään oikein.

Kaikki on siistiä, mutta olemme kehitysvaiheessa, emmekä halua vielä näyttää käyttäjille. Tehdään valtuutus. Katsotaanpa tätä varten, kuinka NGINX käsittelee pyyntöä OpenRestyssä:

  • Ensimmäinen vaihe - pääsy, kun käyttäjä juuri tuli, ja katsoimme häntä otsikoiden, IP-osoitteen tai muiden tietojen perusteella. Voit leikata sen heti pois, jos emme pidä siitä. Tätä voidaan käyttää valtuutukseen, tai jos saamme paljon pyyntöjä, voimme helposti pilkkoa ne tässä vaiheessa.
  • kirjoittaa uudelleen. Joitakin pyyntötietoja kirjoitetaan uudelleen.
  • pitoisuus. Annamme sisältöä käyttäjälle.
  • otsikkosuodatin. Muuta vastausotsikot. Jos käytimme proxy_pass, voimme kirjoittaa joitakin otsikoita uudelleen ennen kuin annamme sen käyttäjälle.
  • rungon suodatin. Voimme muuttaa kehon.
  • log - puunkorjuu. Lokia on mahdollista kirjoittaa elasticsearchissa ilman lisäkerrosta.

Valtuutuksemme näyttää suunnilleen tältä:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Lisäämme sen siihen location, jonka kuvailimme aiemmin, ja laita siihen seuraava koodi:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Katsomme, onko meillä evästetunnus. Jos ei, annamme luvan. Käyttäjät ovat ovelia ja saattavat arvata, että evästetunnus on asetettava. Siksi laitamme sen myös Redisiin:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Rediksen kanssa työskentelyn koodi on hyvin yksinkertainen eikä eroa muista kielistä. Samaan aikaan kaikki tulo / lähtö, mitä siellä on, mikä on täällä, se ei estä. Jos kirjoitat synkronista koodia, se toimii asynkronisesti. Kuten gevent, vain hyvin tehty.

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Tehdään valtuutus itse:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Sanomme, että meidän on luettava pyynnön teksti. Saamme POST-argumentteja, tarkista, että kirjautumistunnus ja salasana ovat oikein. Jos se on väärin, annamme valtuutuksen. Ja jos ne ovat oikein, kirjoitamme tunnuksen Redikselle:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Älä unohda asettaa evästettä, tämä tehdään myös kahdella rivillä:

OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Esimerkki on yksinkertainen, spekulatiivinen. Emme tietenkään tee palvelua, joka näyttää kissoja ihmisille. Mutta kuka meidät tuntee. Käydään siis läpi, mitä tuotannossa voidaan tehdä.

  • Minimalistinen tausta. Joskus meidän on annettava taustalle melko vähän dataa: jossain on korvattava päivämäärä, jossain on näytettävä jonkinlainen luettelo, sanottava kuinka monta käyttäjää sivustolla on nyt, ruuvattava laskuri tai tilastot. Jotain niin pientä. Jotkut minimaaliset kappaleet voidaan tehdä erittäin helposti. Tästä tulee nopeaa, helppoa ja hienoa.
  • Tietojen esikäsittely. Joskus haluamme upottaa mainoksia sivullemme, ja otamme nämä mainokset vastaan ​​API-pyyntöjen avulla. Tämä on erittäin helppo tehdä täällä. Emme lataa taustajärjestelmäämme, joka toimii jo nyt kovasti. Voit noutaa ja noutaa täältä. Voimme muotoilla jonkin JS:n tai, päinvastoin, irrottaa, esikäsitellä jotain ennen kuin annamme sen käyttäjälle.
  • Julkisivu mikropalvelua varten. Tämä on myös erittäin hyvä tapaus, toteutin sen. Sitä ennen työskentelin Tenzorissa, sähköisessä raportointiyrityksessä, joka raportoi noin puolelle maan juridisista henkilöistä. Olemme tehneet palvelun, siellä tehdään monia asioita samalla mekanismilla: reititys, valtuutus ja paljon muuta.
    OpenRestyä voidaan käyttää mikropalveluidesi liimana, joka tarjoaa yhden pääsyn kaikkeen ja yhden käyttöliittymän. Koska mikropalvelut voidaan kirjoittaa niin, että sinulla on Node.js täällä, sinulla on PHP täällä, sinulla on Python täällä, tässä on jotain Erlang-juttua, ymmärrämme, että emme halua kirjoittaa samaa koodia uudelleen kaikkialle. Siksi OpenResty voidaan kytkeä etuosaan.

  • Tilastot ja analytiikka. Yleensä NGINX on sisäänkäynnillä, ja kaikki pyynnöt menevät sen kautta. Juuri tässä paikassa on erittäin kätevä kerätä. Voit heti laskea jotain ja heittää sen jonnekin, esimerkiksi samaan Elasticsearchiin, Logstashiin tai kirjoittaa sen lokiin ja lähettää sen sitten jonnekin.
  • Usean käyttäjän järjestelmät. Esimerkiksi nettipelit ovat myös erittäin hyviä. Tänään Kapkaupungissa Alexander Gladysh kertoo sinulle kuinka nopeasti prototyyppi moninpeli OpenRestyllä.
  • Pyydä suodatusta (WAF). Nyt on muotia tehdä kaikenlaisia ​​verkkosovellusten palomuurit, niitä tarjoaa monia palveluita. OpenResty-sovelluksen avulla voit tehdä itsellesi verkkosovelluksen palomuurin, joka suodattaa pyynnöt yksinkertaisesti ja helposti tarpeidesi mukaan. Jos sinulla on Python, ymmärrät, että PHP:tä ei varmasti ruiskuteta sinulle, ellet tietenkään luo sitä minne tahansa konsolista. Tiedät, että sinulla on MySQL ja Python. Luultavasti täällä he voivat yrittää tehdä jonkinlaisen hakemiston läpikäynnin ja pistää jotain tietokantaan. Siksi voit suodattaa tyhmät pyynnöt nopeasti ja edullisesti suoraan etupuolelta.
  • Yhteisö. Koska OpenResty perustuu NGINX:ään, sillä on bonus - tämä on NGINX-yhteisö. Se on erittäin suuri, ja NGINX-yhteisö on jo vastannut moniin aluksi kysymyksiisi.

    Lua-kehittäjät. Juttelin eilen HighLoad ++ -harjoituspäivään tulleiden kavereiden kanssa ja kuulin, että vain Tarantool on kirjoitettu lualla. Näin ei ole, monet asiat on kirjoitettu lualla. Esimerkkejä: OpenResty, Prosody XMPP -palvelin, Love2D-pelimoottori, Lua on käsikirjoitettu Warcraftissa ja muualla. Lua-kehittäjiä on paljon, heillä on suuri ja reagoiva yhteisö. Kaikkiin Lua-kysymyksiini vastattiin muutamassa tunnissa. Kun kirjoitat postituslistalle, kirjaimellisesti muutamassa minuutissa on jo nippu vastauksia, ne kuvaavat mitä ja miten, mikä on mitä. Se on mahtava. Valitettavasti tällaista vilpitöntä yhteisöä ei ole kaikkialla.
    OpenRestyssä on GitHub, jossa voit avata ongelman, jos jokin menee rikki. Google-ryhmissä on postituslista, jossa voit keskustella yleisistä asioista, on postituslista kiinaksi - et koskaan tiedä, ehkä et puhu englantia, mutta osaat kiinan.

Tulokset

  • Toivon, että pystyin ilmaisemaan, että OpenResty on erittäin kätevä verkkokehys.
  • Sillä on matala sisääntulokynnys, koska koodi on samanlainen kuin kirjoittamamme, kieli on melko yksinkertainen ja minimalistinen.
  • Se tarjoaa asynkronisen I/O:n ilman takaisinsoittoja, meillä ei ole nuudeleita, kuten voimme joskus kirjoittaa NodeJS:ssä.
  • Se on helppo ottaa käyttöön, koska tarvitsemme vain NGINX:n oikealla moduulilla ja koodillamme, ja kaikki toimii heti.
  • Suuri ja reagoiva yhteisö.

En kertonut yksityiskohtaisesti kuinka reititys tehdään, siitä tuli erittäin pitkä tarina.

Спасибо за внимание!


Vladimir Protasov - OpenResty: NGINX:n muuttaminen täysimittaiseksi sovelluspalvelimeksi

Lähde: will.com

Lisää kommentti