OpenResty: ngarobah NGINX kana server aplikasi pinuh

OpenResty: ngarobah NGINX kana server aplikasi pinuhKami deui nyebarkeun transkrip laporan konperénsi HighLoad ++ 2016, anu lumangsung di Skolkovo deukeut Moscow on November 7-8 taun ka tukang. Vladimir Protasov ngajelaskeun kumaha carana manjangkeun fungsionalitas NGINX sareng OpenResty sareng Lua.

Halo sadayana, nami abdi Vladimir Protasov, abdi damel di Parallels. Kuring gé ngabejaan Anjeun saeutik ngeunaan diri. Kuring méakkeun tilu suku hirup kuring nulis kode. Kuring jadi programmer ka inti dina rasa literal: sakapeung kuring ningali kode dina impian kuring. Saparapat kahirupan nyaéta pamekaran industri, nyerat kode anu langsung kana produksi. Kode anu dianggo ku sababaraha anjeun tapi henteu sadar.

Ku kituna anjeun ngartos kumaha goréng éta. Nalika kuring masih SMP, kuring sumping sareng dibéré database dua terabyte ieu. Ieu beban tinggi pikeun dulur di dieu ayeuna. Kuring angkat ka konperénsi sareng naros: "Guys, wartosan kuring, anjeun gaduh data ageung, naha sadayana saé? Sabaraha basa anjeun gaduh di dinya? Aranjeunna ngajawab kuring: "Kami gaduh 100 gigabyte!" Ceuk kuring: "Keren, 100 gigabyte!" Na kuring mikir sorangan kumaha taliti ngajaga poker raray. Anjeun pikir, nuhun, éta guys anu tiis, lajeng anjeun balik sarta tinker kalawan database multi-terabyte ieu. Sareng ieu janten SMP. Naha anjeun tiasa ngabayangkeun naon niup ieu?

Kuring terang langkung ti 20 basa pamrograman. Ieu mangrupikeun hal anu kuring kedah terang nalika kuring damel. Aranjeunna masihan anjeun kode dina Erlang, C, C ++, Lua, Python, Ruby, hal sejenna, jeung anjeun kudu motong sadayana. Sacara umum, kuring kungsi. Ieu teu mungkin keur ngitung jumlah pasti, tapi tempat sabudeureun 20th angka ieu leungit.

Kusabab sadayana anu hadir terang naon Parallels sareng naon anu urang laksanakeun, kuring moal ngobrol ngeunaan kumaha keren kami sareng naon anu urang laksanakeun. Kuring ngan bakal ngabejaan Anjeun yen urang boga 13 kantor di sakuliah dunya, leuwih ti 300 pagawé, ngembangkeun di Moscow, Tallinn na Malta. Upami anjeun hoyong, anjeun tiasa nyandak sareng ngalih ka Malta upami tiis dina usum tiis sareng anjeun kedah ngahaneutan tonggong.

Husus, departemén kami nyerat dina Python 2. Kami dina bisnis jeung teu boga waktu pikeun nerapkeun téknologi fashionable, jadi urang sangsara. Urang make Django sabab boga sagalana, sarta kami nyandak naon teu perlu jeung threw eta jauh. Ogé MySQL, Redis sareng NGINX. Urang ogé boga loba hal cool séjén. Kami ngagaduhan MongoDB, kami gaduh kelenci ngajalankeun, kami gaduh sadayana - tapi éta sanés milik kuring, sareng kuring henteu ngalakukeunana.

OpenResty

Kuring ngawartoskeun ngeunaan diri. Hayu urang terang naon anu bakal kuring bahas dinten ieu:

  • Naon OpenResty sareng naon anu didahar?
  • Naha reinvent sejen kabayang lamun urang boga Python, NodeJS, PHP, Go jeung hal cool séjén yén dulur senang jeung?
  • Jeung sababaraha conto tina kahirupan. Kuring kungsi motong laporan pisan sabab butuh kuring 3,5 jam, jadi bakal aya sababaraha conto.

OpenResty nyaéta NGINX. Hatur nuhun ka anjeunna, kami gaduh pangladén wéb anu lengkep anu ditulis sareng gancang dianggo. Jigana lolobana urang ngagunakeun NGINX dina produksi. Anjeun terang anjeunna gancang sareng keren. Aranjeunna ngadamel I / O sinkron tiis di dinya, ku kituna urang teu perlu siklus nanaon, kawas aranjeunna gevent di Python. Gevent nyaeta cool, hébat, tapi lamun nulis kode C jeung hal mana anu salah, lajeng kalawan Gevent anjeun bakal balik gélo debugging eta. Kuring ngagaduhan pangalaman: butuh dua dinten sadayana pikeun terang naon anu salah di dinya. Upami aya anu henteu ngali sababaraha minggu, mendakan masalahna, nyerat dina Internét, sareng Google henteu mendakanana, maka urang bakal janten gélo.

NGINX parantos ngalaksanakeun cache sareng eusi statik. Anjeun teu perlu salempang ngeunaan kumaha carana ngalakukeun ieu humanly, ku kituna anjeun teu ngalambatkeun turun wae, ku kituna anjeun teu leungit deskriptor wae. Nginx pisan merenah pikeun nyebarkeun, anjeun teu kudu mikir ngeunaan naon nu kudu - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx dipasang, dipasihkeun ka admin, aranjeunna terang kumaha damelna. Nginx ngolah pamundut ku cara terstruktur. Kuring gé ngobrol ngeunaan ieu saeutik engké. Pondokna, éta ngagaduhan fase nalika nampi pamenta, nalika ngolah éta, sareng nalika nyayogikeun kontén ka pangguna.

Nginx téh tiis, tapi aya hiji masalah: teu cukup fléksibel, malah ku sakabeh fitur tiis nu guys geus crammed kana config, sanajan naon bisa ngonpigurasi. kakuatan ieu teu cukup. Éta pisan sababna naha guys ti Taobao, geus lila pisan, sigana kawas dalapan taun ka tukang, diwangun Lua kana eta. Naon anu masihan?

  • ukuran. Ieu leutik. LuaJIT masihan ngeunaan 100-200 kilobyte overhead memori sareng overhead kinerja minimal.
  • kagancangan. Interpreter LuaJIT caket sareng C dina seueur kaayaan, dina sababaraha kaayaan kaleungitan Java, di batur langkung unggul. Pikeun sawatara waktu eta dianggap kaayaan seni, kompiler JIT coolest. Ayeuna aya anu langkung tiis, tapi beurat pisan, contona, V8 anu sami. Sababaraha juru JS sareng Java HotSpot langkung gancang dina sababaraha titik, tapi di sababaraha tempat aranjeunna tetep leungit.
  • Gampang diajar. Upami Anjeun gaduh, sebutkeun, dasar kode Perl, na anjeun teu Booking, anjeun moal manggihan programer Perl. Kusabab aranjeunna henteu aya, aranjeunna sadayana dicandak, sareng ngajarkeun aranjeunna panjang sareng sesah. Upami anjeun hoyong programer pikeun hal anu sanés, anjeun ogé kedah ngalatih deui atanapi milarianana. Dina kasus Lua, sagalana basajan. Sakur SMP tiasa diajar Lua dina tilu dinten. Butuh waktu kuring ngeunaan dua jam pikeun manggihan eta. Dua jam ti harita kuring parantos nyerat kode dina produksi. Sakitar saminggu saatos anjeunna langsung ka produksi sareng angkat.

Hasilna, kasampak kawas kieu:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Aya seueur di dieu. OpenResty parantos ngumpulkeun seueur modul, boh luash sareng mesin. Sareng anjeun parantos siap sadayana - disebarkeun sareng damel.

conto

Cukup lirikna, hayu urang teraskeun kana kodeu. Ieu sakedik Hello World:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Aya naon? Ieu mangrupikeun lokasi Engins. Kami henteu hariwang, kami henteu nyerat rute kami sorangan, kami henteu nyandak anu siap-siap - kami parantos ngagaduhan di NGINX, kami hirup anu saé sareng puguh.

content_by_lua_block mangrupakeun blok nu nyebutkeun yen urang ngalayanan eusi maké Aksara Lua. Kami nyandak variabel Engins remote_addr teras lebetkeun string.format. Ieu sarua jeung sprintf, ngan di Lua, ngan bener. Sarta kami masihan ka klien.

Hasilna, bakal kasampak kawas kieu:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Tapi hayu urang balik deui ka alam nyata. Teu aya anu nyebarkeun Hello World kana produksi. Aplikasi kami biasana angkat ka pangkalan data atanapi di tempat sanés sareng seueur waktos ngantosan réspon.

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Anjeunna ngan sits na waits. Éta henteu saé pisan. Nalika 100.000 pangguna sumping, éta hésé pisan pikeun urang. Ku kituna hayu urang ngagunakeun aplikasi basajan sabagé conto. Urang bakal néangan gambar, contona, ucing. Tapi urang moal ngan neangan, urang bakal dilegakeun kecap konci na, lamun pamaké searched pikeun "anak ucing," urang bakal manggihan ucing, ucing furry, jeung saterusna. Kahiji, urang kudu meunang data pamundut on backend nu. Sigana mah kieu:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Dua garis ngidinan Anjeun pikeun nyokot parameter GET, euweuh komplikasi. Salajengna, hayu urang nyebutkeun, ti database kalawan tanda pikeun keyword sarta extension, urang ménta inpo ieu ngagunakeun query SQL biasa. Ieu basajan. Sigana mah kieu:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Nyambungkeun perpustakaan resty.mysql, anu kami parantos aya dina kit. Urang teu kudu install nanaon, sagalana geus siap. Kami nunjukkeun kumaha nyambungkeun sareng ngadamel pamundut SQL:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Ieu rada pikasieuneun di dieu, tapi sagalana jalan. Di dieu 10 nyaéta watesna. Urang tarik kaluar 10 éntri, urang geus puguh, urang teu hayang nembongkeun leuwih. Kuring poho ngeunaan wates dina SQL.

Salajengna urang manggihan gambar pikeun sakabéh queries. Urang ngumpulkeun kebat tina requests sarta eusian kaluar tabel Lua disebut reqs, sarta kami ngalakukeun ngx.location.capture_multi.

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Kabéh requests ieu dikirim dina paralel, sarta jawaban anu balik ka kami. Waktu operasi sarua jeung waktu respon nu slowest. Lamun urang sadayana némbak dina 50 milliseconds, sarta kami dikirim saratus requests, lajeng urang bakal nampa jawaban dina 50 milliseconds.

Kusabab urang geus puguh na teu hayang nulis HTTP na cache penanganan, urang bakal nyieun NGINX ngalakukeun sagalana pikeun urang. Sakumaha anjeun tingali, aya pamundut url/fetch, ieu anjeunna:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Urang nyieun basajan proxy_pass, kami nunjukkeun dimana cache, kumaha ngalakukeunana, sareng sadayana tiasa dianggo pikeun kami.

Tapi ieu teu cukup, urang masih kedah masihan data ka pamaké. Gagasan pangbasajanna nyaéta pikeun sérial sadayana dina JSON, gampang, dina dua garis. Urang masihan Kandungan-Tipe, urang masihan JSON.

Tapi aya hiji kasusah: pamaké teu hayang maca JSON. Urang kedah narik pamekar hareup-tungtung. Sakapeung urang henteu hoyong ngalakukeun ieu heula. Sareng spesialis SEO bakal nyarios yén upami urang milarian gambar, maka éta henteu masalah pikeun aranjeunna. Tur upami urang masihan aranjeunna sababaraha eusi, maranéhna bakal disebutkeun yen mesin pencari kami teu indéks nanaon.

Naon anu kudu dipigawé ngeunaan eta? Tangtu, urang bakal masihan pamaké HTML. Ngahasilkeun ku leungeun henteu comme il faut, janten urang hoyong nganggo témplat. Aya perpustakaan pikeun ieu lua-resty-template.

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Anjeun meureun geus katempo tilu hurup pikasieuneun OPM. OpenResty hadir sareng manajer pakét sorangan, dimana anjeun tiasa masang sakumpulan modul anu béda, khususna, lua-resty-template. Ieu mesin template basajan, sarupa jeung témplat Django. Di dinya anjeun tiasa nyerat kode sareng ngalaksanakeun substitusi variabel.

Hasilna, sagalana bakal kasampak kawas kieu:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Urang nyokot data jeung rendered template, deui dina dua garis. pamaké éta senang, manéhna narima ucing. Kusabab urang ngalegaan pamundut, anjeunna ogé nampi segel bulu pikeun anak ucing. Anjeun pernah nyaho, meureun anjeunna pilari persis ieu, tapi teu bisa ngarumuskeun pamundut na leres.

Sagalana keren, tapi kami nuju ngembangkeun sareng henteu acan hoyong nunjukkeun ka pangguna. Hayu urang ngalakukeun otorisasina. Jang ngalampahkeun ieu, hayu urang tingali kumaha NGINX nanganan pamundut dina istilah OpenResty:

  • Fase kahiji - aksés, lamun pamaké kakara anjog, sarta kami nempo manehna ku headers, ku alamat IP, sarta ku data lianna. Urang tiasa langsung motong éta upami urang henteu resep. Ieu tiasa dianggo pikeun otorisasina, atanapi upami kami nampi seueur pamenta, urang tiasa gampang motong aranjeunna dina fase ieu.
  • nulis balik. Urang nulis ulang sababaraha data pamundut.
  • eusi. Urang nganteurkeun eusi ka pamaké.
  • saringan headers. Urang ngaganti headers respon. Lamun urang dipaké proxy_pass, urang bisa nulis balik sababaraha headers saméméh masihan ka pamaké.
  • saringan awak. Urang bisa ngarobah awak.
  • log - logging. Anjeun tiasa nyerat log dina elasticsearch tanpa lapisan tambahan.

Otorisasina urang bakal katingali sapertos kieu:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Kami bakal nambihan ieu kana éta location, anu ku urang dijelaskeun sateuacanna, sareng nempatkeun kodeu di handap ieu:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Urang neuteup ka tingali lamun urang boga token cookie. Lamun henteu, mangka urang ménta otorisasina. Pamaké licik sareng tiasa nebak yén aranjeunna kedah nyetél token cookie. Ku alatan éta, urang ogé bakal nempatkeun dina Redis:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Kodeu pikeun gawé bareng Redis saderhana pisan sareng henteu béda ti basa sanés. Dina waktos anu sami, sadaya input / output, di ditu di dieu, henteu ngahalangan. Lamun anjeun nulis kode sinkron, gawéna asynchronously. Ampir kawas gevent, tapi dipigawé ogé.

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Hayu urang ngalakukeun otorisasina sorangan:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Urang nyebutkeun yén urang kudu maca awak pamundut teh. Kami nampi argumen POST sareng pariksa yén login sareng kecap akses leres. Upami aranjeunna henteu leres, maka kami tangtangan anjeun pikeun otorisasi. Sareng upami leres, teras nyerat token dina Redis:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

Tong hilap nyetél cookie, ieu ogé dilakukeun dina dua garis:

OpenResty: ngarobah NGINX kana server aplikasi pinuh

conto basajan tur spekulatif. Tangtu, urang moal nyieun layanan nu nembongkeun jalma ucing. Tapi saha anu terang urang. Janten hayu urang langkung seueur naon anu tiasa dilakukeun dina produksi.

  • Backend minimalis. Kadang-kadang urang kudu kaluaran ngan saeutik data ka backend nu: tempat urang kudu nyelapkeun tanggal hiji, tempat urang kudu nembongkeun daptar, sebutkeun sabaraha pamaké dina loka ayeuna, ngagantelkeun hiji counter atawa statistik. Hal jadi leutik. Sababaraha potongan minimal tiasa dilakukeun kalayan gampang. Ieu bakal nyieun gancang, gampang jeung hébat.
  • Preprocessing data. Sakapeung urang hoyong nyelapkeun iklan kana halaman kami, sareng kami nampi iklan ieu nganggo pamundut API. Ieu pisan gampang pikeun ngalakukeun di dieu. Kami henteu ngamuat backend kami, anu parantos linggih sareng kerja keras. Anjeun tiasa nyandak sareng ngumpulkeun di dieu. Urang tiasa cobble babarengan sababaraha JS atanapi, Sabalikna, uncouple dinya tur preprocess hal saméméh masihan ka pamaké.
  • Fasad pikeun microservice. Ieu ogé kasus anu saé pisan, kuring dilaksanakeun. Sateuacan éta, kuring damel di Tenzor, perusahaan anu ngurus laporan éléktronik sareng nyayogikeun laporan ka sakitar satengah badan hukum di nagara éta. Kami nyiptakeun jasa, seueur hal anu dilakukeun di dinya nganggo mékanisme anu sami: rute, otorisasi sareng seueur deui.
    OpenResty bisa dipaké salaku lem pikeun microservices anjeun, nyadiakeun aksés tunggal ka sagalana sarta panganteur tunggal. Kusabab microservices bisa ditulis dina cara sapertos nu gaduh Node.js dieu, PHP dieu, Python dieu, sababaraha hal Erlang dieu, urang ngarti yén urang teu hayang nulis balik kodeu sarua madhab. Ku alatan éta, OpenResty bisa plugged kana hareup.

  • Statistik sareng analitik. Biasana NGINX aya di lawang, sareng sadaya pamundut ngalangkunganana. Di tempat ieu pisan merenah pikeun ngumpulkeun. Anjeun tiasa langsung ngitung hiji hal sareng unggah ka mana waé, contona, Elasticsearch, Logstash, atanapi ngan saukur nyerat kana log teras kirimkeun ka mana waé.
  • Sistem multi-pamaké. Contona, kaulinan online ogé pohara alus pikeun nyieun. Dinten di Cape Town, Alexander Gladysh bakal ngobrol ngeunaan kumaha gancang prototipe kaulinan multiplayer ngagunakeun OpenResty.
  • Nyaring Nyaring (WAF). Kiwari éta modis pikeun ngadamel sagala jinis firewall aplikasi wéb; aya seueur jasa anu nyayogikeunana. Nganggo OpenResty, anjeun tiasa ngadamel diri anjeun salaku firewall aplikasi wéb anu saderhana sareng gampang nyaring pamundut numutkeun sarat anjeun. Upami Anjeun gaduh Python, lajeng anjeun ngartos yen PHP pasti moal nyuntik kana anjeun, iwal, tangtosna, anjeun spawn eta mana ti konsol nu. Anjeun terang anjeun gaduh MySQL sareng Python. Panginten, aranjeunna tiasa nyobian ngalakukeun sababaraha jinis traversal diréktori sareng nyuntikkeun kana pangkalan data. Ku alatan éta, anjeun bisa nyaring kaluar queries aneh gancang tur murah katuhu di hareup.
  • Komunitas. Kusabab OpenResty diwangun dina NGINX, éta ngagaduhan bonus - ieu komunitas NGINX. Éta ageung pisan, sareng sabagéan anu santun tina patarosan anu anjeun bakal gaduh mimitina parantos direngsekeun ku komunitas NGINX.

    pamekar Lua. Kamari kuring ngobrol jeung guys anu datang ka HighLoad ++ dinten latihan jeung uninga yen ngan Tarantool ieu ditulis dina Lua. Ieu teu bener, loba hal anu ditulis dina Lua. Conto: OpenResty, server Prosody XMPP, mesin kaulinan Love2D, Lua scripted di Warcraft jeung tempat sejenna. Aya seueur pamekar Lua, aranjeunna gaduh komunitas anu ageung sareng responsif. Sadaya patarosan Lua kuring direngsekeun dina sababaraha jam. Nalika anjeun nyerat ka milis, sacara harfiah dina sababaraha menit parantos aya sababaraha réspon, ngajelaskeun naon sareng kumaha, naon naon. Éta saé. Hanjakalna, komunitas spiritual sapertos kitu henteu aya dimana-mana.
    Aya GitHub pikeun OpenResty, dimana anjeun tiasa muka masalah upami aya anu rusak. Aya milis dina Grup Google, dimana anjeun tiasa ngabahas masalah umum, aya milis dina basa Cina - anjeun henteu kantos terang, panginten anjeun henteu nyarios basa Inggris, tapi anjeun terang basa Cina.

hasil

  • Kuring miharep kuring bisa nepikeun yén OpenResty mangrupakeun kerangka pohara merenah tailored pikeun web.
  • Mibanda panghalang low pikeun asupna, saprak kode nu sarupa jeung naon urang nulis dina, basa anu cukup basajan tur minimalistic.
  • Eta nyadiakeun Asynchronous I / O tanpa callbacks, urang moal boga mie wae kawas urang kadang bisa nulis dina NodeJS.
  • Éta gaduh panyebaran anu gampang, sabab urang ngan ukur peryogi NGINX kalayan modul anu diperyogikeun sareng kode kami, sareng sadayana langsung jalan.
  • Komunitas ageung sareng responsif.

Kuring henteu nyarios sacara rinci kumaha routing dilakukeun, tétéla janten carita anu panjang pisan.

Hatur nuhun kanggo nengetan!


Vladimir Protasov - OpenResty: ngarobah NGINX kana server aplikasi pinuh

sumber: www.habr.com

Tambahkeun komentar