OpenResty: ngowahi NGINX dadi server aplikasi lengkap

OpenResty: ngowahi NGINX dadi server aplikasi lengkapKita maneh nerbitake transkrip laporan konferensi HighLoad++ 2016, sing ditindakake ing Skolkovo cedhak Moskow tanggal 7-8 November taun kepungkur. Vladimir Protasov nerangake carane ngluwihi fungsi NGINX karo OpenResty lan Lua.

Hello everyone, jenengku Vladimir Protasov, aku kerja ing Parallels. Aku bakal ngandhani sethithik babagan aku. Aku nglampahi telung kwartal gesang kawula nulis kode. Aku dadi programmer kanggo inti ing pangertèn harfiah: kadhangkala aku ndeleng kode ing impen. Seprapat umur yaiku pangembangan industri, nulis kode sing langsung dadi produksi. Kode sing sawetara sampeyan nggunakake nanging ora ngerti.

Supaya sampeyan ngerti carane ala iku. Nalika aku isih junior sethitik, Aku teka lan diwenehi iki database loro-terabyte. Beban dhuwur kanggo kabeh wong ing kene saiki. Aku lunga menyang konferensi lan takon: "Guys, ngomong, sampeyan duwe data gedhe, apa kabeh apik? Pira pangkalan sampeyan ing kana? Dheweke mangsuli aku: "Kita duwe 100 gigabyte!" Aku kandha: "Keren, 100 gigabyte!" Lan aku mikir dhewe carane kanggo njaga poker pasuryan. Sampeyan mikir, ya, wong lanang iku kelangan, banjur sampeyan bali lan tinker karo database multi-terabyte iki. Lan iki dadi junior. Bisa mbayangno apa jotosan iki?

Aku ngerti luwih saka 20 basa pamrograman. Iki soko aku kudu tokoh metu nalika aku makarya. Padha menehi kode ing Erlang, C, C ++, Lua, Python, Ruby, mergo, lan sampeyan kudu Cut kabeh. Umumé, aku kudu. Iku ora bisa kanggo ngetung nomer pas, nanging nang endi wae watara 20 nomer ilang.

Wiwit kabeh wong saiki ngerti apa Paralel lan apa sing ditindakake, aku ora bakal ngomong babagan kelangan lan apa sing ditindakake. Aku mung pitutur marang kowe sing kita duwe 13 kantor ing saindhenging donya, luwih saka 300 karyawan, pembangunan ing Moscow, Tallinn lan Malta. Yen sampeyan pengin, sampeyan bisa njupuk lan pindhah menyang Malta yen kadhemen ing mangsa lan sampeyan kudu anget bali.

Khusus, departemen kita nulis ing Python 2. Kita ana ing bisnis lan ora duwe wektu kanggo ngetrapake teknologi modern, mula kita nandhang sangsara. Kita nggunakake Django amarga duwe kabeh, lan njupuk apa sing ora perlu lan dibuwang. Uga MySQL, Redis lan NGINX. Kita uga duwe akeh liyane sing keren. Kita duwe MongoDB, kita duwe terwelu sing mlaku-mlaku, kita duwe kabeh - nanging dudu duweke, lan aku ora nindakake.

OpenResty

Aku ngomong babagan aku. Ayo ngerteni apa sing bakal dakkandhakake dina iki:

  • Apa OpenResty lan apa sing dipangan?
  • Apa reinvent liyane wheel nalika kita duwe Python, NodeJS, PHP, Go lan liyane iku kelangan sing everyone seneng?
  • Lan sawetara conto saka urip. Aku kudu ngilangi laporan kasebut amarga butuh 3,5 jam, mula bakal ana sawetara conto.

OpenResty yaiku NGINX. Thanks kanggo dheweke, kita duwe server web lengkap sing ditulis kanthi apik lan bisa digunakake kanthi cepet. Aku paling kita nggunakake NGINX ing produksi. Sampeyan kabeh ngerti dheweke cepet lan keren. Padha digawe kelangan sinkron I / O ing, supaya kita ora perlu siklus apa, kaya padha gevent ing Python. Gevent kelangan, gedhe, nanging yen sampeyan nulis kode C lan soko dadi salah, banjur karo Gevent sampeyan bakal edan debugging. Aku duwe pengalaman: butuh rong dina kanggo ngerteni apa sing salah ing kana. Yen wong wis ora ndudhuk watara kanggo sawetara minggu, ketemu masalah, wrote ing Internet, lan Google wis ora ketemu, banjur kita wis rampung edan.

NGINX wis nggawe caching lan konten statis. Sampeyan ora perlu sumelang ing bab carane nindakake iki manungsa, supaya sampeyan ora alon mudhun nang endi wae, supaya sampeyan ora kelangan deskriptor nang endi wae. Nginx trep banget kanggo disebarake, sampeyan ora perlu mikir babagan apa sing kudu ditindakake - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx wis diinstal, diwenehi admin, padha ngerti carane bisa karo. Nginx ngolah panjalukan kanthi cara terstruktur. Aku bakal ngomong babagan iki mengko. Ing cendhak, ana fase nalika mung nampa panjaluk kasebut, nalika diproses, lan nalika menehi konten menyang pangguna.

Nginx kelangan, nanging ana siji masalah: iku ora cukup fleksibel, malah karo kabeh fitur kelangan sing wong lanang crammed menyang config, senadyan apa bisa diatur. Daya iki ora cukup. Mulane wong-wong saka Taobao, biyen, kayane wolung taun kepungkur, mbangun Lua. Apa sing menehi?

  • ukuran. Iku cilik. LuaJIT menehi udakara 100-200 kilobyte overhead memori lan overhead kinerja minimal.
  • Kacepetan. Interpreter LuaJIT cedhak karo C ing pirang-pirang kahanan, ing sawetara kahanan kalah karo Jawa, ing liyane luwih unggul. Kanggo sawetara wektu iki dianggep minangka negara seni, kompiler JIT sing paling keren. Saiki ana sing luwih adhem, nanging abot banget, contone, V8 sing padha. Sawetara juru JS lan Java HotSpot luwih cepet ing sawetara titik, nanging ing sawetara panggonan isih kalah.
  • Gampang sinau. Yen sampeyan duwe, ngandika, basis kode Perl, lan sampeyan ora Booking, sampeyan ora bakal nemokake programer Perl. Amarga padha ora ana, kabeh padha dijupuk, lan mulang wong-wong mau dawa lan angel. Yen sampeyan pengin programer kanggo mergo, sampeyan uga kudu nglatih maneh utawa golek. Ing kasus Lua, kabeh gampang. Saben junior bisa sinau Lua sajrone telung dina. Butuh watara rong jam kanggo ngerti. Rong jam mengko aku wis nulis kode ing produksi. Kira-kira seminggu sabanjure dheweke langsung menyang produksi lan lunga.

Akibaté, katon kaya iki:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Ana akeh ing kene. OpenResty wis nglumpukake akeh modul, loro luash lan mesin. Lan sampeyan duwe kabeh siap - disebarake lan digunakake.

conto

Cukup lirik, ayo pindhah menyang kode. Punika Hello World sethitik:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

ana apa? Iki minangka lokasi Engins. Kita ora kuwatir, ora nulis rute dhewe, ora njupuk sing wis siap - kita wis duwe ing NGINX, urip sing apik lan kesed.

content_by_lua_block minangka blok sing ujar manawa kita ngladeni konten nggunakake skrip Lua. Kita njupuk variabel Engins remote_addr lan sijine ing string.format. Iku padha karo sprintf, mung ing Lua, mung bener. Lan kita menehi menyang klien.

Akibaté, bakal katon kaya iki:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Nanging ayo bali menyang jagad nyata. Ora ana sing ngirim Hello World menyang produksi. Aplikasi kita biasane menyang database utawa ing papan liya lan biasane ngenteni respon.

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Dheweke mung lungguh lan ngenteni. Iku ora apik banget. Nalika 100.000 pangguna teka, angel banget kanggo kita. Dadi ayo nggunakake aplikasi sing prasaja minangka conto. Kita bakal nggoleki gambar, contone, kucing. Nanging kita ora mung nggoleki, kita bakal nggedhekake tembung kunci lan, yen pangguna nggoleki "kucing", kita bakal nemokake kucing, kucing wulu, lan liya-liyane. Pisanan, kita kudu njaluk data panjalukan ing backend. Katon kaya mangkene:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Rong baris ngidini sampeyan njupuk paramèter GET, ora ana komplikasi. Sabanjure, ayo ngomong, saka database kanthi tandha kanggo tembung kunci lan ekstensi, kita entuk informasi iki nggunakake query SQL biasa. Iku prasaja. Katon kaya mangkene:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Nyambung perpustakaan resty.mysql, sing wis ana ing kit. Kita ora perlu nginstal apa-apa, kabeh wis siyap. Kita nuduhake carane nyambungake lan nggawe query SQL:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Iku sethitik medeni kene, nanging kabeh bisa. Kene 10 iku watesan. We narik metu 10 entri, kita kesed, kita ora pengin nuduhake liyane. Aku kelalen babagan watesan ing SQL.

Sabanjure kita nemokake gambar kanggo kabeh pitakon. We ngumpulake Bunch saka panjalukan lan isi metu Tabel Lua disebut reqs, lan kita nindakake ngx.location.capture_multi.

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Kabeh panjalukan iki dikirim ing podo karo, lan jawaban bali menyang kita. Wektu operasi padha karo wektu nanggepi sing paling alon. Yen kita kabeh njupuk ing 50 milliseconds, lan kita ngirim satus panjalukan, banjur kita bakal nampa jawaban ing 50 milliseconds.

Amarga kita kesed lan ora pengin nulis HTTP lan penanganan cache, kita bakal nggawe NGINX nindakake kabeh kanggo kita. Kaya sing sampeyan ngerteni, ana panjaluk url/fetch, iki dheweke:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Kita nggawe prasaja proxy_pass, kita nuduhake ngendi kanggo cache, carane nindakake, lan kabeh bisa kanggo kita.

Nanging iki ora cukup, kita isih kudu menehi data menyang pangguna. Ide paling gampang yaiku nggawe serial kabeh ing JSON, kanthi gampang, ing rong baris. We menehi Content-Type, kita menehi JSON.

Nanging ana siji kangelan: pangguna ora pengin maca JSON. Kita kudu narik pangembang ngarep. Kadhangkala kita ora pengin nindakake iki ing wiwitan. Lan spesialis SEO bakal ngomong yen kita nggoleki gambar, mula ora dadi masalah. Lan yen kita menehi sawetara isi, dheweke bakal ngomong yen mesin telusur kita ora ngindeks apa-apa.

Apa sing kudu ditindakake? Mesthi, kita bakal menehi HTML pangguna. Ngasilake kanthi tangan ora comme il faut, mula kita pengin nggunakake template. Ana perpustakaan kanggo iki lua-resty-template.

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Sampeyan mbokmenawa wis weruh telung huruf medeni OPM. OpenResty dilengkapi manajer paket dhewe, ing ngendi sampeyan bisa nginstal macem-macem modul, utamane, lua-resty-template. Iki minangka mesin cithakan sing prasaja, padha karo cithakan Django. Ing kana sampeyan bisa nulis kode lan nindakake substitusi variabel.

Akibaté, kabeh bakal katon kaya iki:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

We njupuk data lan render cithakan, maneh ing rong baris. Pangguna seneng, dheweke nampa kucing. Wiwit kita ngembangake panjaluk kasebut, dheweke uga nampa segel wulu kanggo anak kucing. Sampeyan ora ngerti, bisa uga dheweke nggoleki persis iki, nanging ora bisa ngrumusake panjaluke kanthi bener.

Kabeh iku kelangan, nanging kita lagi ing pembangunan lan ora pengin nuduhake menyang pangguna durung. Ayo nggawe wewenang. Kanggo nindakake iki, ayo goleki kepiye NGINX nangani panjaluk kasebut ing istilah OpenResty:

  • Fase pisanan - akses, nalika pangguna mung teka, lan kita nyawang dheweke kanthi header, alamat IP, lan data liyane. Kita bisa langsung ngilangi yen ora seneng. Iki bisa digunakake kanggo wewenang, utawa yen kita nampa akèh panjalukan, kita bisa gampang Cut mati ing phase iki.
  • nulis ulang. Kita nulis ulang sawetara data panyuwunan.
  • isi. Kita ngirim konten menyang pangguna.
  • saringan header. Kita ngganti header respon. Yen kita digunakake proxy_pass, kita bisa nulis ulang sawetara header sadurunge menehi menyang pangguna.
  • saringan awak. Kita bisa ngganti awak.
  • log - logging. Sampeyan bisa nulis log ing elasticsearch tanpa lapisan tambahan.

Wewenang kita bakal katon kaya iki:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Kita bakal nambah iki menyang sing location, sing wis diterangake sadurunge, lan sijine kode ing ngisor iki:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

We katon kanggo ndeleng yen kita duwe token cookie. Yen ora, banjur kita njaluk wewenang. Pangguna licik lan bisa ngira yen kudu nyetel token cookie. Mulane, kita uga bakal sijine ing Redis:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Kode kanggo nggarap Redis gampang banget lan ora beda karo basa liyane. Ing wektu sing padha, kabeh input / output, ing kene, ora diblokir. Yen sampeyan nulis kode sinkron, kerjane ora sinkron. Meh kaya gevent, nanging rampung kanthi apik.

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Ayo nggawe wewenang dhewe:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Kita ngomong yen kita kudu maca awak panyuwunan. Kita nampa argumen POST lan priksa manawa login lan sandhi wis bener. Yen padha salah, banjur kita tantangan sampeyan kanggo wewenang. Lan yen bener, banjur tulis token ing Redis:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Aja lali nyetel cookie, iki uga ditindakake ing rong baris:

OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Conto prasaja lan spekulatif. Mesthi, kita ora bakal nggawe layanan sing nuduhake wong kucing. Nanging sing ngerti kita. Dadi ayo goleki apa sing bisa ditindakake ing produksi.

  • Backend minimalis. Kadhangkala kita kudu output mung sethitik data menyang backend: nang endi wae kita kudu masang tanggal, nang endi wae kita kudu nampilake dhaftar, ngandika carane akeh pangguna ing situs saiki, masang counter utawa statistik. Soko cilik. Sawetara potongan minimal bisa digawe kanthi gampang. Iki bakal nggawe cepet, gampang lan apik.
  • Preprocessing data. Kadhangkala kita pengin nglebokake pariwara menyang kaca kita, lan kita nampa pariwara iki nggunakake panjaluk API. Iki gampang banget ditindakake ing kene. Kita ora mbukak backend kita, sing wis lungguh lan kerja keras. Sampeyan bisa njupuk lan ngumpulake ing kene. Kita bisa cobble bebarengan sawetara JS utawa, Kosok baline, uncouple lan preprocess soko sadurunge menehi kanggo pangguna.
  • Facade kanggo microservice. Iki uga kasus sing apik banget, aku ngetrapake. Sadurunge, aku kerja ing Tenzor, perusahaan sing ngurusi pelaporan elektronik lan nyedhiyakake laporan kanggo kira-kira setengah saka entitas hukum ing negara kasebut. Kita nggawe layanan, akeh perkara sing ditindakake kanthi nggunakake mekanisme sing padha: nuntun, wewenang lan liya-liyane.
    OpenResty bisa digunakake minangka lem kanggo layanan mikro sampeyan, nyedhiyakake akses siji menyang kabeh lan antarmuka siji. Wiwit microservices bisa ditulis ing kuwi cara sing duwe Node.js kene, PHP kene, Python kene, sawetara bab Erlang kene, kita ngerti sing kita ora pengin nulis ulang kode padha nang endi wae. Mulane, OpenResty bisa dipasang ing ngarep.

  • Statistik lan analytics. Biasane NGINX ana ing lawang mlebu, lan kabeh panjaluk ditindakake. Ing panggonan iki trep banget kanggo ngumpulake. Sampeyan bisa langsung ngetung soko lan upload nang endi wae, contone, Elasticsearch, Logstash, utawa mung nulis menyang log banjur ngirim nang endi wae.
  • Sistem multi pangguna. Contone, game online uga apik banget kanggo nggawe. Dina iki ing Cape Town, Alexander Gladysh bakal ngomong babagan carane nggawe prototipe game bebarengan kanthi cepet nggunakake OpenResty.
  • Nyaring Panjaluk (WAF). Saiki wis modis kanggo nggawe kabeh jinis firewall aplikasi web; ana akeh layanan sing nyedhiyakake. Nggunakake OpenResty, sampeyan bisa nggawe dhewe firewall aplikasi web sing gampang lan gampang nyaring panjalukan miturut syarat sampeyan. Yen sampeyan duwe Python, sampeyan ngerti yen PHP mesthi ora bakal disuntik menyang sampeyan, kajaba, mesthine sampeyan ngasilake ing ngendi wae saka konsol. Sampeyan ngerti sampeyan duwe MySQL lan Python. Mbokmenawa, dheweke bisa nyoba nindakake sawetara traversal direktori lan nyuntikake sesuatu menyang database. Mulane, sampeyan bisa nyaring pitakon aneh kanthi cepet lan murah ing ngarep.
  • Komunitas Wiwit OpenResty dibangun ing NGINX, wis bonus - iki komunitas NGINX. Iku gedhe banget, lan bagean prayoga saka pitakonan sing bakal duwe pisanan wis ditanggulangi dening masyarakat NGINX.

    pangembang Lua. Wingi aku ngobrol karo wong lanang sing teka ing dina latihan HighLoad ++ lan krungu yen mung Tarantool sing ditulis ing Lua. Iki ora bener, akeh sing ditulis ing Lua. Conto: OpenResty, server Prosody XMPP, mesin game Love2D, Lua skrip ing Warcraft lan liya-liyane. Ana akeh pangembang Lua, dheweke duwe komunitas sing gedhe lan responsif. Kabeh pitakonan Lua wis dirampungake sajrone sawetara jam. Nalika sampeyan nulis menyang milis, secara harfiah ing sawetara menit wis ana akeh tanggapan, nggambarake apa lan kepiye, apa apa. Apik banget. Sayange, komunitas spiritual sing kaya ngono ora ana ing endi-endi.
    Ana GitHub kanggo OpenResty, ing ngendi sampeyan bisa mbukak masalah yen ana sing rusak. Ana mailing list ing Google Groups, ing ngendi sampeyan bisa ngrembug masalah umum, ana milis ing basa Cina - sampeyan ora ngerti, bisa uga sampeyan ora nganggo basa Inggris, nanging sampeyan ngerti basa Cina.

Hasil

  • Muga-muga aku bisa ngandhani yen OpenResty minangka kerangka kerja sing trep banget kanggo web.
  • Wis alangi kurang kanggo entri, wiwit kode padha karo apa kita nulis ing, basa cukup prasaja lan minimalistic.
  • Nyedhiyakake I / O asinkron tanpa callback, kita ora bakal duwe mie kaya sing kadhangkala bisa ditulis ing NodeJS.
  • Panyebaran gampang, amarga kita mung butuh NGINX kanthi modul lan kode sing dibutuhake, lan kabeh bisa langsung.
  • Komunitas gedhe lan responsif.

Aku ora nyritakake kanthi rinci babagan carane routing rampung, dadi crita sing dawa banget.

Matur suwun!


Vladimir Protasov - OpenResty: ngowahi NGINX dadi server aplikasi lengkap

Source: www.habr.com

Add a comment