{"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\/hu\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>\u00dajra k\u00f6zz\u00e9tessz\u00fck a konferencia el\u0151ad\u00e1s\u00e1nak \u00e1t\u00edr\u00e1s\u00e1t <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, amely a moszkvai Skolkovo-ban zajlott 7\u20138-\u00e1n, m\u00falt \u00e9v november\u00e9ben. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vlagyimir Protasov<\/a><\/noindex> elmondja, hogyan lehet b\u0151v\u00edteni az NGINX funkcionalit\u00e1s\u00e1t az OpenResty \u00e9s a Lua seg\u00edts\u00e9g\u00e9vel.<\/em><\/p>\n<p>\u00dcdv\u00f6zl\u00f6m mindenkit, Vlagyimir Protasov vagyok, a Parallels-n\u00e9l dolgozom. Mes\u00e9lek egy kicsit magamr\u00f3l. \u00c9letem h\u00e1romnegyed\u00e9t k\u00f3d\u00edr\u00e1ssal t\u00f6lt\u00f6ttem. Megsz\u00e1llott programoz\u00f3 lettem, sz\u00f3 szerint: n\u00e9ha \u00e1lmomban is k\u00f3dot l\u00e1tok. \u00c9letem egynegyed\u00e9t ipari fejleszt\u00e9sben t\u00f6lt\u00f6ttem, olyan k\u00f3dot \u00edrok, amely k\u00f6zvetlen\u00fcl a gy\u00e1rt\u00e1sba ker\u00fcl. Az a k\u00f3d, amit n\u00e9h\u00e1nyan haszn\u00e1ltok, de nem is sejtitek.<\/p>\n<p>Hogy meg\u00e9rts\u00e9tek, mennyire rossz volt a helyzet. Amikor fiatal junior voltam, meg\u00e9rkeztem, \u00e9s k\u00e9t terab\u00e1jtos adatb\u00e1zisokat kaptam. Most m\u00e1r mindenkinek highload van itt. J\u00e1rtam a konferenci\u00e1kra, \u00e9s k\u00e9rdeztem: \u201eFi\u00fak, mes\u00e9ljetek, nektek big data van, minden szuper? Mekkora az adatb\u00e1zisotok?\u201d Azt v\u00e1laszolt\u00e1k: \u201eNek\u00fcnk 100 gigab\u00e1jt van!\u201d \u00c9n mondtam: \u201eSzuper, 100 gigab\u00e1jt!\u201d K\u00f6zben gondoltam, hogy meg kell tartanom a p\u00f3kerarcot. Azt hitted, hogy a fi\u00fak men\u0151k, azt\u00e1n visszaj\u00f6ssz, \u00e9s vacakolsz ezekkel a sokterab\u00e1jtos adatb\u00e1zisokkal. \u00c9s ez - junior koromban. El tudj\u00e1tok k\u00e9pzelni, mekkora pofon volt ez?<\/p>\n<p>T\u00f6bb mint 20 programoz\u00e1si nyelvet ismerek. Ez az, amivel dolgoznom kellett. Kapsz k\u00f3dot Erlangban, C-ben, C++-ban, Lu\u00e1ban, Pythonban, Rubiban, \u00e9s m\u00e9g sok m\u00e1sban, \u00e9s mindent meg kell csin\u00e1lnod. Az \u00f6sszes nyelvet nem tudtam pontosan megsz\u00e1molni, de k\u00f6r\u00fclbel\u00fcl 20-n\u00e1l elveszett a sz\u00e1m.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nMivel mindenki tudja, mi az a Parallels, \u00e9s mivel foglalkozunk, nem fogom mondani, milyen klasszak vagyunk, \u00e9s mit csin\u00e1lunk. Csak annyit mondok, hogy 13 irod\u00e1nk van vil\u00e1gszerte, t\u00f6bb mint 300 alkalmazottunk van, a fejleszt\u00e9s Moszkv\u00e1ban, Tallinnban \u00e9s M\u00e1lt\u00e1n zajlik. Ha akarod, k\u00f6lt\u00f6zhetsz M\u00e1lt\u00e1ra, ha t\u00e9len hideg van, \u00e9s meg akarod meleg\u00edteni a h\u00e1tadat.<\/p>\n<p>A mi r\u00e9szleg\u00fcnk konkr\u00e9tan Python 2-\u0151t haszn\u00e1l. \u00dczlettel foglalkozunk, \u00e9s nincs id\u0151nk divatos technol\u00f3gi\u00e1k bevezet\u00e9s\u00e9re, \u00edgy szenved\u00fcnk. Van Django, mert abban minden benne van, a f\u00f6l\u00f6sleget meg kivett\u00fck. Emellett MySQL, Redis \u00e9s NGINX is. Tov\u00e1bb\u00e1 sok m\u00e1s klassz dologgal rendelkez\u00fcnk. Van MongoDB, nyuszi is van n\u00e1lunk, sz\u00f3val olyan dolgok, amik nincsenek \u2013 de ez nem az \u00e9n hat\u00e1sk\u00f6r\u00f6m, nem ezzel foglalkozom.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nMes\u00e9ltem magamr\u00f3l. N\u00e9zz\u00fck meg, mir\u0151l fogok ma besz\u00e9lni:<\/p>\n<ul>\n<li>Mi az OpenResty, \u00e9s mivel lehet fogyasztani?<\/li>\n<li>Mi\u00e9rt tal\u00e1ljunk ki m\u00e9g egy ker\u00e9kp\u00e1rt, amikor ott van nek\u00fcnk a Python, NodeJS, PHP, Go \u00e9s sok m\u00e1s klassz dolog, amivel mindenki el\u00e9gedett?<\/li>\n<li>Egy kis p\u00e9lda az \u00e9letb\u0151l. Nagyon le kellett r\u00f6vid\u00edtenem a besz\u00e1mol\u00f3mat, mert 3,5 \u00f3r\u00e1sra siker\u00fclt, ez\u00e9rt kev\u00e9s p\u00e9lda lesz.<\/li>\n<\/ul>\n<p>\nAz OpenResty az NGINX. Ennek k\u00f6sz\u00f6nhet\u0151en van egy teljes \u00e9rt\u00e9k\u0171 webkiszolg\u00e1l\u00f3, ami j\u00f3l van meg\u00edrva, gyorsan m\u0171k\u00f6dik. Azt hiszem, a t\u00f6bbs\u00e9g\u00fcnk az NGINX-et haszn\u00e1lja a termel\u00e9sben. Mindenki tudja, hogy gyors \u00e9s klassz. Nagyszer\u0171 szinkron bemenet\/kimenetet val\u00f3s\u00edtottak meg benne, \u00edgy nem kell \u00fajra feltal\u00e1lnunk a szelet, mint ahogy a Python eset\u00e9ben a geventtel megtett\u00e9k. A gevent klassz, szuper, de ha \u00edrsz C k\u00f3dot, \u00e9s valami nem \u00fagy m\u0171k\u00f6dik, ahogy kellene, akkor meg\u0151r\u00fclsz a hibakeres\u00e9sn\u00e9l. Volt tapasztalatom: k\u00e9t napomba telt, hogy kider\u00edtsem, mi ment rosszul. Ha valaki el\u0151tte nem kutatott volna heteken \u00e1t, nem tal\u00e1lta volna meg a probl\u00e9m\u00e1t, nem \u00edrt volna r\u00f3la az Interneten, \u00e9s a Google sem tal\u00e1lta volna meg, akkor teljesen meg\u0151r\u00fclt\u00fcnk volna.<\/p>\n<p>Az NGINX-ben m\u00e1r van cache-el\u00e9s \u00e9s statikus tartalom. Nem kell agg\u00f3dnod, hogyan csin\u00e1ld ezt norm\u00e1lisan, hogy ne lassuljon le valahol, vagy ne vesz\u00edtsd el a descriptorokat. Az Nginx-et nagyon k\u00f6nny\u0171 telep\u00edteni, nem kell azon gondolkodnod, mit v\u00e1lassz \u2014 WSGI, PHP-FPM, Gunicorn, Unicorn. Telep\u00edted az Nginx-et, a rendszergazd\u00e1k megkapj\u00e1k, \u0151k tudj\u00e1k, hogyan kell b\u00e1nni vele. Az Nginx struktur\u00e1ltan kezeli a k\u00e9r\u00e9seket. Err\u0151l k\u00e9s\u0151bb egy kicsit b\u0151vebben besz\u00e9lek. R\u00f6viden: van egy f\u00e1zis, amikor csak fogadta a k\u00e9r\u00e9st, amikor feldolgozta, \u00e9s amikor visszaadta a tartalmat a felhaszn\u00e1l\u00f3nak.<\/p>\n<p>Az Nginx klassz, de van egy probl\u00e9ma: nem el\u00e9g rugalmas, m\u00e9g a sok klassz funkci\u00f3 ellen\u00e9re, amit a fi\u00fak beleraktak a konfigur\u00e1ci\u00f3ba, annak ellen\u00e9re, hogy testre lehet szabni. Ebb\u0151l a potenci\u00e1lb\u00f3l hi\u00e1nyzik valami. Ez\u00e9rt a Taobao sr\u00e1cok r\u00e9gen, \u00fagy nyolc \u00e9ve, be\u00e9p\u00edtett\u00e9k a Lua-t. Mit ad ez?<\/p>\n<ul>\n<li><strong>M\u00e9ret<\/strong>. Kicsi. A LuaJIT k\u00f6r\u00fclbel\u00fcl 100-200 kilobytes mem\u00f3ria overheadet \u00e9s minim\u00e1lis teljes\u00edtm\u00e9ny overheadet ad.<\/li>\n<li><strong>Sebess\u00e9g<\/strong>A LuaJIT interpreter is often close to C in many situations, sometimes it falls behind Java, while in other cases it surpasses it. For a time, it was considered state of the art, the coolest JIT compiler. Today, there are more advanced ones, but they're very heavy, for example, V8. Some JS interpreters and Java's HotSpot are faster in certain areas, yet still lag behind in others.<\/li>\n<li><strong>Egyszer\u0171 meg\u00e9rteni<\/strong>If you have, say, a codebase in Perl, and you're not Booking, you won't find Perl programmers. Because they are not available; they've all been taken, and teaching them is time-consuming and difficult. If you want programmers in something else, you may also need to retrain or find them. With Lua, it's straightforward. Any junior can learn Lua in three days. It took me about two hours to get the hang of it. After two hours, I was already writing production code. After about a week, it actually went into production.<\/li>\n<\/ul>\n<p>\nAs a result, it looks like this:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" 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 brings together a bunch of modules, both Lua and engine-specific. And you have everything ready \u2014 you deploy it, and it works.<\/p>\n<h1>P\u00e9ld\u00e1k<\/h1>\n<p>\nEnough with the poetry, let's get to the code. Here's a simple Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWhat's here? That's an engine-specific location. We don't worry about it, we don't write our own routing, we don't take a pre-made one \u2014 we already have it in NGINX, and we're living well and lazily.<\/p>\n<p><code>content_by_lua_block<\/code> \u2014 is a block that indicates we are serving content using a Lua script. We take the engine variable <code>remote_addr<\/code> and plug it into <code>string.format<\/code>. It's the same as <code>sprintf<\/code>, just in Lua, just correctly. 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: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" 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. Nobody deploys Hello World to production. Our application usually interacts with a database or somewhere else and spends most of its time waiting for a response.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIt just sits and waits. This isn't very good. When 100,000 users come in, it becomes quite challenging. Therefore, let's create a simple application as an example. We'll search for images, for instance, kittens. But we won't just search randomly; we'll extend keywords and, if a user searches for 'kittens', we'll find them cats, fluffy ones, 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: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nK\u00e9t sor megengedi, hogy lek\u00e9rj\u00fck a GET-param\u00e9tereket, semmi bonyolults\u00e1g. Azt\u00e1n mondjuk, az adatb\u00e1zisb\u00f3l az kulcssz\u00f3 \u00e9s kiterjeszt\u00e9s t\u00e1bl\u00e1j\u00e1b\u00f3l egy szok\u00e1sos SQL lek\u00e9rdez\u00e9ssel megkaptuk ezt az inform\u00e1ci\u00f3t. Egyszer\u0171. \u00cdgy n\u00e9z ki:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCsatlakoztatjuk a k\u00f6nyvt\u00e1rat <code>resty.mysql<\/code>, ami m\u00e1r n\u00e1lunk van. Nincs sz\u00fcks\u00e9g semmit telep\u00edteni, minden el\u0151k\u00e9sz\u00edtett. Megadjuk, hogyan csatlakozzunk, \u00e9s v\u00e9gz\u00fcnk egy SQL lek\u00e9rdez\u00e9st:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nItt kicsit ijeszt\u0151, de minden m\u0171k\u00f6dik. Itt a 10 a limit. 10 rekordot vesz\u00fcnk ki, lust\u00e1k vagyunk, nem akarunk t\u00f6bbet mutatni. Az SQL-ben elfelejtettem a limittel foglalkozni.<\/p>\n<p>Azt\u00e1n megtal\u00e1ljuk a k\u00e9peket minden lek\u00e9rdez\u00e9s alapj\u00e1n. \u00d6sszegy\u0171jt\u00fcnk egy csom\u00f3 lek\u00e9rdez\u00e9st \u00e9s felt\u00f6ltj\u00fck a Lua t\u00e1bl\u00e1zatot, ami <code>reqs<\/code>, \u00e9s v\u00e9gz\u00fcnk <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMindezek a lek\u00e9rdez\u00e9sek p\u00e1rhuzamosan futnak, \u00e9s visszakapjuk a v\u00e1laszokat. A fut\u00e1si id\u0151 megegyezik a leglassabb v\u00e1lasz idej\u00e9vel. Ha mindegyik 50 milliszekundumban v\u00e1laszol, \u00e9s k\u00fcldt\u00fcnk sz\u00e1z lek\u00e9rdez\u00e9st, akkor a v\u00e1lasz 50 milliszekundum alatt \u00e9rkezik.<\/p>\n<p>Mivel lust\u00e1k vagyunk, \u00e9s nem akarunk HTTP kezel\u00e9st \u00e9s gyors\u00edt\u00f3t\u00e1raz\u00e1st \u00edrni, r\u00e1b\u00edzzuk az NGINX-re, hogy mindent elint\u00e9zzen helyett\u00fcnk. Ahogy l\u00e1ttuk, ott volt egy lek\u00e9rdez\u00e9s a <code>url\/fetch<\/code>, ez az:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nEgyszer\u0171en v\u00e9gz\u00fcnk egy <code>proxy_pass<\/code>, megadjuk, hova kell gyors\u00edt\u00f3t\u00e1razni, hogyan kell ezt megcsin\u00e1lni, \u00e9s minden m\u0171k\u00f6dik.<\/p>\n<p>De ez nem el\u00e9g, azt is el kell adnunk a felhaszn\u00e1l\u00f3nak. A legegyszer\u0171bb \u00f6tlet, hogy mindent JSON-ba szerializ\u00e1ljunk, k\u00f6nnyen, k\u00e9t sorban. Megadjuk a Content-Type-ot, visszaadjuk a JSON-t.<\/p>\n<p>De van egy neh\u00e9zs\u00e9g: a felhaszn\u00e1l\u00f3 nem akar JSON-t olvasni. Meg kell nyern\u00fcnk a frontendeseket. N\u00e9ha kezdetben nem szeretn\u00e9nk ezt csin\u00e1lni. A SEO szakemberek is azt mondj\u00e1k, hogy ha k\u00e9peket keres\u00fcnk, nekik mindegy. De ha valamilyen tartalmat adunk \u00e1t nekik, azt mondj\u00e1k, hogy a keres\u0151motorok nem indexelnek semmit.<\/p>\n<p>Mit tegy\u00fcnk ezzel? Nyilv\u00e1nval\u00f3an HTML-t fogunk adni a felhaszn\u00e1l\u00f3nak. K\u00e9zzel gener\u00e1lni - nem komilfo, ez\u00e9rt sablonokat szeretn\u00e9nk haszn\u00e1lni. Erre van egy k\u00f6nyvt\u00e1r <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVal\u00f3sz\u00edn\u0171leg l\u00e1ttad a h\u00e1rom ijeszt\u0151 bet\u0171t OPM. Az OpenResty rendelkezik a saj\u00e1t csomagkezel\u0151j\u00e9vel, amelyen kereszt\u00fcl rengeteg m\u00e1s modult lehet telep\u00edteni, t\u00f6bbek k\u00f6z\u00f6tt <code>lua-resty-template<\/code>. Ez egy egyszer\u0171 sablonmotor, amely k\u00f6zel \u00e1ll a Django sablonokhoz. Ott k\u00f3dot lehet \u00edrni, \u00e9s v\u00e1ltoz\u00f3kat behelyettes\u00edteni.<\/p>\n<p>Ennek eredm\u00e9nyek\u00e9nt minden k\u00f6r\u00fclbel\u00fcl \u00edgy fog kin\u00e9zni:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAdatokat gy\u0171jt\u00f6tt\u00fcnk \u00e9s a sablont ism\u00e9t k\u00e9t sorban renderelt\u00fck. A felhaszn\u00e1l\u00f3 boldog, megkapta a macsk\u00e1kat. Mivel b\u0151v\u00edtett\u00fck a keres\u00e9st, a kiscic\u00e1k mellett m\u00e9g egy tengeri oroszl\u00e1nt is kapott. Ki tudja, tal\u00e1n \u00e9ppen \u0151t kereste, de nem tudta megfogalmazni a keres\u00e9s\u00e9t.<\/p>\n<p>Minden szuper, de mi fejleszt\u00e9s alatt \u00e1llunk, \u00e9s m\u00e9g nem szeretn\u00e9nk a felhaszn\u00e1l\u00f3knak megmutatni. Csak a bejelentkez\u00e9st csin\u00e1ljuk meg. Ehhez n\u00e9zz\u00fck meg, hogyan dolgozza fel az NGINX a k\u00e9r\u00e9seket az OpenResty szempontj\u00e1b\u00f3l:<\/p>\n<ul>\n<li>Az els\u0151 f\u00e1zis\u00a0\u2014 <strong>hozz\u00e1f\u00e9r\u00e9s<\/strong>, amikor a felhaszn\u00e1l\u00f3 \u00e9ppen csak meg\u00e9rkezett, \u00e9s megn\u00e9zz\u00fck \u0151t a fejl\u00e9cek, az IP-c\u00edm \u00e9s egy\u00e9b adatok alapj\u00e1n. Azonnal elutas\u00edthatjuk, ha nem tetszik nek\u00fcnk. Ezt haszn\u00e1lhatjuk a bejelentkez\u00e9shez, vagy ha nagyon sok k\u00e9r\u00e9s \u00e9rkezik, akkor ezen a f\u00e1zison k\u00f6nnyen letudhatjuk azokat.<\/li>\n<li><strong>\u00e1t\u00edr\u00e1s<\/strong>. \u00c1t\u00edrjuk a k\u00e9r\u00e9s bizonyos adatait.<\/li>\n<li><strong>content<\/strong>. Tov\u00e1bb\u00edtjuk a tartalmat a felhaszn\u00e1l\u00f3nak.<\/li>\n<li><strong>fejl\u00e9c sz\u0171r\u0151<\/strong>. Megv\u00e1ltoztatjuk a v\u00e1lasz fejl\u00e9ceit. Ha haszn\u00e1ltuk a <code>proxy_pass<\/code>, bizonyos fejl\u00e9ceket \u00e1t\u00edrhatunk, miel\u0151tt a felhaszn\u00e1l\u00f3nak tov\u00e1bb\u00edtan\u00e1nk azokat.<\/li>\n<li><strong>t\u00f6rzs sz\u0171r\u0151<\/strong>. Megv\u00e1ltoztathatjuk a t\u00f6rzset.<\/li>\n<li><strong>napl\u00f3z\u00e1s<\/strong>\u00a0\u2014 napl\u00f3z\u00e1s. Lehet\u0151s\u00e9g van a napl\u00f3k Elasticsearchbe \u00edr\u00e1s\u00e1ra tov\u00e1bbi r\u00e9teg n\u00e9lk\u00fcl.<\/li>\n<\/ul>\n<p>\nA bejelentkez\u00e9s\u00fcnk k\u00f6r\u00fclbel\u00fcl \u00edgy fog kin\u00e9zni:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nEzt hozz\u00e1adjuk ahhoz a <code>location<\/code>, amelyet kor\u00e1bban le\u00edrtunk, \u00e9s be\u00e1gyazzuk a k\u00f6vetkez\u0151 k\u00f3dot:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMegn\u00e9zz\u00fck, van-e cookie token. Ha nincs, akkor \u00e1tir\u00e1ny\u00edtjuk a bejelentkez\u00e9sre. A felhaszn\u00e1l\u00f3k ravaszak \u00e9s kital\u00e1lhatj\u00e1k, hogy be kell \u00e1ll\u00edtaniuk a cookie tokent. Ez\u00e9rt ezt m\u00e9g elhelyezz\u00fck a Redisben is:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nA Redis kezel\u00e9s\u00e9vel kapcsolatos k\u00f3d nagyon egyszer\u0171, \u00e9s semmiben sem k\u00fcl\u00f6nb\u00f6zik m\u00e1s nyelvekt\u0151l. Az \u00f6sszes bemenet\/kimenet, legyen az ott vagy itt, nem blokkol\u00f3. Ha szinkron k\u00f3dot \u00edrsz, akkor aszimmetrikusan m\u0171k\u00f6dik. Kb. mint a gevent, csak j\u00f3l csin\u00e1lva.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00e9sz\u00edts\u00fck el a bejelentkez\u00e9st:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMondjuk, hogy sz\u00fcks\u00e9g\u00fcnk van a k\u00e9r\u00e9s t\u00f6rzs\u00e9nek olvas\u00e1s\u00e1ra. Megkapjuk a POST-argumentumokat, ellen\u0151rizz\u00fck, hogy a felhaszn\u00e1l\u00f3n\u00e9v \u00e9s a jelsz\u00f3 helyes-e. Ha nem helyes, akkor \u00e1tir\u00e1ny\u00edtjuk a bejelentkez\u00e9sre. Ha helyes, akkor a tokent be\u00edrjuk a Redisbe:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNe felejts\u00fck el be\u00e1ll\u00edtani a cookiet, ezt is k\u00e9t sorban megtehetj\u00fck:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: a NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEz egy egyszer\u0171, elm\u00e9leti p\u00e9lda. Term\u00e9szetesen nem fogunk olyan szolg\u00e1ltat\u00e1st csin\u00e1lni, ami macsk\u00e1kat mutat az embereknek. De ki tudja. Ez\u00e9rt n\u00e9zz\u00fck meg, mit lehet csin\u00e1lni a produkci\u00f3ban.<\/p>\n<ul>\n<li><strong>Minimalista backend<\/strong>. N\u00e9ha sz\u00fcks\u00e9g\u00fcnk van arra, hogy a backendb\u0151l egy kicsit adatot kiadjuk: valahol d\u00e1tumot kell behelyettes\u00edten\u00fcnk, valahol egy list\u00e1t megjelen\u00edten\u00fcnk, megmondani, h\u00e1ny felhaszn\u00e1l\u00f3 van most az oldalon, csatlakoztatni egy sz\u00e1ml\u00e1l\u00f3t vagy statisztik\u00e1t. Valami ilyesmi, apr\u00f3 dolgokat nagyon k\u00f6nnyen meg lehet csin\u00e1lni. Ezek minim\u00e1lis darabk\u00e1k gyorsan, k\u00f6nnyed\u00e9n \u00e9s j\u00f3l megoldhat\u00f3k.\n<\/li>\n<li><strong>Adatok el\u0151feldolgoz\u00e1sa<\/strong>. N\u00e9ha azt is szeretn\u00e9nk, ha rekl\u00e1mokat integr\u00e1ln\u00e1nk az oldalunkba, amelyek API-h\u00edv\u00e1sok seg\u00edts\u00e9g\u00e9vel ker\u00fclnek beszerz\u00e9sre. Ezt itt nagyon k\u00f6nny\u0171 megcsin\u00e1lni. Nem terhelj\u00fck le a backend\u00fcnket, amely m\u00e1r am\u00fagy is nehezen dolgozik. Itt \u00f6ssze lehet \u00e1ll\u00edtani valamit. \u00d6ssze tudunk rakni valamilyen JS-t vagy \u00e9ppen ellenkez\u0151leg, sz\u00e9tszedni valamit, amit el\u0151re kell feldolgozni, miel\u0151tt a felhaszn\u00e1l\u00f3nak \u00e1tadn\u00e1nk.\n<\/li>\n<li><strong>Fas\u00e1d egy mikroszolg\u00e1ltat\u00e1s sz\u00e1m\u00e1ra<\/strong>. Ez is egy nagyon j\u00f3 eset, \u00e9n is megval\u00f3s\u00edtottam. Ezel\u0151tt a Tenzor c\u00e9gn\u00e9l dolgoztam, amely elektronikus jelent\u00e9st\u00e9tellel foglalkozik, \u00e9s a jogi szem\u00e9lyek k\u00f6r\u00fclbel\u00fcl fel\u00e9nek biztos\u00edtja a jelent\u00e9st\u00e9telt az orsz\u00e1gban. K\u00e9sz\u00edtett\u00fcnk egy szolg\u00e1ltat\u00e1st, ott ugyanezen mechanizma seg\u00edts\u00e9g\u00e9vel sok dolgot megoldottunk: \u00fatvonalir\u00e1ny\u00edt\u00e1s, jogosults\u00e1gkezel\u00e9s \u00e9s egyebek.<br \/>\nAz OpenResty haszn\u00e1lhat\u00f3 ragaszt\u00f3k\u00e9nt a mikroszolg\u00e1ltat\u00e1said sz\u00e1m\u00e1ra, amely egys\u00e9ges hozz\u00e1f\u00e9r\u00e9st \u00e9s egys\u00e9ges fel\u00fcletet biztos\u00edt mindenhez. Mivel a mikroszolg\u00e1ltat\u00e1sok \u00edr\u00f3dhatnak \u00fagy, hogy itt Node.js, ott PHP, itt Python, itt meg valami Erlangon fut, tudjuk, hogy nem akarjuk ugyanazt a k\u00f3dot mindenhol \u00e1t\u00edrni. Ez\u00e9rt az OpenResty-t be lehet illeszteni a frontendbe.<\/p>\n<\/li>\n<li><strong>Statisztika \u00e9s analitika<\/strong>. \u00c1ltal\u00e1ban az NGINX \u00e1ll az el\u0151t\u00e9rben, \u00e9s az \u00f6sszes k\u00e9r\u00e9s rajta \u00e1tfolyik. Pontosan ezen a helyen nagyon k\u00e9nyelmes \u00f6sszegy\u0171jteni. Valamit azonnal ki lehet sz\u00e1molni \u00e9s valahov\u00e1 k\u00fcldeni, p\u00e9ld\u00e1ul a Elasticsearch-be, Logstash-ba, vagy egyszer\u0171en csak r\u00f6gz\u00edteni a napl\u00f3ba, majd k\u00e9s\u0151bb valahov\u00e1 elk\u00fcldeni.\n<\/li>\n<li><strong>T\u00f6bbfelhaszn\u00e1l\u00f3s rendszerek<\/strong>. P\u00e9ld\u00e1ul online j\u00e1t\u00e9kokat is nagyon j\u00f3l lehet csin\u00e1lni. Ma Cape Townban Alekszandr Gladys ismertetni fogja, hogyan lehet gyorsan protot\u00edpusokat k\u00e9sz\u00edteni egy t\u00f6bbfelhaszn\u00e1l\u00f3s j\u00e1t\u00e9khoz az OpenResty seg\u00edts\u00e9g\u00e9vel.\n<\/li>\n<li><strong>K\u00e9r\u00e9sek sz\u0171r\u00e9se (WAF)<\/strong>. Jelenleg divat a web application firewallok l\u00e9trehoz\u00e1sa, sz\u00e1mos szolg\u00e1ltat\u00e1s \u00e1ll rendelkez\u00e9sre, amelyek ezt k\u00edn\u00e1lj\u00e1k. Az OpenResty seg\u00edts\u00e9g\u00e9vel saj\u00e1t web application firewall-t k\u00e9sz\u00edthet, amely egyszer\u0171en \u00e9s k\u00f6nnyen sz\u0171ri a k\u00e9r\u00e9seket az \u00d6n ig\u00e9nyei szerint. Ha Python-t haszn\u00e1l, tudja, hogy a PHP-t biztosan nem tudj\u00e1k injekt\u00e1lni, hacsak nem ind\u00edtja el a konzolb\u00f3l valahol. \u00d6n tudja, hogy van MySQL \u00e9s Python. Val\u00f3sz\u00edn\u0171leg valaki megpr\u00f3b\u00e1lhat valamilyen directory traversal-t csin\u00e1lni, \u00e9s valamit injekt\u00e1lni az adatb\u00e1zisba. Ez\u00e9rt gyorsan \u00e9s olcs\u00f3n sz\u0171rheti a gyan\u00fas k\u00e9r\u00e9seket k\u00f6zvetlen\u00fcl a frontend-en.\n<\/li>\n<li><strong>K\u00f6z\u00f6ss\u00e9g.<\/strong> Mivel az OpenResty az NGINX alapj\u00e1n k\u00e9sz\u00fclt, ez\u00e9rt van egy b\u00f3nusza - ez <strong>NGINX k\u00f6z\u00f6ss\u00e9g<\/strong>. Nagyon nagy, \u00e9s a kezdeti k\u00e9rd\u00e9sek jelent\u0151s r\u00e9sz\u00e9t m\u00e1r megv\u00e1laszolta az NGINX k\u00f6z\u00f6ss\u00e9g.\n<p><strong>Lua fejleszt\u0151k<\/strong>. Tegnap besz\u00e9lgettem olyan sr\u00e1cokkal, akik r\u00e9szt vettek a HighLoad++ tanul\u00f3napon, \u00e9s hallottam, hogy a Lua-t csak a Tarantool-ban haszn\u00e1lt\u00e1k. Ez nem igaz, a Lua-t sok mindenre \u00edrt\u00e1k. P\u00e9ld\u00e1k: OpenResty, Prosody XMPP-szerver, Love2D j\u00e1t\u00e9kmotor, Lua scriptelhet\u0151 a Warcraftban \u00e9s m\u00e1s helyeken. Nagyon sok Lua fejleszt\u0151 van, nagy \u00e9s v\u00e1laszk\u00e9sz k\u00f6z\u00f6ss\u00e9ggel. Minden k\u00e9rd\u00e9semre a Lua-val p\u00e1r \u00f3r\u00e1n bel\u00fcl v\u00e1laszt kaptam. Amikor \u00edrsz az e-mail list\u00e1ra, n\u00e9h\u00e1ny percen bel\u00fcl m\u00e1r egy csom\u00f3 v\u00e1lasz \u00e9rkezik, r\u00e9szletezve mi \u00e9s hogyan, mit mivel. Ez igaz\u00e1n nagyszer\u0171. Sajnos nem mindenhol van ilyen bar\u00e1ts\u00e1gos \u00e9s seg\u00edt\u0151k\u00e9sz k\u00f6z\u00f6ss\u00e9g.<br \/>\nAz OpenResty-hez van GitHub, ahol probl\u00e9m\u00e1t jelenthet, ha valami elt\u00f6rik. Van egy Google Groups lista, ahol \u00e1ltal\u00e1nos k\u00e9rd\u00e9seket lehet megbesz\u00e9lni, van egy k\u00ednai lista is - h\u00e1tha nem besz\u00e9l angolul, de tud k\u00ednaiul.<\/li>\n<\/ul>\n<p><\/p>\n<h1>\u00d6sszegz\u00e9s<\/h1>\n<p><\/p>\n<ul>\n<li>Rem\u00e9lem, siker\u00fclt kifejeznem, hogy az OpenResty egy nagyon k\u00e9nyelmes keretrendszer, amelyet webre terveztek.<\/li>\n<li>Alacsony a bel\u00e9p\u00e9si k\u00fcsz\u00f6b, mivel a k\u00f3d hasonl\u00edt arra, amivel dolgozunk, a nyelv viszonylag egyszer\u0171 \u00e9s minimalista.<\/li>\n<li>Aszinkron I\/O-t biztos\u00edt callback-ek n\u00e9lk\u00fcl, \u00edgy nem lesz hosszan el\u00e1gazott k\u00f3d, mint amit n\u00e9ha a NodeJS-ben \u00edrunk.<\/li>\n<li>K\u00f6nny\u0171 a telep\u00edt\u00e9s, mivel csak az NGINX-re van sz\u00fcks\u00e9g a megfelel\u0151 modulokkal \u00e9s a k\u00f3dunkra, \u00e9s minden azonnal m\u0171k\u00f6dik.<\/li>\n<li>Nagy \u00e9s v\u00e1laszk\u00e9sz k\u00f6z\u00f6ss\u00e9g.<\/li>\n<\/ul>\n<p>\nNem mondtam el r\u00e9szletesen, hogyan t\u00f6rt\u00e9nik a routol\u00e1s, mert az t\u00fal hossz\u00fa besz\u00e9lget\u00e9st eredm\u00e9nyezett volna.<\/p>\n<p>K\u00f6sz\u00f6n\u00f6m a figyelmet!<\/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=\"Vide\u00f3 lej\u00e1tsz\u00e1sa\" 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\">Vladimir Protasov - OpenResty: az NGINX-et teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edtjuk<\/a><\/noindex><\/em><br \/>\n<br \/>Forr\u00e1s: <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.3 - 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\/hu\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\/hu\/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: az NGINX teljes \u00e9rt\u00e9k\u0171 alkalmaz\u00e1sszerverr\u00e9 alak\u00edt\u00e1sa | ProHoster","description":"\u00dajra k\u00f6zz\u00e9tessz\u00fck a jegyz\u0151k\u00f6nyvet.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}