Atkal publicÄjam konferences ziÅojuma stenogrammu
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:
Å 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:
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:
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.
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:
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:
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:
Å 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
.
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:
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
.
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:
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:
MÄs pievienosim Å”o location
, kuru mÄs aprakstÄ«jÄm iepriekÅ”, un ievietojiet tur Å”Ädu kodu:
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:
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.
Veiksim paÅ”u autorizÄciju:
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:
Neaizmirstiet iestatÄ«t sÄ«kfailu, tas tiek darÄ«ts arÄ« divÄs rindÄs:
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.
Š”ŠæŠ°ŃŠøŠ±Š¾ Š·Š° Š²Š½ŠøŠ¼Š°Š½ŠøŠµ!
Avots: www.habr.com