{"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\/fr\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty : transformons NGINX en v\u00e9ritable serveur d'applications","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Nous publions \u00e0 nouveau la transcription de la pr\u00e9sentation lors de la conf\u00e9rence <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> de 2016, qui s'est tenue \u00e0 Skolkovo, pr\u00e8s de Moscou, les 7 et 8 novembre de l'ann\u00e9e derni\u00e8re. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> explique comment \u00e9tendre les fonctionnalit\u00e9s de NGINX avec OpenResty et Lua.<\/em><\/p>\n<p>Bonjour \u00e0 tous, je m'appelle Vladimir Protasov, je travaille chez Parallels. Permettez-moi de me pr\u00e9senter. J'ai pass\u00e9 les trois quarts de ma vie \u00e0 \u00e9crire du code. Je suis devenu programmeur dans tous les sens du terme : parfois, je vois du code m\u00eame dans mes r\u00eaves. Le quart de ma vie est d\u00e9di\u00e9 au d\u00e9veloppement industriel, l'\u00e9criture de code qui va directement en production. Le code que certains d'entre vous utilisent sans m\u00eame s'en rendre compte.<\/p>\n<p>Pour que vous compreniez \u00e0 quel point c'\u00e9tait difficile. Quand j'\u00e9tais un jeune junior, je suis arriv\u00e9, et on m'a donn\u00e9 des bases de donn\u00e9es de deux t\u00e9raoctets. Maintenant, tout le monde ici a des charges \u00e9lev\u00e9es. J'allais aux conf\u00e9rences, demandant : \u00ab Les gars, parlez-moi de votre big data, c'est g\u00e9nial ? Quelle taille ont vos bases ? \u00bb Ils r\u00e9pondaient : \u00ab Nous avons 100 gigaoctets ! \u00bb Je disais : \u00ab Super, 100 gigaoctets ! \u00bb Et en pensant pour moi-m\u00eame, comment garder un visage impassible. Vous vous dites, oui, ces gars-l\u00e0 sont impressionnants, puis vous revenez et vous luttez avec ces bases de donn\u00e9es multi-t\u00e9raoctets. Et c'\u00e9tait quand j'\u00e9tais junior. Vous imaginez quel coup c'\u00e9tait ?<\/p>\n<p>Je connais plus de 20 langages de programmation. C'est ce avec quoi j'ai d\u00fb m'attaquer au travail. On vous donne du code en Erlang, en C, en C++, en Lua, en Python, en Ruby, et vous devez tout traiter. En gros, il a fallu s'en occuper. Je n'ai jamais pu compter avec pr\u00e9cision, mais j'ai perdu le compte autour de 20.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPuisque tout le monde ici sait ce qu'est Parallels et ce que nous faisons, je ne vais pas parler de notre g\u00e9nialit\u00e9 et de nos activit\u00e9s. Je vais simplement dire que nous avons 13 bureaux dans le monde, plus de 300 employ\u00e9s, avec le d\u00e9veloppement \u00e0 Moscou, \u00e0 Tallinn et \u00e0 Malte. Si vous souhaitez, vous pouvez d\u00e9m\u00e9nager \u00e0 Malte, si l'hiver est trop froid et que vous voulez vous r\u00e9chauffer.<\/p>\n<p>Notre d\u00e9partement \u00e9crit sp\u00e9cifiquement en Python 2. Nous sommes en affaires et nous n'avons pas le temps d'impl\u00e9menter des technologies \u00e0 la mode, donc nous en souffrons. Nous avons Django, car il a tout ce dont nous avons besoin, et nous avons simplement \u00e9cart\u00e9 l'exc\u00e8s. \u00c9galement MySQL, Redis et NGINX. Nous avons aussi beaucoup d'autres outils int\u00e9ressants. Nous avons MongoDB, des lapins qui courent, nous avons de tout \u2014 mais ce n'est pas moi qui m'en occupe.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nJ'ai parl\u00e9 de moi. Voyons maintenant de quoi je vais parler aujourd'hui :<\/p>\n<ul>\n<li>Qu'est-ce qu'OpenResty et \u00e0 quoi \u00e7a sert ?<\/li>\n<li>Pourquoi r\u00e9inventer la roue alors que nous avons Python, NodeJS, PHP, Go et d'autres outils formidables dont tout le monde est satisfait ?<\/li>\n<li>Et un petit exemple de la vie r\u00e9elle. J'ai d\u00fb r\u00e9duire consid\u00e9rablement ma pr\u00e9sentation car elle durait 3,5 heures, donc il y aura peu d'exemples.<\/li>\n<\/ul>\n<p>\nOpenResty est NGINX. Gr\u00e2ce \u00e0 lui, nous avons un serveur web complet, bien \u00e9crit et rapide. Je pense que la plupart d'entre nous utilisent NGINX en production. Vous savez tous qu'il est rapide et formidable. Il inclut une entr\u00e9e\/sortie synchronis\u00e9e de qualit\u00e9, donc nous n'avons pas besoin de r\u00e9inventer la roue comme ce fut le cas avec gevent en Python. Gevent est super, g\u00e9nial, mais si vous \u00e9crivez du code en C et que quelque chose ne va pas, vous aurez du mal \u00e0 le d\u00e9boguer avec gevent. J'ai eu cette exp\u00e9rience : il m'a fallu deux jours pour comprendre ce qui n'allait pas. Si quelqu'un n'avait pas fouill\u00e9 pendant plusieurs semaines pour trouver le probl\u00e8me, ne l'avait pas publi\u00e9 sur Internet et que Google ne l'ait pas trouv\u00e9, nous aurions compl\u00e8tement perdu les p\u00e9dales.<\/p>\n<p>NGINX g\u00e8re d\u00e9j\u00e0 le cache et le contenu statique. Vous n'avez pas besoin de vous casser la t\u00eate sur la mani\u00e8re de le faire correctement, afin qu'il n'y ait pas de ralentissements ou que vous ne perdiez pas de descripteurs. Nginx est tr\u00e8s pratique \u00e0 d\u00e9ployer, vous ne devez pas vous soucier de quel outil utiliser \u2014 WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx est install\u00e9, remis aux administrateurs, qui savent comment travailler avec. Nginx traite les requ\u00eates de mani\u00e8re structur\u00e9e. J'en parlerai un peu plus tard. En r\u00e9sum\u00e9, il y a une phase lorsque la requ\u00eate est re\u00e7ue, une autre lorsque elle est trait\u00e9e, et enfin lorsque le contenu est envoy\u00e9 \u00e0 l'utilisateur.<\/p>\n<p>Nginx est g\u00e9nial, mais il a un petit probl\u00e8me : il n'est pas assez flexible, m\u00eame avec toutes les fonctionnalit\u00e9s impressionnantes que les d\u00e9veloppeurs ont int\u00e9gr\u00e9es dans la configuration, malgr\u00e9 les possibilit\u00e9s de personnalisation. Cette puissance manque. C'est pourquoi les d\u00e9veloppeurs de Taobao ont int\u00e9gr\u00e9 Lua il y a longtemps, il me semble il y a huit ans. Que permet-il ?<\/p>\n<ul>\n<li><strong>Taille<\/strong>. Il est l\u00e9ger. LuaJIT ajoute environ 100-200 Ko de surcharge m\u00e9moire et une surcharge minimale en termes de performance.<\/li>\n<li><strong>Vitesse<\/strong>. L'interpr\u00e9teur LuaJIT est proche de C dans de nombreuses situations, dans certains cas, il est moins performant que Java, et dans d'autres, il la devance. Pendant un certain temps, il \u00e9tait consid\u00e9r\u00e9 comme le meilleur, un compilateur JIT exceptionnel. Actuellement, il existe des compilateurs plus performants, mais ils sont tr\u00e8s lourds, comme V8. Certains interpr\u00e8tes JavaScript et le HotSpot de Java sont plus rapides dans certains cas, mais restent encore lents dans d'autres.<\/li>\n<li><strong>Simplicit\u00e9 d'apprentissage<\/strong>. Si par exemple, vous avez une base de code en Perl et que vous n'\u00eates pas Booking, vous ne trouverez pas de programmeurs Perl. Parce qu'ils n'existent pas, tous ont \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9s et il est long et difficile de les former. Si vous recherchez des programmeurs dans un autre langage, il se peut que vous deviez \u00e9galement les requalifier ou les trouver. Pour Lua, c'est simple. Un d\u00e9veloppeur junior peut apprendre Lua en trois jours. Il m'a fallu environ deux heures pour le comprendre. Apr\u00e8s deux heures, j'\u00e9crivais d\u00e9j\u00e0 du code en production. Environ une semaine plus tard, il a \u00e9t\u00e9 mis en production.<\/li>\n<\/ul>\n<p>\nEn cons\u00e9quence, cela ressemble \u00e0 ceci :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nIl y a beaucoup de choses ici. OpenResty a regroup\u00e9 des modules, \u00e0 la fois Lua et Engine. Et tout est pr\u00eat - d\u00e9ploy\u00e9 et \u00e7a fonctionne.<\/p>\n<h1>Exemples<\/h1>\n<p>\nAssez de lyrisme, passons au code. Voici un petit Hello World :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQu'y a-t-il ici ? C'est un location d'Engine. Nous ne nous compliquons pas la vie, nous n'\u00e9crivons pas notre propre routage, nous n'utilisons pas un routage d\u00e9j\u00e0 existant - nous avons d\u00e9j\u00e0 \u00e7a dans NGINX, nous vivons bien et paresseusement.<\/p>\n<p><code>content_by_lua_block<\/code> \u2013 c'est un bloc qui indique que nous livrons le contenu \u00e0 l'aide d'un script Lua. Nous prenons la variable d'Engine <code>remote_addr<\/code> et nous l'ins\u00e9rons dans <code>string.format<\/code>. C'est la m\u00eame chose que <code>sprintf<\/code>, mais en Lua, seulement correcte. Et nous le fournissons au client.<\/p>\n<p>En cons\u00e9quence, cela appara\u00eetra comme ceci :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMais revenons au monde r\u00e9el. En production, personne ne d\u00e9ploie Hello World. Nos applications vont g\u00e9n\u00e9ralement se connecter \u00e0 une base de donn\u00e9es ou \u00e0 un autre service et passent la plupart du temps \u00e0 attendre une r\u00e9ponse.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nElles attendent simplement. Ce n'est pas tr\u00e8s efficace. Lorsque 100 000 utilisateurs arrivent, c'est tr\u00e8s difficile pour nous. Donc, prenons comme exemple une application simple. Nous allons chercher des images, par exemple, de chats. Mais nous ne allons pas simplement chercher, nous allons \u00e9largir les mots-cl\u00e9s et, si un utilisateur recherche \"chatons\", nous lui trouverons des chats, des peluches, etc. Pour commencer, nous devons obtenir les donn\u00e9es de la requ\u00eate sur le backend. Voici \u00e0 quoi cela ressemble :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDeux lignes vous permettent de r\u00e9cup\u00e9rer les param\u00e8tres GET, rien de compliqu\u00e9. Ensuite, nous allons, par exemple, nous connecter \u00e0 la base de donn\u00e9es avec une table pour les mots-cl\u00e9s et les extensions en effectuant une simple requ\u00eate SQL pour obtenir ces informations. C'est facile. Voici \u00e0 quoi cela ressemble :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous connectons la biblioth\u00e8que <code>resty.mysql<\/code>, qui est d\u00e9j\u00e0 incluse dans notre ensemble. Nous n'avons rien \u00e0 installer, tout est pr\u00eat. Nous sp\u00e9cifions comment nous connecter et faisons la requ\u00eate SQL :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nC'est un peu effrayant ici, mais tout fonctionne. Ici, 10 - c'est la limite. Nous extrayons 10 enregistrements, nous sommes paresseux, nous ne voulons pas en montrer plus. J'ai oubli\u00e9 de parler de la limite en SQL.<\/p>\n<p>Ensuite, nous trouvons des images pour toutes les requ\u00eates. Nous collectons un ensemble de requ\u00eates et remplissons une table Lua qui s'appelle <code>reqs<\/code>, et faisons <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nToutes ces requ\u00eates sont envoy\u00e9es en parall\u00e8le, et nous recevons des r\u00e9ponses. Le temps d'ex\u00e9cution est \u00e9gal au temps de r\u00e9ponse du plus lent. Si nous avons toutes les r\u00e9ponses en 50 millisecondes, et que nous avons envoy\u00e9 une centaine de requ\u00eates, la r\u00e9ponse nous parviendra en 50 millisecondes.<\/p>\n<p>Puisque nous sommes paresseux et que nous ne voulons pas \u00e9crire de traitement HTTP et de mise en cache, nous allons faire en sorte que NGINX fasse tout pour nous. Comme vous l'avez vu, il y avait une requ\u00eate pour <code>url\/fetch<\/code>, la voici :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNous faisons un simple <code>proxy_pass<\/code>, en indiquant o\u00f9 mettre en cache, comment le faire, et tout fonctionne.<\/p>\n<p>Mais cela ne suffit pas, nous devons aussi remettre les donn\u00e9es \u00e0 l'utilisateur. L'id\u00e9e la plus simple est de tout s\u00e9rialiser en JSON, facilement, en deux lignes. On donne le Content-Type, on renvoie le JSON.<\/p>\n<p>Mais il y a une difficult\u00e9 : l'utilisateur ne veut pas lire le JSON. Il faut attirer les front-enders. Parfois, nous ne voulons pas vraiment faire cela au d\u00e9part. Et puis les SEO diront que s'ils cherchent des images, cela leur est \u00e9gal. Mais s'ils re\u00e7oivent un contenu quelconque, ils diront que nos moteurs de recherche n'indexent rien.<\/p>\n<p>Que faire avec \u00e7a ? Naturellement, nous allons envoyer HTML \u00e0 l'utilisateur. G\u00e9n\u00e9rer manuellement - ce n'est pas id\u00e9al, donc nous voulons utiliser des mod\u00e8les. Pour cela, il y a une biblioth\u00e8que <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVous avez probablement vu les trois lettres effrayantes OPM. OpenResty vient avec son propre gestionnaire de paquets, \u00e0 travers lequel on peut installer une foule d'autres modules, notamment <code>lua-resty-template<\/code>. C'est un moteur de mod\u00e8les simple, proche des mod\u00e8les Django. On peut \u00e9crire du code et substitution de variables.<\/p>\n<p>En fin de compte, tout ressemblera \u00e0 ceci :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNous avons pris les donn\u00e9es et rendu le mod\u00e8le en deux lignes. L'utilisateur est heureux, il a re\u00e7u des chatons. Comme nous avons \u00e9largi la requ\u00eate, il a aussi re\u00e7u un veau de mer. Qui sait, peut-\u00eatre qu'il le cherchait mais ne pouvait pas formuler correctement sa demande.<\/p>\n<p>C'est g\u00e9nial, mais nous sommes en d\u00e9veloppement, et nous ne voulons pas encore montrer cela aux utilisateurs. Faisons une autorisation. Pour ce faire, voyons comment NGINX traite la requ\u00eate en termes d'OpenResty :<\/p>\n<ul>\n<li>La premi\u00e8re phase - <strong>un access<\/strong>, quand l'utilisateur vient juste d'arriver, et que nous l'avons regard\u00e9 \u00e0 travers les en-t\u00eates, l'adresse IP, et d'autres donn\u00e9es. Nous pouvons imm\u00e9diatement le couper s'il ne nous pla\u00eet pas. Cela peut \u00eatre utilis\u00e9 pour l'autorisation, ou si nous recevons trop de requ\u00eates, nous pouvons facilement les couper \u00e0 cette phase.<\/li>\n<li><strong>rewrite<\/strong>. Nous r\u00e9\u00e9crivons certaines donn\u00e9es de la requ\u00eate.<\/li>\n<li><strong>contenu<\/strong>. Nous donnons le contenu \u00e0 l'utilisateur.<\/li>\n<li><strong>filtre des en-t\u00eates<\/strong>. Nous modifions les en-t\u00eates de la r\u00e9ponse. Si nous avons utilis\u00e9 <code>proxy_pass<\/code>, nous pouvons r\u00e9\u00e9crire certains en-t\u00eates avant de les donner \u00e0 l'utilisateur.<\/li>\n<li><strong>filtre du corps<\/strong>. Nous pouvons modifier le corps.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 journalisation. Il est possible d'\u00e9crire des journaux dans elasticsearch sans couche suppl\u00e9mentaire.<\/li>\n<\/ul>\n<p>\nNotre autorisation ressemblera \u00e0 peu pr\u00e8s \u00e0 cela :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNous allons l'ajouter \u00e0 celui <code>location<\/code>, que nous avons d\u00e9crit auparavant, et y ins\u00e9rer ce code :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNous v\u00e9rifions si nous avons un cookie token. S'il n'y en a pas, nous dirigeons vers l'autorisation. Les utilisateurs sont fut\u00e9s et peuvent deviner qu'il faut mettre un cookie token. Donc, nous allons aussi le placer dans Redis :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nLe code de travail avec Redis est tr\u00e8s simple et ne diff\u00e8re en rien des autres langages. De plus, toutes les entr\u00e9es\/sorties l\u00e0-bas comme ici sont non-bloquantes. Si vous \u00e9crivez du code synchrone, cela fonctionne de mani\u00e8re asynchrone. Un peu comme avec gevent, mais fait correctement.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFaisons l'autorisation elle-m\u00eame :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNous disons que nous devons lire le corps de la requ\u00eate. Nous obtenons les arguments POST, v\u00e9rifions que le login et le mot de passe sont corrects. S'ils ne le sont pas, nous dirigeons vers l'autorisation. Mais s'ils sont corrects, nous \u00e9crivons le token dans Redis :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nN'oublions pas de placer un cookie, cela se fait \u00e9galement en deux lignes :<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty : transformons NGINX en v\u00e9ritable serveur d&#039;applications\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nC'est un exemple simple, th\u00e9orique. Bien s\u00fbr, nous ne ferons pas un service qui montre des chatons aux gens. Bien que qui sait. Donc, parcourons ce qui peut \u00eatre fait en production.<\/p>\n<ul>\n<li><strong>Backend minimaliste<\/strong>. Parfois, il nous faut fournir tr\u00e8s peu de donn\u00e9es au backend : parfois, il faut juste ins\u00e9rer une date, afficher une liste quelconque, dire combien d'utilisateurs sont sur le site, ajouter un compteur ou des statistiques. Quelque chose de petit. Des morceaux minimaux peuvent \u00eatre tr\u00e8s facilement r\u00e9alis\u00e9s. Cela permettra d'aller vite, facilement et efficacement.\n<\/li>\n<li><strong>Pr\u00e9traitement des donn\u00e9es<\/strong>. Parfois, nous voulons int\u00e9grer de la publicit\u00e9 dans notre page, et nous obtenons cette publicit\u00e9 via des requ\u00eates API. C'est tr\u00e8s facile \u00e0 faire ici. Nous ne surchargeons pas notre backend, qui travaille d\u00e9j\u00e0 dur. Nous pouvons le prendre et le collecter ici. Nous pouvons cr\u00e9er des JS ou, au contraire, les d\u00e9composer, pr\u00e9-traiter quelque chose avant de le remettre \u00e0 l'utilisateur.\n<\/li>\n<li><strong>Facade pour microservice<\/strong>. C'est aussi un tr\u00e8s bon cas d'utilisation, que j'ai r\u00e9alis\u00e9. Auparavant, je travaillais dans une entreprise nomm\u00e9e Tenzor, qui s'occupe de la d\u00e9claration \u00e9lectronique, fournissant des rapports pour environ la moiti\u00e9 des personnes morales dans le pays. Nous avons d\u00e9velopp\u00e9 un service, o\u00f9 beaucoup de choses ont \u00e9t\u00e9 r\u00e9alis\u00e9es gr\u00e2ce \u00e0 ce m\u00eame m\u00e9canisme : routage, autorisation et autres.<br \/>\nOpenResty peut \u00eatre utilis\u00e9 comme un lien pour vos microservices, qui offrira un acc\u00e8s unifi\u00e9 \u00e0 tout et une interface unique. \u00c9tant donn\u00e9 que les microservices peuvent \u00eatre \u00e9crits dans diff\u00e9rents langages \u2014 ici vous avez Node.js, l\u00e0 vous avez PHP, ici Python, et une chose en Erlang \u2014 nous comprenons que nous ne voulons pas r\u00e9\u00e9crire le m\u00eame code partout. C'est pourquoi vous pouvez mettre OpenResty \u00e0 l'avant.<\/p>\n<\/li>\n<li><strong>Statistiques et analyses<\/strong>. En g\u00e9n\u00e9ral, NGINX se trouve \u00e0 l'entr\u00e9e, et toutes les requ\u00eates le traversent. C'est ici qu'il est tr\u00e8s pratique de rassembler. Vous pouvez imm\u00e9diatement calculer quelque chose et l'envoyer quelque part, par exemple vers Elasticsearch, Logstash ou simplement l'enregistrer dans un journal et ensuite l'envoyer ailleurs.\n<\/li>\n<li><strong>Syst\u00e8mes multijoueurs<\/strong>. Par exemple, les jeux en ligne sont \u00e9galement tr\u00e8s adapt\u00e9s. Aujourd'hui \u00e0 Cape Town, Alexandre Gladych parlera de la mani\u00e8re de prototyper rapidement un jeu multijoueur \u00e0 l'aide d'OpenResty.\n<\/li>\n<li><strong>Filtrage des requ\u00eates (WAF)<\/strong>. Actuellement, il est \u00e0 la mode de cr\u00e9er divers pare-feux d'application web, il existe de nombreux services qui les fournissent. Avec OpenResty, vous pouvez cr\u00e9er un pare-feu d'application web qui filtrera facilement et simplement les requ\u00eates selon vos exigences. Si vous utilisez Python, vous savez que PHP ne pourra pas \u00eatre inject\u00e9, \u00e0 moins que vous ne le lan\u00e7iez depuis la console quelque part. Vous savez que vous avez MySQL et Python. Peut-\u00eatre que certaines personnes pourraient tenter de r\u00e9aliser un chemin de r\u00e9pertoire et d'injecter quelque chose dans la base. Donc, vous pouvez filtrer rapidement et \u00e0 moindre co\u00fbt les requ\u00eates suspectes directement \u00e0 l'avant.\n<\/li>\n<li><strong>Communaut\u00e9.<\/strong> \u00c9tant donn\u00e9 qu'OpenResty est bas\u00e9 sur NGINX, il a un avantage : c'est <strong>la communaut\u00e9 NGINX<\/strong>. C'est tr\u00e8s vaste, et une bonne partie des questions que vous pourriez avoir au d\u00e9but a d\u00e9j\u00e0 \u00e9t\u00e9 r\u00e9solue par la communaut\u00e9 NGINX.\n<p><strong>D\u00e9veloppeurs Lua<\/strong>. Hier, j'ai discut\u00e9 avec des gars qui \u00e9taient venus pour la journ\u00e9e de formation HighLoad++ et j'ai entendu dire que Tarantool \u00e9tait le seul projet \u00e9crit en Lua. Ce n'est pas vrai, beaucoup de choses sont \u00e9crites en Lua. Exemples : OpenResty, le serveur XMPP Prosody, le moteur de jeu Love2D, Lua est script\u00e9 dans Warcraft et ailleurs. Il y a beaucoup de d\u00e9veloppeurs Lua, ils ont une grande communaut\u00e9 r\u00e9active. Toutes mes questions sur Lua ont \u00e9t\u00e9 r\u00e9solues en quelques heures. Lorsque l'on \u00e9crit sur la liste de diffusion, litt\u00e9ralement quelques minutes plus tard, on re\u00e7oit d\u00e9j\u00e0 de nombreuses r\u00e9ponses avec des explications sur comment et pourquoi. C'est vraiment super. Malheureusement, cette communaut\u00e9 bienveillante n'est pas pr\u00e9sente partout.<br \/>\nIl y a un GitHub pour OpenResty, o\u00f9 vous pouvez cr\u00e9er une issue si quelque chose ne fonctionne pas. Il existe une liste de diffusion sur Google Groups pour discuter des questions g\u00e9n\u00e9rales, ainsi qu'une mailing list en chinois - au cas o\u00f9 vous ne ma\u00eetriseriez pas l'anglais mais que vous parliez chinois.<\/li>\n<\/ul>\n<p><\/p>\n<h1>R\u00e9sultats<\/h1>\n<p><\/p>\n<ul>\n<li>J'esp\u00e8re avoir pu exprimer que OpenResty est un framework extr\u00eamement pratique, con\u00e7u pour le web.<\/li>\n<li>Il a une faible barri\u00e8re \u00e0 l'entr\u00e9e, car le code ressemble \u00e0 ce sur quoi nous \u00e9crivons, le langage est assez simple et minimaliste.<\/li>\n<li>Il offre une entr\u00e9e\/sortie asynchrone sans callbacks, nous n'aurons pas de spaghetti comme cela peut parfois arriver dans Node.js.<\/li>\n<li>Son d\u00e9ploiement est facile, car nous avons juste besoin de NGINX avec le module requis et de notre code, et tout fonctionne imm\u00e9diatement.<\/li>\n<li>Une grande et r\u00e9active communaut\u00e9.<\/li>\n<\/ul>\n<p>\nJe n'ai pas expliqu\u00e9 en d\u00e9tail comment fonctionne le routage, cela aurait \u00e9t\u00e9 tr\u00e8s long.<\/p>\n<p>Merci de votre attention !<\/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=\"Lire la vid\u00e9o\" 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 : transformons NGINX en un v\u00e9ritable serveur d'applications<\/a><\/noindex><\/em><br \/>\n<br \/>Source : <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\/fr\/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=\"fr_FR\" \/>\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\/fr\/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\udd47 OpenResty : transformons NGINX en un v\u00e9ritable serveur d'applications | ProHoster","description":"Nous publions \u00e0 nouveau la transcription.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}