{"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\/es\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: transformamos NGINX en un servidor de aplicaciones completo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Publicamos nuevamente la transcripci\u00f3n de la presentaci\u00f3n de la conferencia <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++.<\/a><\/noindex> 2016, que tuvo lugar en Skolkovo, cerca de Mosc\u00fa, del 7 al 8 de noviembre del a\u00f1o pasado. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> nos cuenta c\u00f3mo ampliar la funcionalidad de NGINX con OpenResty y Lua.<\/em><\/p>\n<p>Hola a todos, me llamo Vladimir Protasov, trabajo en Parallels. Voy a contar un poco sobre m\u00ed. Durante tres cuartas partes de mi vida, he estado escribiendo c\u00f3digo. Me convert\u00ed en programador hasta la m\u00e9dula: a veces sue\u00f1o con c\u00f3digo. La otra cuarta parte de mi vida est\u00e1 dedicada al desarrollo industrial, escribiendo c\u00f3digo que va directamente a producci\u00f3n. C\u00f3digo que algunos de ustedes utilizan sin darse cuenta.<\/p>\n<p>Para que entiendan cu\u00e1n mal estaban las cosas. Cuando era un junior peque\u00f1o, llegu\u00e9 y me dieron bases de datos de dos terabytes. Ahora todos tienen highload aqu\u00ed. Asist\u00ed a conferencias y preguntaba: 'Chicos, cu\u00e9ntenme, \u00bftienen big data, es genial? \u00bfCu\u00e1nto tienen en las bases?' Me respond\u00edan: '\u00a1Tenemos 100 gigabytes!' Yo dec\u00eda: '\u00a1Genial, 100 gigabytes!' Pero por dentro pensaba, c\u00f3mo mantener una expresi\u00f3n indiferente. Pensabas, s\u00ed, estos chicos son geniales, y luego regresabas y te dedicabas a luchar con estas bases de datos de m\u00faltiples terabytes. Y eso, siendo un junior. \u00bfPueden imaginar qu\u00e9 golpe es eso?<\/p>\n<p>Conozco m\u00e1s de 20 lenguajes de programaci\u00f3n. Esto es algo con lo que tuve que lidiar en el trabajo. Te dan c\u00f3digo en Erlang, C, C++, Lua, Python, Ruby y algo m\u00e1s, y tienes que hacer todo eso. En general, fue necesario. No pude contar el n\u00famero exacto, pero perd\u00ed la cuenta alrededor de 20.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nComo todos los presentes saben qu\u00e9 es Parallels y en qu\u00e9 estamos involucrados, no hablar\u00e9 sobre lo geniales que somos y qu\u00e9 hacemos. Solo mencionar\u00e9 que tenemos 13 oficinas en todo el mundo, m\u00e1s de 300 empleados, y el desarrollo se lleva a cabo en Mosc\u00fa, Tallin y Malta. Si lo deseas, puedes mudarte a Malta si en invierno hace fr\u00edo y necesitas calentar la espalda.<\/p>\n<p>Nuestro departamento espec\u00edficamente escribe en Python 2. Nos dedicamos a los negocios y no tenemos tiempo para implementar tecnolog\u00edas de moda, as\u00ed que sufrimos. Usamos Django porque tiene todo lo que necesitamos, y descartamos lo superfluo. Tambi\u00e9n utilizamos MySQL, Redis y NGINX. Adem\u00e1s, tenemos muchas otras cosas geniales. Contamos con MongoDB, corren conejos, tenemos de todo, pero eso no es mi campo y no me ocupo de ello.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nYa he hablado de m\u00ed. Ahora veamos de qu\u00e9 tratar\u00e1 mi charla hoy:<\/p>\n<ul>\n<li>\u00bfQu\u00e9 es OpenResty y para qu\u00e9 se utiliza?<\/li>\n<li>\u00bfPara qu\u00e9 inventar otra bicicleta cuando ya tenemos Python, NodeJS, PHP, Go y otras cosas geniales que todos adoran?<\/li>\n<li>Y un par de ejemplos de la vida real. Tuve que recortar mucho mi presentaci\u00f3n porque me sal\u00eda a 3,5 horas, as\u00ed que habr\u00e1 pocos ejemplos.<\/li>\n<\/ul>\n<p>\nOpenResty es NGINX. Gracias a \u00e9l contamos con un servidor web completo, bien escrito y r\u00e1pido. Creo que la mayor\u00eda de nosotros usamos NGINX en producci\u00f3n. Todos saben que es r\u00e1pido y genial. Tiene entrada\/salida as\u00edncrona excepcional, as\u00ed que no necesitamos reinventar la rueda como lo hizo Python con gevent. Gevent es genial, impresionante, pero si escribes c\u00f3digo en C y algo sale mal, te volver\u00e1s loco depur\u00e1ndolo. Yo tuve esa experiencia: me tom\u00f3 dos d\u00edas darme cuenta de qu\u00e9 estaba mal. Si alguien no hubiera estado investigando durante semanas, no hubiera encontrado el problema, no lo hubiera escrito en internet y Google no lo hubiera encontrado, nos habr\u00edamos vuelto locos.<\/p>\n<p>NGINX ya tiene cach\u00e9 y contenido est\u00e1tico. No necesitas preocuparte por c\u00f3mo hacerlo de manera correcta para no atorar nada o perder descriptores. Nginx es muy f\u00e1cil de desplegar, no necesitas pensar en qu\u00e9 elegir: WSGI, PHP-FPM, Gunicorn, Unicorn. Instalaste Nginx, lo entregaste a los administradores, ellos saben c\u00f3mo trabajar con esto. Nginx maneja las solicitudes de forma estructurada. Te hablar\u00e9 un poco m\u00e1s sobre esto m\u00e1s adelante. En resumen, hay una fase en la que acepta la solicitud, otra en la que la procesa y por \u00faltimo entrega el contenido al usuario.<\/p>\n<p>Nginx es genial, pero hay un problema: no es lo suficientemente flexible incluso con todas esas caracter\u00edsticas geniales que los chicos incorporaron en la configuraci\u00f3n. Esta potencia se queda corta. Por eso, hace unos ocho a\u00f1os, los chicos de Taobao integraron Lua. \u00bfQu\u00e9 ofrece esto?<\/p>\n<ul>\n<li><strong>Tama\u00f1o<\/strong>. Es peque\u00f1o. LuaJIT tiene un sobrecoste de aproximadamente 100-200 kilobytes en memoria y un m\u00ednimo sobrecoste en rendimiento.<\/li>\n<li><strong>Velocidad<\/strong>. El int\u00e9rprete LuaJIT, en muchas situaciones, se acerca a C, en algunas situaciones pierde contra Java, y en ciertas ocasiones la supera. Durante un tiempo fue considerado el mejor JIT compilador. Ahora hay opciones m\u00e1s avanzadas, pero son muy pesadas, como V8. Algunos int\u00e9rpretes de JS y el HotSpot de Java son m\u00e1s r\u00e1pidos en ciertos puntos, pero en otros lugares a\u00fan quedan atr\u00e1s.<\/li>\n<li><strong>Facilidad de uso<\/strong>. Si, por ejemplo, tienes una base de c\u00f3digo en Perl, y no eres Booking, no encontrar\u00e1s programadores de Perl. Porque no hay, todos fueron llevados, y ense\u00f1arles lleva tiempo y es complicado. Si quieres programadores en algo diferente, quiz\u00e1s tambi\u00e9n tendr\u00e1s que reciclarlos o encontrarlos. En el caso de Lua, es sencillo. Cualquier principiante puede aprender Lua en tres d\u00edas. A m\u00ed me tom\u00f3 alrededor de dos horas entenderlo. Despu\u00e9s de dos horas ya estaba escribiendo c\u00f3digo en producci\u00f3n. Aproximadamente una semana despu\u00e9s, ya estaba funcionando en producci\u00f3n.<\/li>\n<\/ul>\n<p>\nComo resultado, se ve as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nHay mucho aqu\u00ed. En OpenResty han reunido un mont\u00f3n de m\u00f3dulos, tanto de Lua como del motor. Y t\u00fa tienes todo listo: lo despliegas y funciona.<\/p>\n<h1>Ejemplos<\/h1>\n<p>\nSuficiente de poes\u00eda, pasemos al c\u00f3digo. Aqu\u00ed hay un peque\u00f1o Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00bfQu\u00e9 hay aqu\u00ed? es una ubicaci\u00f3n de motor. No nos preocupamos, no escribimos nuestro propio enrutamiento, no tomamos ninguno ya hecho; ya tenemos en NGINX, vivimos bien y con pereza.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 es un bloque que indica que estamos entregando contenido usando un script de Lua. Tomamos la variable del motor <code>remote_addr<\/code> y la insertamos en <code>string.format<\/code>. Es lo mismo que, <code>sprintf<\/code>, solo que en Lua, solo que correcto. Y se lo entregamos al cliente.<\/p>\n<p>Como resultado, se ver\u00e1 as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPero volvamos al mundo real. En producci\u00f3n, nadie despliega Hello World. Nuestra aplicaci\u00f3n normalmente accede a una base de datos o a alg\u00fan otro lugar y la mayor parte del tiempo est\u00e1 esperando una respuesta.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSimplemente se sienta y espera. Esto no es muy bueno. Cuando llegan 100,000 usuarios, se vuelve muy dif\u00edcil. Por lo tanto, propongamos un simple ejemplo de aplicaci\u00f3n. Buscaremos im\u00e1genes, por ejemplo, de gatitos. Solo que no buscaremos as\u00ed, ampliaremos las palabras clave y, si el usuario busca 'gatitos', le encontraremos gatitos, peluditos y dem\u00e1s. Para empezar, necesitamos obtener los datos de la solicitud en el backend. Se ve as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDos l\u00edneas te permiten obtener los par\u00e1metros GET, sin complicaciones. Luego, por ejemplo, desde la base de datos con una tabla de palabras clave y extensiones obtenemos esta informaci\u00f3n mediante una consulta SQL normal. Es simple. Se ve as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nConectamos la biblioteca <code>resty.mysql<\/code>, que ya tenemos en el paquete. No necesitamos instalar nada, todo est\u00e1 listo. Indicamos c\u00f3mo conectarnos y hacemos la consulta SQL:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAqu\u00ed se siente un poco aterrador, pero todo funciona. Aqu\u00ed 10 es el l\u00edmite. Extraemos 10 registros, somos perezosos, no queremos mostrar m\u00e1s. Olvid\u00e9 sobre el l\u00edmite en SQL.<\/p>\n<p>A continuaci\u00f3n, encontramos im\u00e1genes para todas las consultas. Reunimos un mont\u00f3n de consultas y llenamos una tabla Lua, que se llama <code>reqs<\/code>, y hacemos <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTodas estas consultas se env\u00edan en paralelo, y recibimos respuestas. El tiempo de trabajo es igual al tiempo de respuesta del m\u00e1s lento. Si todos responden en 50 milisegundos y enviamos un centenar de consultas, la respuesta nos llegar\u00e1 en 50 milisegundos.<\/p>\n<p>Como somos perezosos y no queremos escribir la gesti\u00f3n de HTTP y cach\u00e9, haremos que NGINX haga todo por nosotros. Como vieron, hab\u00eda una consulta a <code>url\/fetch<\/code>, aqu\u00ed est\u00e1:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nHacemos un simple <code>proxy_pass<\/code>, indicamos d\u00f3nde cach\u00e9 y c\u00f3mo hacerlo, y todo funciona.<\/p>\n<p>Pero eso no es suficiente, tambi\u00e9n necesitamos entregar datos al usuario. La idea m\u00e1s simple es serializar todo en JSON, f\u00e1cil, en dos l\u00edneas. Devolvemos el Content-Type, devolvemos JSON.<\/p>\n<p>Pero hay una complicaci\u00f3n: el usuario no quiere leer JSON. Necesitamos atraer a los frontenders. A veces no queremos hacer esto al principio. Y los SEO dir\u00e1n que si estamos buscando im\u00e1genes, no les importa. Pero si les damos alg\u00fan contenido, dir\u00e1n que nuestros motores de b\u00fasqueda no indexan nada.<\/p>\n<p>\u00bfQu\u00e9 hacer con esto? Por supuesto, vamos a entregar HTML al usuario. Generarlo manualmente no es pr\u00e1ctico, as\u00ed que queremos usar plantillas. Para esto hay una biblioteca <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProbablemente vieron tres letras temibles OPM. OpenResty viene con su propio gestor de paquetes, a trav\u00e9s del cual se pueden instalar muchos otros m\u00f3dulos, en particular, <code>lua-resty-template<\/code>. Este es un motor de plantillas simple, similar a las plantillas de Django. Se puede escribir c\u00f3digo y hacer sustituci\u00f3n de variables.<\/p>\n<p>Como resultado, todo se ver\u00e1 aproximadamente as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTomamos los datos y renderizamos la plantilla en dos l\u00edneas nuevamente. El usuario est\u00e1 feliz, recibi\u00f3 gatitos. Como ampliamos la consulta, tambi\u00e9n recibi\u00f3 un lobo marino. Qui\u00e9n sabe, tal vez estaba buscando espec\u00edficamente eso, pero no pudo formular correctamente su consulta.<\/p>\n<p>Todo genial, pero estamos en desarrollo, y no queremos mostrar nada a los usuarios todav\u00eda. Hagamos autorizaci\u00f3n. Para hacer esto, veamos c\u00f3mo NGINX maneja la consulta en t\u00e9rminos de OpenResty:<\/p>\n<ul>\n<li>La primera fase es <strong>-token y<\/strong>, cuando el usuario acaba de llegar y lo observamos a trav\u00e9s de los encabezados, la direcci\u00f3n IP y otros datos. Podemos desconectarlo de inmediato si no nos agrada. Esto se puede usar para la autorizaci\u00f3n, o si recibimos demasiadas solicitudes, podemos eliminarlas f\u00e1cilmente en esta fase.<\/li>\n<li><strong>rewrite<\/strong>. Reescribimos algunos datos de la solicitud.<\/li>\n<li><strong>texto alternativo<\/strong>. Le proporcionamos contenido al usuario.<\/li>\n<li><strong>filtro de encabezados<\/strong>. Modificamos los encabezados de respuesta. Si hemos utilizado <code>proxy_pass<\/code>, podemos reescribir algunos encabezados antes de entregarlos al usuario.<\/li>\n<li><strong>filtro de cuerpo<\/strong>. Podemos modificar el cuerpo.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 registro. Se pueden escribir registros en Elasticsearch sin capa adicional.<\/li>\n<\/ul>\n<p>\nNuestra autorizaci\u00f3n se ver\u00e1 aproximadamente as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nLo a\u00f1adiremos a la <code>ubicaci\u00f3n<\/code>, que hemos descrito anteriormente, y agregaremos este c\u00f3digo:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVerificamos si tenemos el token de cookie. Si no, redirigimos a la autorizaci\u00f3n. Los usuarios son astutos y pueden adivinar que necesitan establecer el token de cookie. Por lo tanto, tambi\u00e9n lo almacenaremos en Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nEl c\u00f3digo para trabajar con Redis es muy simple y no se diferencia de otros lenguajes. Adem\u00e1s, toda la entrada\/salida, tanto all\u00ed como aqu\u00ed, es no bloqueante. Si escribes c\u00f3digo s\u00edncrono, funcionar\u00e1 de manera as\u00edncrona. Es algo similar a gevent, solo que bien implementado.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHagamos la autorizaci\u00f3n en s\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDecimos que necesitamos leer el cuerpo de la solicitud. Obtenemos los argumentos POST, verificamos que el nombre de usuario y la contrase\u00f1a sean correctos. Si son incorrectos, redirigimos a la autorizaci\u00f3n. Pero si son correctos, almacenamos el token en Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNo olvides establecer la cookie, tambi\u00e9n se hace en dos l\u00edneas:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: transformamos NGINX en un servidor de aplicaciones completo\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEjemplo simple y te\u00f3rico. Por supuesto, no vamos a hacer un servicio que muestre gatitos a la gente. Aunque qui\u00e9n sabe. As\u00ed que echemos un vistazo a lo que se puede hacer en producci\u00f3n.<\/p>\n<ul>\n<li><strong>Backend minimalista<\/strong>. A veces necesitamos proporcionar solo unos pocos datos al backend: en alg\u00fan lugar necesitamos insertar una fecha, en alg\u00fan otro, mostrar una lista, decir cu\u00e1ntos usuarios hay en el sitio, adjuntar un contador o estad\u00edsticas. Algo peque\u00f1o. Se pueden hacer trozos m\u00ednimos muy f\u00e1cilmente. Con esto, se puede lograr r\u00e1pido, f\u00e1cil y genial.\n<\/li>\n<li><strong>Preprocesamiento de datos<\/strong>. A veces queremos integrar anuncios en nuestra p\u00e1gina, y obtenemos esos anuncios a trav\u00e9s de solicitudes API. Esto es muy f\u00e1cil de hacer aqu\u00ed. No sobrecargamos nuestro backend, que ya trabaja duro. Podemos tomar y reunir aqu\u00ed. Podemos crear alg\u00fan JS o, por el contrario, desmontar algo, preprocesar algo antes de entregarlo al usuario.\n<\/li>\n<li><strong>Interfaz para microservicios<\/strong>. Este tambi\u00e9n es un muy buen caso, lo he implementado. Antes trabajaba en una empresa llamada Tenzor, que se ocupa de la contabilidad electr\u00f3nica, proporcionando contabilidad a aproximadamente la mitad de las entidades legales del pa\u00eds. Creamos un servicio, y muchas de las funcionalidades all\u00ed est\u00e1n hechas utilizando este mismo mecanismo: enrutamiento, autorizaci\u00f3n y m\u00e1s.<br \/>\nOpenResty se puede usar como pegamento para tus microservicios, que proporcionar\u00e1 acceso \u00fanico a todo y una interfaz unificada. Dado que los microservicios pueden estar escritos de tal manera que aqu\u00ed tienes Node.js, aqu\u00ed PHP, aqu\u00ed Python, y aqu\u00ed hay algo en Erlang, entendemos que no queremos reescribir el mismo c\u00f3digo en todas partes. Por lo tanto, OpenResty se puede integrar en el frontend.<\/p>\n<\/li>\n<li><strong>Estad\u00edsticas y an\u00e1lisis<\/strong>. Normalmente, NGINX se coloca en la entrada, y todas las solicitudes pasan a trav\u00e9s de \u00e9l. Es en este lugar donde es muy conveniente recopilar datos. Se puede calcular algo de inmediato y enviarlo a alg\u00fan lugar, por ejemplo, Elasticsearch, Logstash o simplemente registrar en log y luego enviarlo a alg\u00fan lugar.\n<\/li>\n<li><strong>Sistemas multipleyado<\/strong>. Por ejemplo, los juegos en l\u00ednea tambi\u00e9n se realizan muy bien. Hoy en Ciudad del Cabo, Alexander Gladys va a hablar sobre c\u00f3mo prototipar r\u00e1pidamente un juego multijugador utilizando OpenResty.\n<\/li>\n<li><strong>Filtrado de solicitudes (WAF)<\/strong>. Actualmente est\u00e1 de moda crear firewalls para aplicaciones web, hay muchos servicios que los proporcionan. Con OpenResty puedes crear tu propio firewall para aplicaciones web que filtrar\u00e1 solicitudes de manera simple y eficaz seg\u00fan tus requisitos. Si tienes Python, sabes que PHP no se inyectar\u00e1 en tu sistema, a menos que lo inicies desde la consola. Sabes que tienes MySQL y Python. Puede que intenten hacer alg\u00fan tipo de directory traversal e inyectar algo en la base de datos. Por lo tanto, se pueden filtrar solicitudes sospechosas de forma r\u00e1pida y econ\u00f3mica directamente en el frontend.\n<\/li>\n<li><strong>Comunidad.<\/strong> Dado que OpenResty est\u00e1 construido sobre NGINX, tiene una ventaja: es <strong>la comunidad de NGINX<\/strong>Es muy amplio, y una buena parte de las preguntas que se plantear\u00e1n al principio ya han sido resueltas por la comunidad de NGINX.\n<p><strong>Desarrolladores de Lua<\/strong>Ayer habl\u00e9 con algunos chicos que asistieron al d\u00eda de capacitaci\u00f3n de HighLoad++ y escuch\u00e9 que solo Tarantool est\u00e1 escrito en Lua. Esto no es cierto, se ha escrito mucho en Lua. Ejemplos: OpenResty, servidor XMPP Prosody, motor de juegos Love2D, scripts de Lua en Warcraft y en otros lugares. Hay muchos desarrolladores de Lua, tienen una comunidad grande y receptiva. Todas mis preguntas sobre Lua se resolvieron en unas pocas horas. Cuando escribes a la lista de correos, literalmente en unos minutos ya hay un mont\u00f3n de respuestas, explican qu\u00e9 y c\u00f3mo, qu\u00e9 a qu\u00e9. Es genial. Lamentablemente, no en todas partes hay una comunidad tan solidaria.<br \/>\nEn OpenResty hay GitHub, donde se puede abrir un issue si algo se rompe. Hay una lista de correos en Google Groups donde se pueden discutir cuestiones generales, hay una lista en chino, por si acaso, quiz\u00e1s no dominas el ingl\u00e9s pero sabes chino.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Resultados<\/h1>\n<p><\/p>\n<ul>\n<li>Espero haber logrado transmitir que OpenResty es un marco de trabajo muy conveniente, dise\u00f1ado para la web.<\/li>\n<li>Tiene un bajo umbral de entrada, ya que el c\u00f3digo es similar a lo que escribimos, el lenguaje es bastante simple y minimalista.<\/li>\n<li>Proporciona I\/O as\u00edncrono sin callbacks, no tendremos la confusi\u00f3n que a veces podemos escribir en NodeJS.<\/li>\n<li>Su despliegue es sencillo, ya que solo necesitamos NGINX con el m\u00f3dulo necesario y nuestro c\u00f3digo, y todo funciona de inmediato.<\/li>\n<li>Una comunidad grande y receptiva.<\/li>\n<\/ul>\n<p>\nNo cont\u00e9 en detalles c\u00f3mo se hace la enrutaci\u00f3n, porque se volvi\u00f3 una historia muy larga.<\/p>\n<p>\u00a1Gracias por su atenci\u00f3n!<\/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=\"Reproducir 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\">Vladimir Protasov - OpenResty: Transformando NGINX en un servidor de aplicaciones completo<\/a><\/noindex><\/em><br \/>\n<br \/>Fuente: <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.2 - 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\/es\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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: transformando NGINX en un servidor de aplicaciones completo | ProHoster","description":"Publicamos nuevamente la transcripci\u00f3n.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}