{"id":71378,"date":"2020-02-25T20:45:02","date_gmt":"2020-02-25T17:45:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij"},"modified":"2020-03-03T16:14:21","modified_gmt":"2020-03-03T13:14:21","slug":"openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","status":"publish","type":"post","link":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>M\u0113s atkal public\u0113jam konferences zi\u0146ojuma transkriptu <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016. gada 7.\u20148. novembr\u012b, kas norisin\u0101j\u0101s Skolkovo pie Maskavas. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimirs Protasovs<\/a><\/noindex> st\u0101sta, k\u0101 papla\u0161in\u0101t NGINX funkcionalit\u0101ti, izmantojot OpenResty un Lua.<\/em><\/p>\n<p>Sveiki visiem, mani sauc Vladimirs Protasovs, es str\u0101d\u0101ju Parallels. Nedaudz past\u0101st\u012b\u0161u par sevi. Tr\u012bs ceturtda\u013cas sava m\u016b\u017ea es veltu kod\u0113\u0161anai. Esmu k\u013cuvis par programm\u0113t\u0101ju l\u012bdz pat kauliem: reiz\u0113m sapn\u012b redzu kodu. Viena ceturtda\u013ca no dz\u012bves \u2014 industri\u0101l\u0101 izstr\u0101de, koda rakst\u012b\u0161ana, kas non\u0101k tie\u0161i produkcij\u0101. Kods, ko da\u017ei no jums izmanto, bet neiedom\u0101jas par to.<\/p>\n<p>Lai j\u016bs saprastu, cik slikti tas bija. Kad es biju jauni\u0146ais, es ierados, un man izsniedza divu terabaitu datu b\u0101zes. Tagad visi run\u0101 par highload. Es g\u0101ju uz konferenc\u0113m, jaut\u0101ju: \"Cilv\u0113ki, past\u0101stiet, jums ir big data, viss ir for\u0161i? Cik jums tur ir b\u0101zu?\" Man atbild\u0113ja: \"Mums ir 100 gigabaiti!\" Es teicu: \"For\u0161i, 100 gigabaiti!\" Bet dom\u0101ju par sevi, k\u0101 no\u0161aut sava pokera seju. Tu dom\u0101, j\u0101, pui\u0161i ir for\u0161i, bet tad atgrie\u017eas un centies tikt gal\u0101 ar \u0161\u012bm daudzu terabaitu datu b\u0101z\u0113m. Un tas \u2014 b\u016bdams jauni\u0146ais. Vai varat iedom\u0101ties, k\u0101ds tas bija trieciens?<\/p>\n<p>Es zinu vair\u0101k nek\u0101 20 programm\u0113\u0161anas valodas. Tas ir tas, kas man bija j\u0101apg\u016bst darba proces\u0101. Tev pasniedz kodu Erlang, C, C++, Lua, Python, Ruby un v\u0113l cit\u0101s valod\u0101s, un tev visam j\u0101str\u0101d\u0101. Kopum\u0101 esmu iem\u0101c\u012bjies. Prec\u012bzu skaitu sar\u0113\u0137in\u0101t neg\u016btos, bet kaut kur ap 20 skaitlis ir pazudis.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nT\u0101 k\u0101 visi kl\u0101teso\u0161ie zina, kas ir Parallels un ar ko m\u0113s nodarbojamies, es nerun\u0101\u0161u par to, cik for\u0161i esam un ko dar\u0101m. Es tikai past\u0101st\u012b\u0161u, ka mums ir 13 biroju vis\u0101 pasaul\u0113, vair\u0101k nek\u0101 300 darbinieku, izstr\u0101de Maskav\u0101, Tallin\u0101 un Malt\u0101. Ja ir v\u0113lme, var doties un p\u0101rcelties uz Maltu, ja ziem\u0101 ir auksti un j\u0101uzsilda mugura.<\/p>\n<p>Konkr\u0113ti m\u016bsu noda\u013ca raksta Python 2. M\u0113s nodarbojamies ar biznesu un mums nav laika ieviest modern\u0101s tehnolo\u0123ijas, t\u0101p\u0113c mums ir gr\u016bti. Mums ir Django, jo taj\u0101 ir viss, ko vajag, un nevajadz\u012bgo m\u0113s esam iz\u0146\u0113mu\u0161i. T\u0101pat ar\u012b MySQL, Redis un NGINX. Mums ir daudz citu for\u0161u lietu. Mums ir MongoDB, mums skraid\u0101m tru\u0161i, mums ir daudz ko tikai nav  \u2014 bet tas nav mans un es ar to nenodarbojos.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nPar sevi esmu past\u0101st\u012bjis. Apskat\u012bsim, par ko es \u0161odien run\u0101\u0161u:<\/p>\n<ul>\n<li>Kas ir OpenResty un k\u0101p\u0113c to izmantot?<\/li>\n<li>K\u0101p\u0113c izgatavot v\u0113l vienu velosip\u0113du, kad mums ir Python, NodeJS, PHP, Go un citas for\u0161as lietas, ar kur\u0101m visi ir apmierin\u0101ti?<\/li>\n<li>Un nedaudz piem\u0113ru no dz\u012bves. Man n\u0101c\u0101s stipri sa\u012bsin\u0101t savu prezent\u0101ciju, jo t\u0101 man izm\u0113ra 3,5 stundas, t\u0101p\u0113c piem\u0113ru b\u016bs maz.<\/li>\n<\/ul>\n<p>\nOpenResty ir NGINX. Grauzdams vi\u0146u, m\u0113s ieg\u016bstam pilnv\u0113rt\u012bgu t\u012bmek\u013ca serveri, kas ir labi uzrakst\u012bts un str\u0101d\u0101 \u0101tri. Es dom\u0101ju, ka vairums no mums izmanto NGINX ra\u017eo\u0161an\u0101. J\u016bs visi zin\u0101t, ka tas ir \u0101trs un for\u0161s. Taj\u0101 ir izveidota lieliska sinhron\u0101 ievade\/izvade, t\u0101p\u0113c mums nav j\u0101p\u0101rveido, t\u0101pat k\u0101 Python tas ir dar\u012bts ar gevent. Gevent ir for\u0161s, lielisks, bet, ja j\u016bs uzrakst\u012bsiet C kodu un kaut kas noies greizi, ar gevent j\u016bs sajuks pr\u0101t\u0101 to labojot. Man bija t\u0101da pieredze: vajadz\u0113ja divas dienas, lai saprastu, kas tur notika nepareizi. Ja k\u0101ds neiedzi\u013cin\u0101tos pirms tam p\u0101ris ned\u0113\u013cas, neatrastu probl\u0113mu, nenorakst\u012btu to internet\u0101 un Google to neatkl\u0101tu, m\u0113s visp\u0101r var\u0113tu apjukt.<\/p>\n<p>NGINX jau ir izveidota ke\u0161atmi\u0146a un statiskais saturs. Jums nav j\u0101uztraucas, k\u0101 to izdar\u012bt cilv\u0113ciski, lai kaut kur nesamulsin\u0101tu, lai j\u016bs kaut kur nezaud\u0113tu deskriptori. Nginx ir \u013coti \u0113rti izvietojams, jums nav j\u0101p\u0101rdom\u0101, ko \u0146emt - WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx uzst\u0101d\u012bts, administratoriem nodots, vi\u0146i zina, k\u0101 str\u0101d\u0101t ar to. Nginx struktur\u0113ti apstr\u0101d\u0101 piepras\u012bjumus. Par to nedaudz v\u0113l\u0101k past\u0101st\u012b\u0161u. \u012asum\u0101 tam ir f\u0101ze, kad tas tikai sa\u0146em piepras\u012bjumu, kad tas to apstr\u0101d\u0101 un kad nos\u016bta saturu lietot\u0101jam.<\/p>\n<p>Nginx ir for\u0161s, bet ir viena probl\u0113ma: tas nav pietiekami elast\u012bgs, pat ar vis\u0101m t\u0101m for\u0161\u0101m funkcij\u0101m, ko pui\u0161i ir ielikusi konfigur\u0101cij\u0101, neskatoties uz to, ka to var konfigur\u0113t. \u0160\u012b jauda ir nepietiekama. T\u0101p\u0113c Taobao pui\u0161i pirms asto\u0146iem gadiem ieb\u016bv\u0113ja tur Lua. Ko tas sniedz?<\/p>\n<ul>\n<li><strong>Izm\u0113rs<\/strong>. Tas ir mazs. LuaJIT nodro\u0161ina apm\u0113ram 100-200 kilobaitus atmi\u0146as p\u0101rkl\u0101juma un minim\u0101lu veiktsp\u0113jas p\u0101rkl\u0101jumu.<\/li>\n<li><strong>\u0100trums<\/strong>LuaJIT interpretators in many situations are close to C, in some situations they fall behind Java, and in others, they surpass it. For some time it was considered state of the art, an amazing JIT compiler. Now there are cooler options, but they are very heavy, for example, the same V8. Some JavaScript interpreters and the Java HotSpot are faster in some areas, but in certain places they still lag behind.<\/li>\n<li><strong>Vieglums apg\u016bt<\/strong>If you have, say, a codebase in Perl, and you are not Booking, you won't find Perl programmers. Because they are not available; everyone has taken them, and teaching them is long and difficult. If you're looking for programmers in something else, you might also have to retrain them or find completely new ones. With Lua, it's straightforward. Any junior can learn Lua in three days. It took me about two hours to understand it. After two hours, I was already writing production code. About a week later, it was directly deployed to production.<\/li>\n<\/ul>\n<p>\nAs a result, it looks like this:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nThere's a lot going on here. OpenResty has gathered a bunch of modules, both Lua and engine-specific. And you have everything ready \u2014 just deploy and it works.<\/p>\n<h1>Piem\u0113ri<\/h1>\n<p>\nEnough of the lyrical part, let's move on to the code. Here\u2019s a simple Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWhat do we have here? This is an engine-specific location. We don't stress, we don't write our own routing, we don't take someone else's ready-made \u2014 we already have it in NGINX, we're living well and lazily.<\/p>\n<p><code>content_by_lua_block<\/code> is a block that indicates that we are delivering content using a Lua script. We take the engine-specific variable <code>remote_addr<\/code> and inject it into <code>string.format<\/code>. This is the same as <code>sprintf<\/code>, but in Lua, and it's correct. And we deliver it to the client.<\/p>\n<p>As a result, it will look like this:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nBut let's return to the real world. No one deploys Hello World in production. Our application usually queries a database or somewhere else and spends most of its time waiting for a response.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIt simply sits and waits. This isn\u2019t very good. When 100,000 users come in, it becomes very hard for us. So let's create a simple application as an example. We will search for images, for instance, of cats. But we won\u2019t just search; we will expand the keywords and if a user searches for 'kittens', we will find them cats, fluffballs, and so on. First, we need to get the request data on the backend. It looks like this:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDivas rindas \u013cauj jums ieg\u016bt GET parametrus, nek\u0101du sare\u017e\u0123\u012bjumu. T\u0101 m\u0113s, pie\u0146emsim, no datub\u0101zes ar tabulu p\u0113c atsl\u0113gas v\u0101rda un papla\u0161in\u0101juma ieg\u016bstam \u0161o inform\u0101ciju, izmantojot parasto SQL vaic\u0101jumu. Viss ir vienk\u0101r\u0161i. Tas izskat\u0101s \u0161\u0101di:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPiesl\u0113dzam bibliot\u0113ku <code>resty.mysql<\/code>, kas mums jau ir komplekt\u0101. Mums nekas nav j\u0101instal\u0113, viss ir gatavs. Nor\u0101d\u0101m, k\u0101 piesl\u0113gties, un veicam SQL vaic\u0101jumu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u0160eit ir nedaudz bied\u0113jo\u0161i, bet viss str\u0101d\u0101. \u0160eit 10 \u2013 tas ir limits. M\u0113s ieg\u016bstam 10 ierakstus, m\u0113s esam slinki, negribam r\u0101d\u012bt vair\u0101k. Par limitu SQL es aizmirsu.<\/p>\n<p>T\u0101l\u0101k m\u0113s atrodam att\u0113lus visiem vaic\u0101jumiem. M\u0113s apkopojam virkni vaic\u0101jumu un aizpild\u0101m Lua tabulu, kas saucas <code>reqs<\/code>, un veicam <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVisi \u0161ie vaic\u0101jumi tiek izs\u016bt\u012bti paral\u0113li, un m\u0113s sa\u0146emam atbildes. Darba laiks ir vien\u0101ds ar l\u0113n\u0101k\u0101s atbildes laiku. Ja viss tiek izpild\u012bts 50 milisekund\u0113s un m\u0113s nos\u016bt\u012bj\u0101m simtu vaic\u0101jumu, tad atbilde ierad\u012bsies 50 milisekund\u0113s.<\/p>\n<p>T\u0101 k\u0101 m\u0113s esam slinki un negribam rakst\u012bt HTTP apstr\u0101di un ke\u0161\u0113\u0161anu, m\u0113s liksim NGINX visu izdar\u012bt m\u016bsu viet\u0101. K\u0101 j\u016bs redz\u0113j\u0101t, tur bija vaic\u0101jums uz <code>url\/fetch<\/code>, l\u016bk, tas:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nM\u0113s veicam vienk\u0101r\u0161u <code>proxy_pass<\/code>, nor\u0101dam, kur ke\u0161\u0113t, k\u0101 to izdar\u012bt, un viss darbojas.<\/p>\n<p>Bet t\u0101 nav pietiekami, mums v\u0113l ir j\u0101nodod dati lietot\u0101jam. Vienk\u0101r\u0161\u0101k\u0101 ideja ir visu serializ\u0113t JSON form\u0101t\u0101, viegli, div\u0101s rind\u0101s. Nododam Content-Type, nododam JSON.<\/p>\n<p>Bet ir viena gr\u016bt\u012bba: lietot\u0101jam negribas las\u012bt JSON. J\u0101iesaista front-end izstr\u0101d\u0101t\u0101ji. Da\u017ereiz mums negribas to s\u0101kum\u0101 dar\u012bt. Un SEO speci\u0101listi teiks, ka, ja m\u0113s mekl\u0113jam att\u0113lus, tad vi\u0146iem ir vienalga. Bet ja m\u0113s vi\u0146iem dodam k\u0101du saturu, tad vi\u0146i teiks, ka m\u016bsu mekl\u0113t\u0101ji neko neindeks\u0113.<\/p>\n<p>Ko ar to dar\u012bt? Pa\u0161saprotami, m\u0113s dosim lietot\u0101jam HTML. Pa\u0161u rok\u0101m \u0123ener\u0113t \u2013 nav stil\u012bgi, t\u0101p\u0113c m\u0113s gribam izmantot \u0161ablonus. Tam ir bibliot\u0113ka <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJ\u016bs, iesp\u0113jams, redz\u0113j\u0101t tr\u012bs bied\u0113jo\u0161as burti OPM. OpenResty n\u0101k ar savu pakot\u0146u p\u0101rvaldnieku, caur kuru var uzst\u0101d\u012bt v\u0113l virkni da\u017e\u0101du modu\u013cu, tostarp <code>lua-resty-template<\/code>. Tas ir vienk\u0101r\u0161s \u0161ablonu dzin\u0113js, l\u012bdz\u012bgs Django \u0161abloniem. Tur var uzrakst\u012bt kodu un veikt main\u012bgo ievieto\u0161anas.<\/p>\n<p>Rezult\u0101t\u0101 viss izskat\u012bsies aptuveni \u0161\u0101di:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nM\u0113s \u0146\u0113m\u0101m datus un iepriek\u0161\u0113j\u0101 reiz\u0113 izveidoj\u0101m veidni div\u0101s rind\u0101s. Lietot\u0101js ir apmierin\u0101ts, sa\u0146\u0113ma ka\u0137\u012b\u0161us. T\u0101 k\u0101 m\u0113s papla\u0161in\u0101j\u0101m piepras\u012bjumu, vi\u0146\u0161 sa\u0146\u0113ma ar\u012b j\u016bras lauvu. Varb\u016bt vi\u0146\u0161 tie\u0161i to mekl\u0113ja, bet nevar\u0113ja pareizi formul\u0113t savu piepras\u012bjumu.<\/p>\n<p>Viss ir lieliski, bet m\u0113s esam izstr\u0101d\u0113 un nev\u0113lamies \u0161obr\u012bd r\u0101d\u012bt lietot\u0101jiem. Izveidosim autentifik\u0101ciju. Lai to izdar\u012btu, apl\u016bkosim, k\u0101 NGINX apstr\u0101d\u0101 piepras\u012bjumus OpenResty terminos:<\/p>\n<ul>\n<li>Pirm\u0101 f\u0101ze \u2014 <strong>access<\/strong>, kad lietot\u0101js ir tikai ieradies, un m\u0113s uz vi\u0146u paskat\u012bj\u0101mies p\u0113c virsrakstiem, IP adreses un citiem datiem. Ja vi\u0146\u0161 mums nepat\u012bk, varam vi\u0146u nekav\u0113joties atsl\u0113gt. To var izmantot autentifik\u0101cijai, vai, ja mums n\u0101k \u013coti daudz piepras\u012bjumu, m\u0113s varam tos viegli izsl\u0113gt \u0161aj\u0101 f\u0101z\u0113.<\/li>\n<li><strong>rewrite<\/strong>. P\u0101rveidojam k\u0101dus piepras\u012bjuma datus.<\/li>\n<li><strong>content<\/strong>. Nododam saturu lietot\u0101jam.<\/li>\n<li><strong>headers filter<\/strong>. Aizvietojam atbildes virsrakstus. Ja m\u0113s esam izmantoju\u0161i <code>proxy_pass<\/code>, m\u0113s varam p\u0101rveidot k\u0101dus virsrakstus pirms to nodo\u0161anas lietot\u0101jam.<\/li>\n<li><strong>body filter<\/strong>. M\u0113s varam aizvietot \u0137ermeni.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 \u017eurn\u0101lfiks\u0113\u0161ana. Varam rakst\u012bt \u017eurn\u0101lus Elasticsearch bez papildu sl\u0101\u0146a.<\/li>\n<\/ul>\n<p>\nM\u016bsu autentifik\u0101cija izskat\u012bsies apm\u0113ram t\u0101:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nM\u0113s pievienosim to tam <code>location<\/code>, kuru m\u0113s iepriek\u0161 aprakst\u012bj\u0101m, un ieliksim tur \u0161\u0101du kodu:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nM\u0113s p\u0101rbaud\u0101m, vai mums ir cookie tokens. Ja nav, tad novirz\u0101m uz autentifik\u0101ciju. Lietot\u0101ji ir vilt\u012bgi un var uzmin\u0113t, ka j\u0101sak\u0101rto cookie tokens. T\u0101p\u0113c m\u0113s to v\u0113l noliksim Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDarba kods ar Redis ir \u013coti vienk\u0101r\u0161s un ne ar ko neat\u0161\u0137iras no cit\u0101m valod\u0101m. Turkl\u0101t visa ievade\/izvade, gan tur, gan \u0161eit, ir neblok\u0113jo\u0161a. Ja rakst\u0101t sinhrono kodu, tas darbojas asinkroni. P\u0101ris l\u012bdz\u012bgi k\u0101 ar gevent, tikai izdar\u012bts labi.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIzveidosim pa\u0161u autentifik\u0101ciju:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSak\u0101m, ka mums ir j\u0101lasa piepras\u012bjuma \u0137ermenis. Sa\u0146emam POST argumentus, p\u0101rbaud\u0101m, vai lietot\u0101jv\u0101rds un parole ir pareizi. Ja tie nav pareizi, tad novirz\u0101m uz autentifik\u0101ciju. Bet, ja tie ir pareizi, tad ierakst\u0101m token Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNeaizmirstiet uzst\u0101d\u012bt cookie, tas ar\u012b tiek izdar\u012bts div\u0101s rind\u0101s:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPiem\u0113rs ir vienk\u0101r\u0161s, teor\u0113tisks. M\u0113s, protams, neizveidosim pakalpojumu, kas r\u0101da cilv\u0113kiem ka\u0137\u012b\u0161us. Lai gan, kas m\u016bs zina. T\u0101p\u0113c apl\u016bkosim, ko var izdar\u012bt ra\u017eo\u0161an\u0101.<\/p>\n<ul>\n<li><strong>Minimalistisks aizmugur\u0113jais<\/strong>. Da\u017ereiz mums nepiecie\u0161ams izdot tikai pavisam nedaudz datu no backend \u2014 kur\u0101 viet\u0101 j\u0101ievieto datums, kur j\u0101par\u0101da k\u0101ds saraksts, j\u0101past\u0101sta, cik \u0161obr\u012bd lietot\u0101ju ir vietn\u0113, j\u0101pievieno skait\u012bt\u0101js vai statistika. Ko nedaudz t\u0101du. Minim\u0101lus elementus var paveikt \u013coti viegli. Tas b\u016bs \u0101tri, \u0113rti un lieliski.\n<\/li>\n<li><strong>Datu priek\u0161apstr\u0101de<\/strong>. Da\u017ereiz v\u0113lamies iek\u013caut m\u016bsu lap\u0101 rekl\u0101mu, un \u0161o rekl\u0101mu m\u0113s \u0146emam caur API piepras\u012bjumiem. To ir \u013coti viegli izdar\u012bt tie\u0161i \u0161eit. M\u0113s neapgr\u016btin\u0101m m\u016bsu backend, kur\u0161 t\u0101pat smagi str\u0101d\u0101. Varam \u0146emt un salikt \u0161eit. M\u0113s varam sal\u012bt k\u0101du JS vai, tie\u0161i otr\u0101di, to no\u0161\u0137elt, veikt noteiktu priek\u0161apstr\u0101di pirms nododam to lietot\u0101jam.\n<\/li>\n<li><strong>Fas\u0101de mikroservisam<\/strong>. Tas ir ar\u012b \u013coti labs gad\u012bjums, ko esmu realiz\u0113jis. Iepriek\u0161 es str\u0101d\u0101ju uz\u0146\u0113mum\u0101 Tenzor, kas nodarbojas ar elektronisko atskaites sagatavo\u0161anu, nodro\u0161inot atskaites aptuveni pusei juristu valst\u012b. M\u0113s izveidoj\u0101m pakalpojumu, kur\u0101, izmantojot \u0161o pa\u0161u meh\u0101nismu, tika izdar\u012btas daudz lietu: mar\u0161rutiz\u0101cija, autoriz\u0101cija un citi.<br \/>\nOpenResty var izmantot k\u0101 l\u012bmi j\u016bsu mikroservisiem, kas nodro\u0161in\u0101s vienotu piek\u013cuvi visam un vienotu interfeisu. T\u0101 k\u0101 mikroservisi var b\u016bt uzrakst\u012bti da\u017e\u0101d\u0101s valod\u0101s \u2014 \u0161eit ir Node.js, \u0161eit PHP, \u0161eit Python, un \u0161eit kaut kas uz Erlang \u2014 m\u0113s saprotam, ka negribam p\u0101rkop\u0113t to pa\u0161u kodu visur. T\u0101p\u0113c OpenResty var pievienot priek\u0161pus\u0113.<\/p>\n<\/li>\n<li><strong>Statistika un anal\u012btika<\/strong>. Parasti NGINX st\u0101v ieej\u0101, un visi piepras\u012bjumi iet caur to. Tie\u0161i \u0161aj\u0101 viet\u0101 ir \u013coti \u0113rti sav\u0101kt datus. Var kaut ko uzreiz apr\u0113\u0137in\u0101t un kaut kur nos\u016bt\u012bt, piem\u0113ram, uz Elasticsearch, Logstash vai vienk\u0101r\u0161i ierakst\u012bt \u017eurn\u0101l\u0101 un v\u0113l\u0101k nos\u016bt\u012bt kaut kur.\n<\/li>\n<li><strong>Vair\u0101ku lietot\u0101ju sist\u0113mas<\/strong>. Piem\u0113ram, tie\u0161saistes sp\u0113les ir ar\u012b \u013coti labi izveidot. \u0160odien Keiptaun\u0101 Aleksandrs Gladi\u0161s st\u0101st\u012bs, k\u0101 \u0101tri prototip\u0113t vair\u0101ku lietot\u0101ju sp\u0113li, izmantojot OpenResty.\n<\/li>\n<li><strong>Piepras\u012bjumu filtr\u0113\u0161ana (WAF)<\/strong>. Pa\u0161laik ir mod\u0113 veidot da\u017e\u0101dus web lietojumprogrammu ugunsm\u016brus, ir daudz pakalpojumu, kas tos pied\u0101v\u0101. Ar OpenResty var izveidot web lietojumprogrammu ugunsm\u016bru, kas vienk\u0101r\u0161i un viegli filtr\u0113s piepras\u012bjumus p\u0113c j\u016bsu pras\u012bb\u0101m. Ja jums ir Python, tad saprotat, ka PHP noteikti nenozags, ja vien to neizpild\u012bsiet no konsoles kaut kur. J\u016bs zin\u0101t, ka jums ir MySQL un Python. Dro\u0161i vien \u0161eit var\u0113tu m\u0113\u0123in\u0101t veikt k\u0101du direktorija travers\u0113\u0161anas uzbrukumu un kaut ko ievietot datub\u0101z\u0113. T\u0101d\u0113\u013c var \u0101tri un l\u0113ti filtr\u0113t b\u012bstamus piepras\u012bjumus tie\u0161i front\u0113.\n<\/li>\n<li><strong>Kopiena.<\/strong> T\u0101 k\u0101 OpenResty balst\u0101s uz NGINX, tam ir bonuss \u2014 tas <strong>NGINX kopiena<\/strong>. T\u0101 ir \u013coti liela, un iev\u0113rojama da\u013ca jaut\u0101jumu, kas jums rad\u012bsies s\u0101kum\u0101, jau ir atrisin\u0101ta NGINX kopienas.\n<p><strong>Lua izstr\u0101d\u0101t\u0101ji<\/strong>. Vakar run\u0101ju ar puik\u0101m, kuri ierad\u0101s uz m\u0101c\u012bbu dienu HighLoad++ un dzird\u0113ju, ka uz Lua ir uzrakst\u012bts tikai Tarantool. Tas t\u0101 nav, uz Lua ir uzrakst\u012bts daudz kas. Piem\u0113ri: OpenResty, XMPP serveris Prosody, sp\u0113\u013cu dzin\u0113js Love2D, Lua ir skript\u0113ta Warcraft un citur. Lua izstr\u0101d\u0101t\u0101ju ir \u013coti daudz, vi\u0146iem ir liela un atsauc\u012bga kopiena. Visi mani jaut\u0101jumi par Lua tika atrisin\u0101ti da\u017eu stundu laik\u0101. Kad raksti sarakst\u0101, burtiski da\u017eu min\u016b\u0161u laik\u0101 jau ir kaudze atbil\u017eu, izkl\u0101sta, kas un k\u0101, kas pie k\u0101. Tas ir \u013coti jauki. Diem\u017e\u0113l ne visur ir t\u0101da laipna un draudz\u012bga kopiena.<br \/>\nPar OpenResty ir GitHub, kur var izveidot issue, ja kaut kas ir boj\u0101ts. Ir saraksts uz Google Groups, kur var apspriest visp\u0101r\u0113jus jaut\u0101jumus, ir saraksts \u0137\u012bnie\u0161u valod\u0101 \u2014 nezini, varb\u016bt ang\u013cu valodu neproti, bet nav \u0161\u0137\u0113r\u0161\u013cu \u0137\u012bnie\u0161u valodai.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Secin\u0101jumi<\/h1>\n<p><\/p>\n<ul>\n<li>Ceru, ka sp\u0113ju izskaidrot, ka OpenResty ir \u013coti \u0113rta ietvarstrukt\u016bra, kas ir piel\u0101gota t\u012bmek\u013ca izstr\u0101dei.<\/li>\n<li>Tam ir zems piek\u013cuves slieksnis, jo kods ir l\u012bdz\u012bgs tam, ko m\u0113s rakst\u0101m, valoda ir diezgan vienk\u0101r\u0161a un minim\u0101listiska.<\/li>\n<li>Tas pied\u0101v\u0101 asinhronu I\/O bez atgriezenisk\u0101s saites, mums neb\u016bs 'n\u016bdeles', k\u0101 da\u017ereiz varam uzrakst\u012bt NodeJS.<\/li>\n<li>Tam ir viegla izvieto\u0161ana, jo mums nepiecie\u0161ams tikai NGINX ar nepiecie\u0161amo moduli un m\u016bsu kods, un viss uzreiz darbojas.<\/li>\n<li>Liela un atsauc\u012bga kopiena.<\/li>\n<\/ul>\n<p>\nEs nest\u0101st\u012bju s\u012bk\u0101k, k\u0101 notiek mar\u0161rut\u0113\u0161ana, tur san\u0101k \u013coti gar\u0161 st\u0101sts.<\/p>\n<p>Paldies par uzman\u012bbu!<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"silrEB0Brvo\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/silrEB0Brvo\/hqdefault.jpg\" alt=\"Atska\u0146ot video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<em><noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2016\/abstracts\/2432.html\">Vladimirs Protasovs \u2014 OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumprogrammu serveri<\/a><\/noindex><\/em><br \/>\n<br \/>Avots: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/321864\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0441 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 HighLoad++ 2016, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0430 \u0432 \u043f\u043e\u0434\u043c\u043e\u0441\u043a\u043e\u0432\u043d\u043e\u043c \u0421\u043a\u043e\u043b\u043a\u043e\u0432\u043e 7\u20148 \u043d\u043e\u044f\u0431\u0440\u044f \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430. \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u041f\u0440\u043e\u0442\u0430\u0441\u043e\u0432 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c NGINX \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e OpenResty \u0438 Lua. \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u041f\u0440\u043e\u0442\u0430\u0441\u043e\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 Parallels. \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043e \u0441\u0435\u0431\u0435. \u0422\u0440\u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0438\u0448\u0443 \u043a\u043e\u0434. \u0421\u0442\u0430\u043b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":71379,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-71378","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47OpenResty: \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c NGINX \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-25T17:45:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47OpenResty: p\u0101rv\u0113r\u0161am NGINX par pilnv\u0113rt\u012bgu lietojumserveri | ProHoster","description":"M\u0113s atkal public\u0113jam transkripciju.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47OpenResty: \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c NGINX \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 | ProHoster","og:description":"\u041c\u044b \u0432\u043d\u043e\u0432\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443.","og:url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-25T17:45:02+00:00","article:modified_time":"2020-03-03T13:14:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"71378","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:03:22","updated":"2022-09-30 08:39:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}