OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveriAtkal publicējam konferences ziņojuma stenogrammu HighLoad++ 2016, kas notika Skolkovā pie Maskavas pagājuŔā gada 7.-8.novembrÄ«. Vladimirs Protasovs paskaidrots, kā paplaÅ”ināt NGINX funkcionalitāti, izmantojot OpenResty un Lua.

Sveiki visiem, mani sauc Vladimirs Protasovs, es strādāju Parallels. PastāstÄ«Å”u mazliet par sevi. TrÄ«s ceturtdaļas savas dzÄ«ves pavadu, rakstot kodu. Es kļuvu par programmētāju lÄ«dz sirds dziļumiem tieŔā nozÄ«mē: dažreiz sapņos redzu kodu. Ceturtā daļa dzÄ«ves ir rÅ«pnieciskā attÄ«stÄ«ba, rakstot kodu, kas nonāk ražoÅ”anā. Kods, ko daži no jums izmanto, bet to neapzinās.

Tātad jÅ«s saprotat, cik slikti tas bija. Kad es biju mazs, es atnācu un man iedeva Ŕīs divu terabaitu datu bāzes. Tagad Å”eit visiem ir liela slodze. Es devos uz konferencēm un jautāju: ā€œPuiÅ”i, sakiet man, jums ir lieli dati, vai viss ir forÅ”i? Cik bāzu tev tur ir? Viņi man atbildēja: "Mums ir 100 gigabaiti!" Es teicu: "ForÅ”i, 100 gigabaiti!" Un es pie sevis domāju, kā rÅ«pÄ«gi uzturēt savu pokera seju. JÅ«s domājat, jā, puiÅ”i ir forÅ”i, un tad jÅ«s atgriežaties un Ä·eraties pie Ŕīm vairāku terabaitu datubāzēm. Un Ŕī ir bÅ«t junioram. Vai varat iedomāties, kāds tas ir trieciens?

Es zinu vairāk nekā 20 programmÄ“Å”anas valodas. Tas ir kaut kas, kas man bija jāizdomā, strādājot. Viņi dod jums kodu Erlang, C, C++, Lua, Python, Ruby un kaut ko citu, un jums tas viss ir jāizgriež. Vispār man vajadzēja. PrecÄ«zu skaitli izrēķināt neizdevās, bet kaut kur ap 20. skaitlis pazuda.

Tā kā visi klātesoÅ”ie zina, kas ir Parallels un ko mēs darām, es nerunāŔu par to, cik mēs esam forÅ”i un ko mēs darām. Es tikai pastāstÄ«Å”u, ka mums ir 13 biroji visā pasaulē, vairāk nekā 300 darbinieku, attÄ«stÄ«ba Maskavā, Tallinā un Maltā. Ja vēlaties, varat to ņemt un pārcelties uz Maltu, ja ziemā ir auksts un jums ir nepiecieÅ”ams sasildÄ«t muguru.

Konkrēti, mÅ«su nodaļa raksta Python 2. Mēs esam biznesā un nav laika ieviest modernas tehnoloÄ£ijas, tāpēc mēs cieÅ”am. Mēs izmantojam Django, jo tajā ir viss, un mēs paņēmām nevajadzÄ«go un izmetām to. ArÄ« MySQL, Redis un NGINX. Mums ir arÄ« daudz citu forÅ”u lietu. Mums ir MongoDB, mums skraida truÅ”i, mums ir viss, bet tas nav mans, un es to nedaru.

OpenResty

Es stāstīju par sevi. Izdomāsim, par ko es Ŕodien runāŔu:

  • Kas ir OpenResty un ar ko to ēd?
  • Kāpēc no jauna izgudrot citu riteni, ja mums ir Python, NodeJS, PHP, Go un citas lieliskas lietas, ar kurām visi ir apmierināti?
  • Un daži piemēri no dzÄ«ves. Man bija ļoti jāsagriež atskaite, jo tas aizņēma 3,5 stundas, tāpēc piemēru bÅ«s maz.

OpenResty ir NGINX. Pateicoties viņam, mums ir pilnvērtÄ«gs tÄ«mekļa serveris, kas ir labi uzrakstÄ«ts un darbojas ātri. Es domāju, ka lielākā daļa no mums ražoÅ”anā izmanto NGINX. JÅ«s visi zināt, ka viņŔ ir ātrs un forÅ”s. Viņi tajā izveidoja forÅ”u sinhrono I/O, tāpēc mums nekas nav jāpārvieto, tāpat kā viņi to darÄ«ja programmā Python. Gevent ir forÅ”s, lielisks, bet, ja uzrakstÄ«sit C kodu un kaut kas noiet greizi, tad ar Gevent jÅ«s traki atkļūdosit. Man bija pieredze: vajadzēja veselas divas dienas, lai saprastu, kas tur nogāja greizi. Ja kāds nebÅ«tu rakņājies vairākas nedēļas, atradis problēmu, rakstÄ«jis internetā un Google nebÅ«tu atradis, tad mēs bÅ«tu galÄ«gi traki.

NGINX jau ir izveidota keÅ”atmiņa un statiskais saturs. Jums nav jāuztraucas par to, kā to izdarÄ«t cilvēciski, lai jÅ«s kaut kur nepalēninātu ātrumu, lai jÅ«s kaut kur nepazaudētu deskriptorus. Nginx ir ļoti ērti izvietot, jums nav jādomā, ko ņemt - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx tika instalēts, iedots adminiem, viņi zina, kā ar to strādāt. Nginx apstrādā pieprasÄ«jumus strukturētā veidā. Par to es runāŔu nedaudz vēlāk. ÄŖsāk sakot, tam ir fāze, kad tas tikko pieņēma pieprasÄ«jumu, kad tas to apstrādāja un kad tas sniedza saturu lietotājam.

Nginx ir forÅ”s, taču ir viena problēma: tas nav pietiekami elastÄ«gs, pat ar visām lieliskajām funkcijām, kuras puiÅ”i ir pieblÄ«vējuÅ”i konfigurācijā, neskatoties uz to, ko var konfigurēt. Ar Å”o spēku nepietiek. Tāpēc puiÅ”i no Taobao sen, Ŕķiet, pirms astoņiem gadiem, tajā iebÅ«vēja Lua. Ko tas dod?

  • Izmērs. Tas ir mazs. LuaJIT nodroÅ”ina aptuveni 100ā€“200 kilobaitu atmiņas un minimālu veiktspēju.
  • Ātrums. LuaJIT tulks daudzās situācijās ir tuvu C, dažās situācijās tas zaudē Java, citās pārspēj to. Kādu laiku tas tika uzskatÄ«ts par modernāko, stilÄ«gāko JIT kompilatoru. Tagad ir vēsāki, bet tie ir ļoti smagi, piemēram, tas pats V8. Daži JS tulki un Java HotSpot dažos punktos ir ātrāki, taču dažviet tie joprojām zaudē.
  • Viegli iemācÄ«ties. Ja jums ir, teiksim, Perl koda bāze un jÅ«s neesat Booking, jÅ«s neatradÄ«sit Perl programmētājus. Tā kā viņi neeksistē, tie visi tika atņemti, un to mācÄ«Å”ana ir ilga un sarežģīta. Ja vēlaties programmētājus kaut kam citam, jums var nākties viņus pārkvalificēt vai atrast. Lua gadÄ«jumā viss ir vienkārÅ”i. JebkurÅ” juniors var apgÅ«t Lua trÄ«s dienās. Man vajadzēja apmēram divas stundas, lai to izdomātu. Pēc divām stundām es jau rakstÄ«ju kodu ražoÅ”anā. Apmēram pēc nedēļas viņŔ uzreiz devās uz ražoÅ”anu un aizgāja.

Rezultātā tas izskatās Ŕādi:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Å eit ir daudz. OpenResty ir savācis virkni moduļu, gan luash, gan motorus. Un jums viss ir gatavs ā€” izvietots un darbojas.

piemēri

Pietiek ar dziesmu vārdiem, pāriesim pie koda. Šeit ir mazs Hello World:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Kas tur ir? Å Ä« ir Enginsas atraÅ”anās vieta. Mēs neuztraucamies, mēs nerakstām paÅ”i savu marÅ”rutÄ“Å”anu, mēs neņemam gatavu ā€” mums tas jau ir NGINX, mēs dzÄ«vojam labi un laiski.

content_by_lua_block ir bloks, kurā teikts, ka mēs apkalpojam saturu, izmantojot Lua skriptu. Mēs ņemam Engins mainīgo remote_addr un ielieciet to string.format. Tas ir tāds pats kā sprintf, tikai Lua valodā, tikai pareizi. Un mēs to dodam klientam.

Rezultātā tas izskatīsies Ŕādi:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Bet atgriezÄ«simies reālajā pasaulē. Neviens neizvieto Hello World ražoÅ”anā. MÅ«su pieteikums parasti nonāk datu bāzē vai kaut kur citur un lielāko daļu laika gaida atbildi.

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

ViņŔ vienkārÅ”i sēž un gaida. Tas nav ļoti labi. Kad nāk 100.000 XNUMX lietotāju, mums ir ļoti grÅ«ti. Tāpēc kā piemēru izmantosim vienkārÅ”u lietojumprogrammu. Meklēsim attēlus, piemēram, kaÄ·us. Taču mēs ne tikai meklēsim, bet arÄ« paplaÅ”ināsim atslēgvārdus, un, ja lietotājs meklēja ā€œkaķēniā€, mēs atradÄ«sim kaÄ·us, pÅ«kainus kaÄ·us utt. Pirmkārt, mums ir jāiegÅ«st pieprasÄ«juma dati aizmugursistēmā. Tas izskatās Ŕādi:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Divas lÄ«nijas ļauj uzņemt GET parametrus, bez sarežģījumiem. Tālāk, pieņemsim, no datu bāzes ar zÄ«mi atslēgvārdam un paplaÅ”inājumam mēs iegÅ«stam Å”o informāciju, izmantojot parastu SQL vaicājumu. Tas ir vienkārÅ”i. Tas izskatās Ŕādi:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Bibliotēkas savienoÅ”ana resty.mysql, kas mums jau ir komplektā. Mums nekas nav jāinstalē, viss ir gatavs. Mēs norādām, kā izveidot savienojumu un veikt SQL vaicājumu:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Å eit ir nedaudz biedējoÅ”i, bet viss darbojas. Å eit 10 ir robeža. Izvelkam 10 ierakstus, esam slinki, negribam vairāk rādÄ«t. Es aizmirsu par ierobežojumu SQL.

Tālāk mēs atrodam attēlus visiem jautājumiem. Mēs apkopojam virkni pieprasījumu un aizpildām Lua tabulu ar nosaukumu reqs, un mēs to darām ngx.location.capture_multi.

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Visi Å”ie pieprasÄ«jumi tiek nosÅ«tÄ«ti paralēli, un atbildes tiek atgrieztas mums. DarbÄ«bas laiks ir vienāds ar lēnākās reakcijas laiku. Ja mēs visi noÅ”aujam 50 milisekundēs un nosÅ«tÄ«sim simts pieprasÄ«jumu, tad atbildi saņemsim 50 milisekundēs.

Tā kā mēs esam slinki un nevēlamies rakstÄ«t HTTP un keÅ”atmiņas apstrādi, mēs liksim NGINX visu izdarÄ«t mÅ«su vietā. Kā jÅ«s redzējāt, bija pieprasÄ«jums pēc url/fetch, lÅ«k, viņŔ ir:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Mēs to padarām vienkārÅ”u proxy_pass, mēs norādām, kur saglabāt keÅ”atmiņu, kā to izdarÄ«t, un viss darbojas mÅ«su labā.

Bet ar to nepietiek, mums joprojām ir jāsniedz dati lietotājam. VienkārŔākā ideja ir serializēt visu JSON, vienkārÅ”i, divās rindās. Mēs pieŔķiram satura veidu, mēs pieŔķiram JSON.

Bet ir viena grÅ«tÄ«ba: lietotājs nevēlas lasÄ«t JSON. Mums ir jāpiesaista priekÅ”gala izstrādātāji. Dažreiz mēs nevēlamies to darÄ«t sākumā. Un SEO speciālisti teiks, ja mēs meklējam attēlus, tad viņiem tas nav svarÄ«gi. Un, ja mēs viņiem pieŔķirsim saturu, viņi teiks, ka mÅ«su meklētājprogrammas neko neindeksē.

Ko darÄ«t ar to? Protams, lietotājam dosim HTML. Ar roku Ä£enerÄ“Å”ana nav nekas neparasts, tāpēc mēs vēlamies izmantot veidnes. Tam ir bibliotēka lua-resty-template.

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

JÅ«s droÅ”i vien esat redzējuÅ”i trÄ«s biedējoÅ”us burtus OPM. OpenResty ir aprÄ«kots ar savu pakotņu pārvaldnieku, caur kuru varat instalēt virkni dažādu moduļu, jo Ä«paÅ”i, lua-resty-template. Å is ir vienkārÅ”s veidņu dzinējs, kas lÄ«dzÄ«gs Django veidnēm. Tur jÅ«s varat rakstÄ«t kodu un veikt mainÄ«go aizstāŔanu.

Rezultātā viss izskatÄ«sies apmēram Ŕādi:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Mēs paņēmām datus un atveidojām veidni, atkal divās rindās. Lietotājs ir apmierināts, viņŔ saņēma kaÄ·us. Tā kā pieprasÄ«jumu paplaÅ”inājām, viņŔ saņēma arÄ« kažoku kažokādu. Nekad nevar zināt, varbÅ«t viņŔ meklēja tieÅ”i to, bet nevarēja pareizi formulēt savu lÅ«gumu.

Viss ir forÅ”i, taču mēs esam izstrādes stadijā un vēl nevēlamies to rādÄ«t lietotājiem. IzdarÄ«sim autorizāciju. Lai to izdarÄ«tu, apskatÄ«sim, kā NGINX apstrādā pieprasÄ«jumu OpenResty izteiksmē:

  • Pirmā fāze - pieeja, kad lietotājs tikko ieradās, un mēs viņu aplÅ«kojām pēc galvenēm, pēc IP adreses un citiem datiem. Mēs varam to nekavējoties pārtraukt, ja mums tas nepatÄ«k. To var izmantot autorizācijai, vai, ja saņemam daudz pieprasÄ«jumu, mēs varam tos vienkārÅ”i pārtraukt Å”ajā posmā.
  • pārrakstÄ«t. Mēs pārrakstām dažus pieprasÄ«juma datus.
  • saturs. Mēs piegādājam saturu lietotājam.
  • galvenes filtrs. Mēs nomainām atbilžu galvenes. Ja mēs izmantotu proxy_pass, mēs varam pārrakstÄ«t dažas galvenes pirms tās pieŔķirÅ”anas lietotājam.
  • Ä·ermeņa filtrs. Mēs varam mainÄ«t Ä·ermeni.
  • log ā€” mežizstrāde. JÅ«s varat rakstÄ«t žurnālus elasticearch bez papildu slāņa.

MÅ«su autorizācija izskatÄ«sies apmēram Ŕādi:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Mēs pievienosim Å”o location, kuru mēs aprakstÄ«jām iepriekÅ”, un ievietojiet tur Ŕādu kodu:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Mēs skatāmies, vai mums ir sīkdatnes marķieris. Ja nē, tad mēs lūdzam atļauju. Lietotāji ir viltīgi un var uzminēt, ka viņiem ir jāiestata sīkfaila marķieris. Tāpēc mēs to ievietosim arī Redis:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Kods darbam ar Redis ir ļoti vienkārÅ”s un neatŔķiras no citām valodām. Tajā paŔā laikā visa ievade/izvade Å”eit un tur netiek bloķēta. Ja rakstāt sinhrono kodu, tas darbojas asinhroni. GandrÄ«z kā gevents, bet paveikts labi.

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Veiksim paŔu autorizāciju:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Mēs sakām, ka mums ir jāizlasa pieprasÄ«juma pamatteksts. Mēs saņemam POST argumentus un pārbaudām, vai pieteikÅ”anās un parole ir pareiza. Ja tie ir nepareizi, mēs izaicinām jÅ«s, lai saņemtu atļauju. Un, ja tas ir pareizi, ierakstiet tokenu Redis:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Neaizmirstiet iestatīt sīkfailu, tas tiek darīts arī divās rindās:

OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Piemērs ir vienkārÅ”s un spekulatÄ«vs. Protams, mēs netaisÄ«sim servisu, kas rāda cilvēkiem kaÄ·us. Bet kas mÅ«s pazÄ«st. Tāpēc apskatÄ«sim, ko var izdarÄ«t ražoÅ”anā.

  • Minimālistiska aizmugure. Dažreiz mums ir jāievada tikai nedaudz datu aizmugursistēmai: kaut kur jāievieto datums, kaut kur jāparāda saraksts, jāpasaka, cik lietotāju paÅ”laik ir vietnē, jāpievieno skaitÄ«tājs vai statistika. Kaut kas tik mazs. Dažus minimālos gabalus var izgatavot ļoti vienkārÅ”i. Tas padarÄ«s to ātri, vienkārÅ”i un lieliski.
  • Datu priekÅ”apstrāde. Dažreiz mēs vēlamies iegult reklāmu savā lapā, un mēs saņemam Å”o reklāmu, izmantojot API pieprasÄ«jumus. Å eit to ir ļoti viegli izdarÄ«t. Neuzlādējam savu aizmuguri, kas jau sēž un smagi strādā. JÅ«s varat to paņemt un savākt Å”eit. Mēs varam bruģēt dažus JS vai, gluži pretēji, to atsaistÄ«t un kaut ko iepriekÅ” apstrādāt, pirms to nododam lietotājam.
  • Fasāde mikroservisam. Å is arÄ« ir ļoti labs gadÄ«jums, es to Ä«stenoju. Pirms tam strādāju uzņēmumā Tenzor, kas nodarbojas ar elektronisko pārskatu sagatavoÅ”anu un nodroÅ”ina atskaites aptuveni pusei valsts juridisko personu. Mēs izveidojām pakalpojumu, daudzas lietas tika veiktas, izmantojot vienu un to paÅ”u mehānismu: marÅ”rutÄ“Å”ana, autorizācija un daudz kas cits.
    OpenResty var izmantot kā lÄ«mi jÅ«su mikropakalpojumiem, nodroÅ”inot vienotu piekļuvi visam un vienu saskarni. Tā kā mikropakalpojumus var rakstÄ«t tā, ka jums ir Node.js Å”eit, PHP Å”eit, Python Å”eit, kaut kāda Erlang lieta, mēs saprotam, ka mēs nevēlamies pārrakstÄ«t vienu un to paÅ”u kodu visur. Tāpēc OpenResty var pievienot priekÅ”pusē.

  • Statistika un analÄ«tika. Parasti NGINX atrodas pie ieejas, un visi pieprasÄ«jumi tiek nosÅ«tÄ«ti caur to. TieÅ”i Å”ajā vietā ir ļoti ērti savākt. Varat uzreiz kaut ko aprēķināt un kaut kur augÅ”upielādēt, piemēram, Elasticsearch, Logstash, vai vienkārÅ”i ierakstÄ«t žurnālā un pēc tam kaut kur nosÅ«tÄ«t.
  • Daudzlietotāju sistēmas. Piemēram, tieÅ”saistes spēles ir arÄ« ļoti labas. Å odien Keiptaunā Aleksandrs GladiÅ”s runās par to, kā ātri izveidot vairāku spēlētāju spēles prototipu, izmantojot OpenResty.
  • PieprasÄ«jumu filtrÄ“Å”ana (WAF). Tagad ir modē veidot visu veidu tÄ«mekļa lietojumprogrammu ugunsmÅ«rus, ir daudz pakalpojumu, kas tos nodroÅ”ina. Izmantojot OpenResty, varat izveidot sev tÄ«mekļa lietojumprogrammu ugunsmÅ«ri, kas vienkārÅ”i un viegli filtrēs pieprasÄ«jumus atbilstoÅ”i jÅ«su prasÄ«bām. Ja tev ir Python, tad tu saproti, ka PHP tev noteikti netiks iepludināts, ja vien, protams, tu to nekur no konsoles nepanesÄ«si. JÅ«s zināt, ka jums ir MySQL un Python. Iespējams, viņi varētu mēģināt veikt kādu direktoriju ŔķērsoÅ”anu un kaut ko ievadÄ«t datu bāzē. Tāpēc jÅ«s varat ātri un lēti filtrēt dÄ«vainus vaicājumus tieÅ”i priekÅ”pusē.
  • Kopiena. Tā kā OpenResty ir veidots uz NGINX, tam ir bonuss - Å”is NGINX kopiena. Tas ir ļoti liels, un NGINX kopiena jau ir atrisinājusi pienācÄ«gu daļu no jautājumiem, kas jums vispirms radÄ«sies.

    Lua izstrādātāji. Vakar runāju ar puiÅ”iem, kuri ieradās uz HighLoad++ treniņu dienu un dzirdēja, ka Lua valodā ir rakstÄ«ts tikai Tarantool. Tā nav taisnÄ«ba, daudz kas ir rakstÄ«ts lua valodā. Piemēri: OpenResty, Prosody XMPP serveris, Love2D spēļu dzinējs, Lua skripts Warcraft un citur. Lua izstrādātāju ir daudz, viņiem ir liela un atsaucÄ«ga kopiena. Visi mani Lua jautājumi tika atrisināti dažu stundu laikā. Kad tu raksti uz adresātu sarakstu, burtiski dažu minÅ«Å”u laikā jau ir virkne atbilžu, kas apraksta, kas un kā, kas ir kas. Tas ir lieliski. Diemžēl Ŕāda laipna, garÄ«ga kopiena nav visur.
    Ir pieejams GitHub for OpenResty, kurā varat atvērt problēmu, ja kaut kas ir bojāts. Google grupās ir adresātu saraksts, kurā varat apspriest vispārÄ«gus jautājumus, ir adresātu saraksts Ä·Ä«nieÅ”u valodā ā€” jÅ«s nekad nezināt, varbÅ«t jÅ«s nerunājat angliski, bet jÅ«s zināt Ä·Ä«nieÅ”u valodu.

Rezultāti

  • Es ceru, ka varēju pateikt, ka OpenResty ir ļoti ērts ietvars, kas pielāgots tÄ«meklim.
  • Tam ir zema barjera ienākÅ”anai, jo kods ir lÄ«dzÄ«gs tam, ko mēs rakstām, valoda ir diezgan vienkārÅ”a un minimālistiska.
  • Tas nodroÅ”ina asinhronu I/O bez atzvanÄ«Å”anas, mums nebÅ«s tādu nÅ«deļu, kā mēs dažreiz varam rakstÄ«t NodeJS.
  • To ir viegli izvietot, jo mums ir nepiecieÅ”ams tikai NGINX ar nepiecieÅ”amo moduli un mÅ«su kodu, un viss darbojas uzreiz.
  • Liela un atsaucÄ«ga kopiena.

SÄ«kāk nestāstÄ«ju, kā notiek marÅ”rutÄ“Å”ana, tas izrādÄ«jās ļoti garÅ” stāsts.

Š”ŠæŠ°ŃŠøŠ±Š¾ Š·Š° Š²Š½ŠøŠ¼Š°Š½ŠøŠµ!


Vladimirs Protasovs - OpenResty: pārvērÅ”ot NGINX par pilnvērtÄ«gu lietojumprogrammu serveri

Avots: www.habr.com

Pievieno komentāru