{"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\/it\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","title":{"rendered":"OpenResty: trasformiamo NGINX in un server applicazioni completo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Pubbliciamo di nuovo la trascrizione della relazione della conferenza <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex> 2016, che si \u00e8 tenuta a Skolkovo, nei sobborghi di Mosca, il 7-8 novembre dello scorso anno. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> spiega come estendere le funzionalit\u00e0 di NGINX utilizzando OpenResty e Lua.<\/em><\/p>\n<p>Ciao a tutti, sono Vladimir Protasov e lavoro in Parallels. Vi racconter\u00f2 un po' di me. Ho trascorso tre quarti della mia vita scrivendo codice. Sono diventato un programmatore fino al midollo, nel senso letterale del termine: a volte sogno il codice. Un quarto della mia vita - sviluppo industriale, scrittura di codice che va direttamente in produzione. Il codice che alcuni di voi utilizzano senza rendersi conto.<\/p>\n<p>Per farvi capire quanto fosse difficile. Quando ero un piccolo junior, arrivai e mi furono date queste enormi basi da due terabyte. Ora qui tutti sono highload. Andavo alle conferenze e chiedevo: \u00abRagazzi, raccontatemi, avete big data, tutto fantastico? Quante basi avete?\u00bb. Mi rispondevano: \u00abAbbiamo 100 gigabyte!\u00bb Io dicevo: \u00abFantastico, 100 gigabyte!\u00bb E pensavo come mantenere un po\u2019 di poker face. Pensavi che s\u00ec, ragazzi, sono bravi, poi torni indietro e ti trovi a combattere con queste basi multi-terabyte. E questo - essendo un junior. Vi rendete conto di che colpo?<\/p>\n<p>Conosco pi\u00f9 di 20 linguaggi di programmazione. \u00c8 ci\u00f2 di cui ho dovuto occuparmi nel corso del lavoro. Ti danno codice in Erlang, C, C++, Lua, Python, Ruby, e altro, e devi fare tutto tu. Alla fine ci ho dovuto fare i conti. Non sono riuscito a contare esattamente il numero, ma ho perso il conto a circa 20.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDato che tutti i presenti sanno cosa sia Parallels e cosa facciamo, non parler\u00f2 di quanto siamo bravi e cosa facciamo. Dir\u00f2 solo che abbiamo 13 uffici in tutto il mondo, pi\u00f9 di 300 dipendenti, sviluppo a Mosca, Tallin e Malta. Se volete, potete trasferirvi a Malta, se d'inverno fa freddo e volete scaldarvi.<\/p>\n<p>Il nostro dipartimento specifico scrive in Python 2. Ci occupiamo di affari e non abbiamo tempo per implementare tecnologie alla moda, quindi soffriamo. Abbiamo Django, perch\u00e9 ha tutto, mentre abbiamo scartato ci\u00f2 che era superfluo. Utilizziamo anche MySQL, Redis e NGINX. Abbiamo inoltre molte altre cose interessanti. Abbiamo MongoDB, abbiamo conigli che corrono, abbiamo di tutto - ma non \u00e8 roba mia e non mi occupo di questo.<\/p>\n<h1>OpenResty<\/h1>\n<p>\nHo parlato di me. Adesso vediamo di cosa parler\u00f2 oggi:<\/p>\n<ul>\n<li>Cos'\u00e8 OpenResty e come si usa?<\/li>\n<li>Perch\u00e9 inventare un altro ciclismo, quando abbiamo Python, NodeJS, PHP, Go e altre fantastiche tecnologie di cui tutti sono contenti?<\/li>\n<li>E un po' di esempi dalla vita reale. Ho dovuto ridurre drasticamente la presentazione, perch\u00e9 mi risultava di 3,5 ore, quindi ci saranno pochi esempi.<\/li>\n<\/ul>\n<p>\nOpenResty \u00e8 NGINX. Grazie a lui abbiamo un server web completo, ben scritto e veloce. Penso che la maggior parte di noi utilizzi NGINX in produzione. Tutti sapete che \u00e8 veloce e fantastico. Ha un'eccellente gestione dell'input\/output sincrono, quindi non dobbiamo reinventare la ruota come \u00e8 successo con gevent in Python. Gevent \u00e8 fantastico, ma se scrivete del codice in C e qualcosa va storto, con gevent vi sarete completamente impazziti a fare debug. Ho avuto un'esperienza del genere: ci sono voluti ben due giorni per capire cosa fosse andato storto. Se qualcuno non avesse scavato per settimane prima, non avesse trovato il problema, non avesse scritto su Internet e Google non lo avesse trovato, saremmo impazziti.<\/p>\n<p>In NGINX ci sono gi\u00e0 caching e contenuti statici. Non dovete affannarvi per capire come farlo bene, per non avere rallentamenti o per non perdere descrittori. Nginx \u00e8 molto facile da implementare, non dovete preoccuparvi di cosa usare: WSGI, PHP-FPM, Gunicorn, Unicorn. Si installa Nginx, lo si passa agli amministratori e sanno come gestirlo. Nginx elabora le richieste in modo strutturato. Ne parler\u00f2 un po' pi\u00f9 avanti. Brevemente, ha una fase in cui riceve la richiesta, una in cui la elabora e una in cui restituisce il contenuto all'utente.<\/p>\n<p>Nginx \u00e8 fantastico, ma c'\u00e8 un problema: non \u00e8 abbastanza flessibile, nonostante tutte quelle fantastiche funzionalit\u00e0 che gli sviluppatori hanno inserito nella configurazione, pur potendo essere personalizzato. Questa potenza non basta. Cos\u00ec, il team di Taobao, circa otto anni fa, ha integrato Lua. Cosa offre?<\/p>\n<ul>\n<li><strong>Dimensione<\/strong>. \u00c8 leggero. LuaJIT ha un overhead di circa 100-200 kilobyte di memoria e un overhead minimo in termini di prestazioni.<\/li>\n<li><strong>Velocit\u00e0<\/strong>. L'interprete LuaJIT in molte situazioni \u00e8 vicino a C, in alcune situazioni perde contro Java, in altre la supera. Per un certo periodo \u00e8 stato considerato il miglior JIT compiler. Ora ci sono compilatori migliori, ma molto pi\u00f9 pesanti, come V8. Alcuni interpreti JS e il HotSpot di Java sono pi\u00f9 veloci in certi punti, ma in alcune situazioni continuano a perdere.<\/li>\n<li><strong>Semplicit\u00e0 nell'apprendimento<\/strong>. Se, ad esempio, hai una base di codice in Perl e non sei Booking, non troverai programmatori Perl. Perch\u00e9 non ci sono, sono stati tutti presi, e insegnarli \u00e8 lungo e difficile. Se hai bisogno di programmatori in qualcosa d'altro, probabilmente dovrai anche riqualificarli o trovarli. Nel caso di Lua, \u00e8 tutto semplice. Lua pu\u00f2 essere appreso da qualsiasi junior in tre giorni. Ho impiegato circa due ore per capire. Dopo due ore stavo gi\u00e0 scrivendo codice in produzione. Dopo circa una settimana il codice era gi\u00e0 in produzione.<\/li>\n<\/ul>\n<p>\nIl risultato appare cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nC'\u00e8 molto qui. In OpenResty hanno messo insieme un sacco di moduli, sia Lua che di NGINX. E hai tutto pronto - hai deployato e funziona.<\/p>\n<h1>Esempi<\/h1>\n<p>\nBasta con la lirica, passiamo al codice. Ecco un semplice Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCosa c'\u00e8 qui? Questo \u00e8 un location di NGINX. Non ci preoccupiamo, non scriviamo il nostro routing, non prendiamo qualcosa di pronto - abbiamo gi\u00e0 tutto in NGINX, viviamo bene e comodamente.<\/p>\n<p><code>content_by_lua_block<\/code> \u00e8 un blocco che indica che restituiamo contenuti tramite uno script Lua. Prendiamo la variabile di NGINX <code>remote_addr<\/code> e la passiamo a <code>string.format<\/code>. \u00c8 esattamente la stessa cosa, solo in Lua, solo che corretta. E restituiamo al cliente. <code>sprintf<\/code>Il risultato apparir\u00e0 cos\u00ec:<\/p>\n<p>Ma torniamo nel mondo reale. In produzione nessuno deploya Hello World. Le nostre applicazioni di solito si connettono a un database o altrove e passano la maggior parte del tempo ad aspettare una risposta.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSemplicemente siedono e aspettano. Questo non \u00e8 molto buono. Quando arrivano 100.000 utenti, diventa molto difficile. Quindi, per esempio, costruiamo una semplice applicazione. Cercheremo immagini, ad esempio, di gatti. Non ci limiteremo a cercare, espanderemo le parole chiave e, se l'utente cerca 'gattini', gli troveremo gatti, pelosi e altro ancora. Prima di tutto, dobbiamo ottenere i dati della richiesta nel backend. Ecco come appare:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDue righe ti permettono di recuperare i parametri GET, nessuna complessit\u00e0. Dopodich\u00e9, ad esempio, possiamo recuperare queste informazioni da un database con una tabella per parola chiave ed estensione tramite una normale query SQL. \u00c8 tutto semplice. Ecco come appare:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nConnettiamo la libreria<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nresty.mysql <code>, che abbiamo gi\u00e0 nel pacchetto. Non dobbiamo installare nulla, \u00e8 tutto pronto. Indichiamo come connetterci e facciamo la query SQL:<\/code>, che abbiamo gi\u00e0 in dotazione. Non dobbiamo installare nulla, \u00e8 tutto pronto. Indichiamo come collegarci e facciamo la query SQL:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/2234b3a5b2e1d8efafec00a49f1a13b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nQui \u00e8 un po' spaventoso, ma tutto funziona. Qui 10 - \u00e8 il limite. Ricaviamo 10 registrazioni, siamo pigri e non vogliamo mostrare di pi\u00f9. Ho dimenticato del limite in SQL.<\/p>\n<p>Successivamente, troviamo le immagini per tutte le richieste. Raccogliamo un pacchetto di richieste e riempiamo una tabella Lua chiamata <code>reqs<\/code>, e facciamo <code>ngx.location.capture_multi<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/c18171845b3bd3872c4a7a7feae0d4bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTutte queste richieste vanno in parallelo e riceviamo le risposte. Il tempo di esecuzione \u00e8 pari al tempo di risposta di quella pi\u00f9 lenta. Se tutte le nostre risposte sono in 50 millisecondi e abbiamo inviato cento richieste, la risposta arriver\u00e0 in 50 millisecondi.<\/p>\n<p>Poich\u00e9 siamo pigri e non vogliamo scrivere la gestione HTTP e la memorizzazione nella cache, costringeremo NGINX a fare tutto per noi. Come hai visto, c'era una richiesta a <code>url\/fetch<\/code>, ecco qui:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nFacciamo una semplice <code>proxy_pass<\/code>, indichiamo dove memorizzare nella cache, come farlo, e tutto funziona.<\/p>\n<p>Ma non basta, dobbiamo anche restituire i dati all'utente. L'idea pi\u00f9 semplice \u00e8 serializzare tutto in JSON, facile, in due righe. Restituiamo il Content-Type, restituiamo JSON.<\/p>\n<p>Ma c'\u00e8 una difficolt\u00e0: l'utente non vuole leggere JSON. Dobbiamo coinvolgere i frontendisti. A volte, inizialmente non ci va di farlo. E anche i SEO diranno che se stiamo cercando immagini, a loro non importa. Ma se forniamo qualche contenuto, diranno che i motori di ricerca non indicizzano nulla.<\/p>\n<p>Cosa fare a riguardo? Naturalmente, restituiremo all'utente HTML. Generarlo a mano non \u00e8 comodo, quindi vogliamo usare dei template. Per questo esiste la libreria <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProbabilmente hai visto tre lettere spaventose OPM. OpenResty viene con il suo gestore di pacchetti, attraverso il quale \u00e8 possibile installare un sacco di moduli diversi, in particolare, <code>lua-resty-template<\/code>. \u00c8 un motore di template semplice, simile ai template di Django. Puoi scrivere codice e fare sostituzioni di variabili.<\/p>\n<p>Di conseguenza, tutto apparir\u00e0 pi\u00f9 o meno cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/b54497e4f1ab5a80183dc49c172a7f15.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAbbiamo preso i dati e abbiamo reso il template, di nuovo in due righe. L'utente \u00e8 felice, ha ricevuto dei gattini. Poich\u00e9 abbiamo ampliato la richiesta, ha ricevuto anche un foca. Chi lo sa, forse stava cercando proprio quello, ma non riusciva a formulare correttamente la sua richiesta.<\/p>\n<p>Tutto \u00e8 fantastico, ma siamo in fase di sviluppo e non vogliamo ancora mostrarlo agli utenti. Facciamo l'autenticazione. Per farlo, vediamo come NGINX gestisce le richieste in termini di OpenResty:<\/p>\n<ul>\n<li>La prima fase - <strong>access<\/strong>, quando l'utente \u00e8 appena arrivato, e lo abbiamo guardato in base ai titoli, all'indirizzo IP e ad altri dati. Possiamo subito disconnetterlo se non ci piace. Questo pu\u00f2 essere utilizzato per l'autenticazione, oppure, se riceviamo molte richieste, possiamo facilmente interromperle in questa fase.<\/li>\n<li><strong>riscrivere<\/strong>. Riscriviamo alcuni dati della richiesta.<\/li>\n<li><strong>content<\/strong>. Forniamo il contenuto all'utente.<\/li>\n<li><strong>filtro intestazioni<\/strong>. Modifichiamo le intestazioni della risposta. Se abbiamo utilizzato <code>proxy_pass<\/code>, possiamo riscrivere alcune intestazioni prima di fornire il contenuto all'utente.<\/li>\n<li><strong>filtro corpo<\/strong>. Possiamo modificare il corpo.<\/li>\n<li><strong>registro<\/strong>\u00a0\u2014 registrazione. Possiamo scrivere log in elasticsearch senza un ulteriore strato.<\/li>\n<\/ul>\n<p>\nLa nostra autenticazione apparir\u00e0 pi\u00f9 o meno cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAggiungeremo questo a quel <code>location<\/code>, che abbiamo descritto in precedenza, e inseriremo un codice del genere:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nControlliamo se abbiamo un token cookie. Se non ce l'abbiamo, rimandiamo all'autenticazione. Gli utenti sono astuti e possono indovinare che devono impostare un token cookie. Pertanto, lo salveremo anche in Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nIl codice per lavorare con Redis \u00e8 molto semplice e non differisce da altri linguaggi. Inoltre, tutto l'input\/output, sia l\u00ec che qui, \u00e8 non bloccante. Se scrivi codice sincrono, funziona in modo asincrono. Circa come con gevent, solo fatto bene.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFacciamo l'autenticazione stessa:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/0b3b486ca3c417716ebdaac189bfdcbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDiciamo che dobbiamo leggere il corpo della richiesta. Otteniamo gli argomenti POST, controlliamo che login e password siano corretti. Se non lo sono, rimandiamo all'autenticazione. Ma se sono corretti, salveremo il token in Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNon dimentichiamo di impostare il cookie, questo si fa anche in due righe:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicazioni completo\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn esempio semplice, ipotetico. Certamente non faremo un servizio che mostra gattini alle persone. Anche se chi lo sa. Quindi esaminiamo ci\u00f2 che \u00e8 possibile fare in produzione.<\/p>\n<ul>\n<li><strong>Backend minimalista<\/strong>. A volte abbiamo bisogno di fornire al backend solo pochi dati: a volte dobbiamo inserire una data, a volte visualizzare una lista, dire quanti utenti ci sono attualmente sul sito, aggiungere un contatore o statistiche. Qualcosa di piccolo. Piccole sezioni minime possono essere fatte molto facilmente. Questo sar\u00e0 veloce, facile e magnifico.\n<\/li>\n<li><strong>Preprocessing dei dati<\/strong>. A volte vogliamo integrare nella nostra pagina pubblicit\u00e0, e prendiamo questa pubblicit\u00e0 tramite richieste API. \u00c8 molto facile fare tutto ci\u00f2 proprio qui. Non sovraccarichiamo il nostro backend, che gi\u00e0 lavora duramente. Possiamo raccogliere tutto qui. Possiamo creare del codice JS o, al contrario, separarlo, preprocessarlo prima di consegnarlo all'utente.\n<\/li>\n<li><strong>Facciata per microservizi<\/strong>. Questo \u00e8 anche un gran caso, l'ho realizzato. Prima lavoravo in un'azienda chiamata Tenzor, che si occupa di reportistica elettronica e garantisce la reportistica per circa la met\u00e0 delle persone giuridiche nel paese. Abbiamo creato un servizio, molte cose come la routing, l'autenticazione e altro sono state realizzate usando lo stesso meccanismo.<br \/>\nOpenResty pu\u00f2 essere usato come collante per i tuoi microservizi, fornendo un accesso unificato a tutto e una singola interfaccia. Poich\u00e9 i microservizi possono essere scritti in modo tale che qui hai Node.js, qui PHP, qui Python, qui c'\u00e8 qualcosa su Erlang, comprendiamo che non vogliamo riscrivere lo stesso codice ovunque. Quindi, OpenResty pu\u00f2 essere inserito nel frontend.<\/p>\n<\/li>\n<li><strong>Statistiche e analisi<\/strong>. Di solito, NGINX si trova all'ingresso e tutte le richieste passano attraverso di esso. Proprio in questo punto \u00e8 molto comodo raccogliere. Possiamo calcolare subito qualcosa e inviarlo da qualche parte, per esempio Elasticsearch, Logstash o semplicemente registrarlo nei log e poi inviarlo da qualche parte.\n<\/li>\n<li><strong>Sistemi multigiocatore<\/strong>. Ad esempio, \u00e8 anche molto buono fare giochi online. Oggi a Cape Town, Alexander Gladys parler\u00e0 di come prototipare rapidamente un gioco multigiocatore utilizzando OpenResty.\n<\/li>\n<li><strong>Filtraggio delle richieste (WAF)<\/strong>. Ora \u00e8 di moda creare firewall per applicazioni web, ci sono molti servizi che li offrono. Con OpenResty puoi creare un firewall per applicazioni web che filtrer\u00e0 facilmente le richieste secondo le tue esigenze. Se hai Python, capisci che PHP non sar\u00e0 mai iniettato, a meno che tu non lo avvii da console da qualche parte. Sai che hai MySQL e Python. Probabilmente, possono tentare di fare qualche tipo di directory traversal e iniettare qualcosa nel database. Pertanto, \u00e8 possibile filtrare rapidamente e a basso costo le richieste problematiche direttamente nel frontend.\n<\/li>\n<li><strong>Comunit\u00e0.<\/strong> Poich\u00e9 OpenResty \u00e8 costruito su NGINX, ha un vantaggio: \u00e8 <strong>la comunit\u00e0 NGINX<\/strong>. \u00c8 molto grande e una buena parte delle domande che avrete inizialmente sono gi\u00e0 state risolte dalla comunit\u00e0 NGINX.\n<p><strong>Sviluppatori Lua<\/strong>. Ieri ho parlato con alcuni ragazzi che sono venuti alla giornata di studio di HighLoad++ e ho sentito che solo Tarantool \u00e8 scritto in Lua. Non \u00e8 cos\u00ec, in Lua \u00e8 stato scritto molto altro. Esempi: OpenResty, server XMPP Prosody, motore di gioco Love2D, Lua viene utilizzato in Warcraft e in altri luoghi. Ci sono molti sviluppatori Lua, hanno una comunit\u00e0 grande e reattiva. Tutte le mie domande su Lua sono state risolte in poche ore. Quando scrivi alla mailing list, dopo pochi minuti hai gi\u00e0 un sacco di risposte che spiegano cosa e come, cosa significa. \u00c8 fantastico. Purtroppo, non ovunque c'\u00e8 una comunit\u00e0 cos\u00ec benevola.<br \/>\nPer OpenResty c'\u00e8 GitHub, dove si pu\u00f2 aprire un'issue se qualcosa non funziona. C'\u00e8 una mailing list su Google Groups dove si possono discutere questioni generali e una mailing list in cinese \u2014 magari non parlate inglese, ma conoscete il cinese.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Conclusioni<\/h1>\n<p><\/p>\n<ul>\n<li>Spero di aver riuscito a far capire che OpenResty \u00e8 un framework molto comodo, pensato per il web.<\/li>\n<li>Ha una bassa barriera d'ingresso, poich\u00e9 il codice \u00e8 simile a quello su cui scriviamo, il linguaggio \u00e8 piuttosto semplice e minimalista.<\/li>\n<li>Fornisce I\/O asincrono senza callback, non avremo spaghetti come a volte scriviamo in NodeJS.<\/li>\n<li>Ha un facile deployment, poich\u00e9 ci serve solo NGINX con il modulo necessario e il nostro codice, e tutto funziona immediatamente.<\/li>\n<li>Una comunit\u00e0 grande e reattiva.<\/li>\n<\/ul>\n<p>\nNon ho raccontato nei dettagli come funziona il routing, sarebbe diventato un racconto molto lungo.<\/p>\n<p>Grazie per l'attenzione!<\/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=\"Guarda il 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 \u2014 OpenResty: trasformiamo NGINX in un server applicazioni completo<\/a><\/noindex><\/em><br \/>\n<br \/>Fonte: <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.1.1 - 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\/it\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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: trasformiamo NGINX in un server applicazioni completo | ProHoster","description":"Pubblichiamo nuovamente la trascrizione.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/openresty-prevrashhaem-nginx-v-polnoczennyj-server-prilozhenij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/71378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=71378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/71378\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/71379"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=71378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=71378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=71378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}