{"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 applicativo completo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/62eb484051c7963c96842393884ddd98.jpg\" style=\"display:block;margin: 0 auto;\" \/><em>Pubbliciamo nuovamente 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, nella regione di Mosca, dal 7 all'8 novembre dello scorso anno. <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/post\/315726\/\">Vladimir Protasov<\/a><\/noindex> spiega come espandere le funzionalit\u00e0 di NGINX con OpenResty e Lua.<\/em><\/p>\n<p>Ciao a tutti, sono Vladimir Protasov, lavoro in Parallels. Racconter\u00f2 un po' di me. Per tre quarti della mia vita mi occupo di scrivere codice. Sono diventato programmatore fino al midollo, nel senso letterale: a volte sogno di vedere codice. Un quarto della mia vita \u00e8 dedicato allo sviluppo industriale, scrivendo codice che va direttamente in produzione. \u00c8 il codice che alcuni di voi utilizzano, ma di cui non si rendono conto.<\/p>\n<p>Per farvi capire quanto era difficile. Quando ero un giovane junior, sono arrivato e mi hanno dato queste basi da due terabyte. Ora qui tutti hanno highload. Andavo a conferenze, chiedendo: \u00abRagazzi, raccontateci, avete big data, tutto fantastico? Quanti dati avete?\u00bb Mi rispondevano: \u00abAbbiamo 100 gigabyte!\u00bb E io dicevo: \u00abFantastico, 100 gigabyte!\u00bb Ma dentro pensavo a come mantenere un'espressione impassibile. Pensavi, s\u00ec, ragazzi sono bravi, e poi torni e ti ritrovi a barcamenarti con queste basi multiterabyte. Ed era cos\u00ec, essendo un junior. Potete immaginare quale colpo sia stato?<\/p>\n<p>Conosco pi\u00f9 di 20 linguaggi di programmazione. \u00c8 ci\u00f2 in cui ho dovuto districarmi durante il lavoro. Ti danno codice in Erlang, in C, in C++, in Lua, in Python, in Ruby e in qualcos'altro, e devi lavorarci su. In generale, \u00e8 stato necessario. Non sono riuscito a contare esattamente, ma si \u00e8 perso intorno a un numero di circa 20.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPoich\u00e9 tutti presenti sanno cos'\u00e8 Parallels e cosa facciamo, non parler\u00f2 di quanto siamo bravi e di cosa facciamo. Dir\u00f2 solo che abbiamo 13 uffici nel mondo, pi\u00f9 di 300 dipendenti, con sviluppo a Mosca, Tallinn e a Malta. Se si desidera, \u00e8 possibile trasferirsi a Malta se d'inverno fa freddo e si ha bisogno di scaldarsi.<\/p>\n<p>Il nostro team specificamente lavora con Python 2. Siamo nel settore business e non abbiamo tempo per implementare tecnologie alla moda, quindi soffriamo. Utilizziamo Django, perch\u00e9 contiene tutto il necessario, e abbiamo scartato il superfluo. Abbiamo anche MySQL, Redis e NGINX. E ancora, abbiamo molte altre cose interessanti. Abbiamo MongoDB, abbiamo conigli che corrono, abbiamo di tutto e di pi\u00f9, ma non \u00e8 il mio ambito 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 utilizza?<\/li>\n<li>Perch\u00e9 inventare un'altra bicicletta, quando abbiamo Python, NodeJS, PHP, Go e altre tecnologie fantastiche di cui tutti sono soddisfatti?<\/li>\n<li>E qualche esempio dalla vita reale. Ho dovuto ridurre notevolmente la mia presentazione, perch\u00e9 era di 3,5 ore, quindi gli esempi saranno pochi.<\/li>\n<\/ul>\n<p>\nOpenResty \u00e8 NGINX. Grazie a questo, abbiamo un server web completo, ben progettato e veloce. Credo che la maggior parte di noi utilizzi NGINX in produzione. Sapete tutti che \u00e8 veloce e potente. Ha un'ottima gestione dell'input\/output sincrono, quindi non dobbiamo reinventare la ruota come \u00e8 successo con gevent in Python. Gevent \u00e8 fantastico, ma se scrivete codice in C e qualcosa va storto, con gevent impazzirete a fare debugging. Ho avuto un'esperienza: ci sono voluti addirittura due giorni per capire cosa fosse andato storto. Se nessuno avesse passato settimane a indagare, non avesse trovato il problema, e Google non l'avesse scoperto, saremmo stati davvero nei guai.<\/p>\n<p>In NGINX, caching and static content management are already built-in. You won't have to worry about configuring it manually to prevent slowdowns or losing descriptors. NGINX is easy to deploy; there's no need to think about whether to use WSGI, PHP-FPM, Gunicorn, or Unicorn. Just set up NGINX, hand it off to your admins, and they know how to work with it. NGINX processes requests in a structured way. I'll explain this in more detail later. Briefly, it has phases: one when it receives the request, one when it processes it, and one when it delivers content to the user.<\/p>\n<p>NGINX is fantastic, but there's one issue: it's not flexible enough despite all the terrific features the team has packed into the configuration. The power it offers falls short. That's why the folks at Taobao, about eight years ago, integrated Lua into it. What does that provide?<\/p>\n<ul>\n<li><strong>Dimension<\/strong>. It\u2019s compact. LuaJIT adds around 100-200 kilobytes of memory overhead and minimal performance overhead.<\/li>\n<li><strong>Velocit\u00e0<\/strong>. L'interprete LuaJIT \u00e8 simile al C in molte situazioni, in altre perde contro Java e in alcune invece la supera. Per un certo periodo \u00e8 stato considerato all'avanguardia, il miglior JIT compiler. Ora ci sono alternative pi\u00f9 performanti, ma sono molto pesanti, come ad esempio V8. Alcuni interpreti JS e il HotSpot di Java sono pi\u00f9 veloci in determinati casi, ma in altre situazioni restano inferiori.<\/li>\n<li><strong>Facilit\u00e0 di apprendimento<\/strong>. Se la vostra base di codice \u00e8 scritta in Perl, e non siete Booking, troverete difficolt\u00e0 a trovare programmatori Perl. Perch\u00e9 non ci sono, sono tutti a disposizione altrove, e formare nuovi programmatori richiede tempo e impegno. Se cercate programmatori in altri linguaggi, anche loro potrebbero necessitare di una riqualificazione o di una ricerca specifica. Nel caso di Lua \u00e8 semplice. Chiunque pu\u00f2 imparare Lua in tre giorni. A me sono bastate circa due ore per prendere confidenza. Dopo due ore scrivevo gi\u00e0 codice in produzione. Dopo una settimana, era gi\u00e0 in produzione.<\/li>\n<\/ul>\n<p>\nIl risultato \u00e8 questo:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/1e6c253c5436fdc894f8be7999799cb0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nC'\u00e8 tanto materiale. OpenResty ha raccolto un sacco di moduli, sia di Lua che di engine. E avete tutto pronto: basta deployare ed \u00e8 operativo.<\/p>\n<h1>Esempi<\/h1>\n<p>\nBasta con la teoria, passiamo al codice. Ecco un piccolo Hello World:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/bbd056b72c71b193b0f06dd3248f5381.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCosa c'\u00e8 qui? Questa \u00e8 una location di engine. Non ci preoccupiamo, non scriviamo il nostro routing, non utilizziamo qualcosa di pronto \u2014 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 contenuto tramite uno script Lua. Prendiamo la variabile di engine <code>remote_addr<\/code> e la inseriamo in <code>string.format<\/code>. \u00c8 la stessa cosa di <code>sprintf<\/code>, solo su Lua, solo che corretto. E lo restituiamo al client.<\/p>\n<p>Il risultato apparir\u00e0 cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/9f1aaf6625f1fe5904b1e8a568fac76d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMa torniamo al mondo reale. In produzione nessuno distribuisce Hello World. Di solito, la nostra applicazione interroga un database o altro e per la maggior parte del tempo aspetta una risposta.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/485f713c0284e16b0817500c8606c104.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSemplicemente aspetta e basta. Non \u00e8 molto buono. Quando arrivano 100.000 utenti, \u00e8 davvero difficile per noi. Quindi, come esempio, sviluppiamo un'applicazione semplice. Cercheremo immagini, ad esempio, di gattini. Solo che non ci limiteremo a cercare, espanderemo le parole chiave e, se un utente cerca \"gattini\", troveremo gatti, peluches e altro. Per iniziare, dobbiamo ricevere i dati della richiesta sul backend. Ecco come appare:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/a2134f86f15764745ae8330f63185367.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDue righe ti permettono di ottenere i parametri GET, senza complicazioni. Successivamente, supponiamo di recuperare queste informazioni da un database con una tabella chiave per parola e estensione usando una normale query SQL. \u00c8 semplice. Si presenta cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/4543685dc907f30bba2a079a0fadad2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nColleghiamo la libreria <code>resty.mysql<\/code>, che abbiamo gi\u00e0 incluso. Non dobbiamo installare nulla, \u00e8 tutto pronto. Indichiamo come connetterci e facciamo una query SQL:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo 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. Recuperiamo 10 record, siamo pigri e non vogliamo mostrarne di pi\u00f9. Ho dimenticato di menzionare il limite in SQL.<\/p>\n<p>Poi troviamo le immagini per tutte le richieste. Raccogliamo un insieme 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 applicativo 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 ci vengono restituiti i responi. Il tempo di esecuzione corrisponde al tempo di risposta del pi\u00f9 lento. Se tutte vengono eseguite 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 gestire HTTP e caching, faremo in modo che NGINX si occupi di tutto per noi. Come avete visto, c'era una richiesta su <code>url\/fetch<\/code>, ecco qui:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/ef8fcc6905b2860a7f214c41251582a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nFacciamo un semplice <code>proxy_pass<\/code>, indichiamo dove memorizzare in cache, come farlo e tutto funziona perfettamente.<\/p>\n<p>Ma non \u00e8 sufficiente, 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 e restituiamo JSON.<\/p>\n<p>Ma c'\u00e8 una complicazione: l'utente non vuole leggere il JSON. Dobbiamo coinvolgere i frontend developer. A volte non abbiamo voglia di farlo all'inizio. E i SEO diranno che se stiamo cercando immagini, a loro non interessa. Ma se forniamo un contenuto, diranno che i motori di ricerca non indicizzano nulla.<\/p>\n<p>Cosa fare al riguardo? Naturalmente, restituiremo all'utente HTML. Generare manualmente non \u00e8 praticabile, quindi vogliamo usare i modelli. A tal fine, esiste una libreria <code>lua-resty-template<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/66a6cffc402575d286cb00d138dc201a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProbabilmente hai notato le tre spaventose lettere OPM. OpenResty viene fornito con il suo gestore di pacchetti, tramite cui \u00e8 possibile installare un sacco di altri moduli, in particolare, <code>lua-resty-template<\/code>. \u00c8 un semplice motore di template, simile ai template di Django. Qui puoi scrivere codice e sostituire 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 applicativo 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 modello nuovamente in due righe. L'utente \u00e8 felice, ha ricevuto dei gattini. Poich\u00e9 abbiamo ampliato la richiesta, ha ricevuto anche un foca. Chiss\u00e0, forse stava cercando proprio quello, ma non sapeva formulare correttamente la sua richiesta.<\/p>\n<p>Tutto \u00e8 fantastico, ma siamo in sviluppo e non vogliamo ancora mostrarlo agli utenti. Facciamo l'autenticazione. Per fare ci\u00f2, diamo un'occhiata a come NGINX gestisce la richiesta in termini di OpenResty:<\/p>\n<ul>\n<li>Fase uno\u00a0\u2014 <strong>access<\/strong>, quando l'utente \u00e8 appena arrivato e lo abbiamo esaminato tramite intestazioni, indirizzo IP e altri dati. Possiamo immediatamente bloccarl\u00f2 se non ci piace. Questo pu\u00f2 essere utilizzato per l'autenticazione oppure, se riceviamo molte richieste, possiamo facilmente bloccarle in questa fase.<\/li>\n<li><strong>rewrite<\/strong>. Riscriviamo alcuni dati della richiesta.<\/li>\n<li><strong>content<\/strong>. Restituiamo il contenuto all'utente.<\/li>\n<li><strong>headers filter<\/strong>. Sostituiamo le intestazioni della risposta. Se abbiamo utilizzato <code>proxy_pass<\/code>, possiamo riscrivere alcune intestazioni prima di restituirle all'utente.<\/li>\n<li><strong>body filter<\/strong>. Possiamo sostituire il corpo.<\/li>\n<li><strong>log<\/strong>\u00a0\u2014 registrazione. Possiamo scrivere i log in elasticsearch senza uno strato aggiuntivo.<\/li>\n<\/ul>\n<p>\nLa nostra autorizzazione apparir\u00e0 pi\u00f9 o meno cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/f6c16665b75ce0fa0ee69e07ab6a4a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nLo aggiungeremo a questa <code>location<\/code>, che abbiamo descritto in precedenza, e inseriremo il seguente codice:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/126d8411c92afa92f3c4f5b9791b3e9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nControlliamo se abbiamo un cookie token. Se non c'\u00e8, reindirizziamo all'autorizzazione. Gli utenti sono astuti e potrebbero intuire che \u00e8 necessario impostare il cookie token. Perci\u00f2 lo inseriremo anche in Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/b876372412d648885c2f7d53e712a85b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nIl codice per interagire con Redis \u00e8 molto semplice e non si discosta da altri linguaggi. Tutta l'input\/output, sia l\u00ec che qui, \u00e8 non bloccante. Se scrivete codice sincrono, funzioner\u00e0 in modo asincrono. Un po' come con gevent, ma realizzato come si deve.<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/74066c9c750c718f368617faacbe0acc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProcediamo con l'autorizzazione:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo 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, verifichiamo che il login e la password siano corretti. Se non sono corretti, reindirizziamo all'autorizzazione. Se sono corretti, scriviamo il token in Redis:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/bcf470d84791b6d1d01152d5ad511dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNon dimentichiamo di impostare il cookie, anche questo si fa in due righe:<\/p>\n<p><img decoding=\"async\" alt=\"OpenResty: trasformiamo NGINX in un server applicativo completo\" src=\"\/wp-content\/uploads\/2020\/02\/efe06a113de28bacd14b26d6bb62a037.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn esempio semplice e teorico. Naturalmente non creeremo un servizio che mostri gattini alle persone. Anche se chi lo sa. Quindi diamo un'occhiata a cosa \u00e8 possibile fare in produzione.<\/p>\n<ul>\n<li><strong>Backend minimalista<\/strong>. A volte abbiamo bisogno di fornire solo un po' di dati nel backend: a volte dobbiamo inserire una data, altre volte mostrare un elenco, indicare quanti utenti ci sono attualmente sul sito, implementare un contatore o statistiche. Qualcosa di semplice. Piccole porzioni possono essere realizzate molto facilmente. Con questo possiamo lavorare in modo rapido, semplice e efficace.\n<\/li>\n<li><strong>Pre-elaborazione dei dati<\/strong>. A volte vogliamo integrare della pubblicit\u00e0 nella nostra pagina, e questa pubblicit\u00e0 viene recuperata tramite API. \u00c8 molto facile farlo proprio qui. Non sovraccarichiamo il nostro backend, che sta gi\u00e0 lavorando duramente. Possiamo raccogliere tutto qui. Possiamo assemblare del codice JS o, al contrario, separarlo, elaborando qualcosa prima di presentarlo all'utente.\n<\/li>\n<li><strong>Facciata per microservizi<\/strong>. Questo \u00e8 un ottimo caso d'uso, l'ho realizzato. In precedenza lavoravo per una societ\u00e0 chiamata Tenzor, che si occupa di rapporti elettronici e fornisce reportistica per circa met\u00e0 delle aziende nel paese. Abbiamo creato un servizio in cui molte operazioni sono state realizzate utilizzando questo stesso meccanismo: routing, autorizzazione e altro.<br \/>\nOpenResty pu\u00f2 essere utilizzato come collante per i tuoi microservizi, fornendo un accesso unico a tutto e un'interfaccia unificata. Poich\u00e9 i microservizi possono essere scritti in modo tale da avere qui Node.js, qui PHP, qui Python, e qui una cosa in Erlang, comprendiamo che non vogliamo riscrivere lo stesso codice ovunque. Quindi, OpenResty pu\u00f2 essere integrato 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. \u00c8 proprio qui che \u00e8 molto comodo raccogliere dati. Si pu\u00f2 calcolare qualcosa subito e inviarlo da qualche parte, per esempio a Elasticsearch, Logstash o semplicemente registrarlo in un log e poi inviarlo a destinazione.\n<\/li>\n<li><strong>Sistemi multiplayer<\/strong>. Ad esempio, \u00e8 molto efficace per realizzare giochi online. Oggi a Cape Town, Alexander Gladys parler\u00e0 di come prototipare rapidamente un gioco multiplayer usando OpenResty.\n<\/li>\n<li><strong>Filtraggio delle richieste (WAF)<\/strong>. Oggi \u00e8 di moda utilizzare vari firewall per applicazioni web, ci sono molti servizi che li offrono. Con OpenResty, puoi creare un firewall per applicazioni web in grado di filtrare facilmente le richieste secondo le tue necessit\u00e0. Se utilizzi Python, sai che PHP non verr\u00e0 mai iniettato se non lo esegui da console. Sei consapevole di avere MySQL e Python. Probabilmente, qui potrebbero provare a eseguire un attacco di directory traversal e iniettare qualcosa nel database. Pertanto, puoi filtrare rapidamente e a basso costo le richieste sospette direttamente sul front-end.\n<\/li>\n<li><strong>Comunit\u00e0.<\/strong> Poich\u00e9 OpenResty \u00e8 basato su NGINX, ha un vantaggio in pi\u00f9: \u00e8 <strong>la comunit\u00e0 NGINX<\/strong>. \u00c8 molto ampia e una buona parte delle domande che potresti avere all'inizio sono gi\u00e0 state risolte dalla comunit\u00e0 NGINX.\n<p><strong>Sviluppatori Lua<\/strong>. Ieri ho parlato con ragazzi che hanno partecipato alla giornata di formazione HighLoad++ e ho sentito dire che Tarantool \u00e8 scritto solo in Lua. Non \u00e8 vero, in Lua sono scritti molte cose. Esempi: OpenResty, server XMPP Prosody, motore di gioco Love2D, script Lua in Warcraft e in altri luoghi. Ci sono molti sviluppatori Lua, hanno una comunit\u00e0 ampia e reattiva. Tutte le mie domande su Lua sono state risolte in poche ore. Quando scrivo alla mailing list, dopo pochi minuti ricevo una valanga di risposte che spiegano tutto nei dettagli. \u00c8 fantastico. Purtroppo, non ovunque trovi una comunit\u00e0 cos\u00ec disponibile.<br \/>\nPer OpenResty c'\u00e8 GitHub, dove puoi aprire un issue se qualcosa non funziona. C'\u00e8 una mailing list su Google Groups dove puoi discutere questioni generali, e una mailing list in cinese \u2014 magari, non parli inglese ma conosci il cinese.<\/li>\n<\/ul>\n<p><\/p>\n<h1>Risultati<\/h1>\n<p><\/p>\n<ul>\n<li>Spero di essere riuscito a far capire che OpenResty \u00e8 un framework molto comodo, progettato per il web.<\/li>\n<li>Ha una bassa barriera d'ingresso, poich\u00e9 il codice \u00e8 simile a quello che scriviamo, il linguaggio \u00e8 abbastanza semplice e minimalista.<\/li>\n<li>Fornisce I\/O asincrono senza callback, quindi non avremo il caos di codice che a volte possiamo scrivere in NodeJS.<\/li>\n<li>Ha un deployment semplice, poich\u00e9 abbiamo bisogno solo di NGINX con il modulo richiesto e il nostro codice, e tutto funziona immediatamente.<\/li>\n<li>Una grande e reattiva comunit\u00e0.<\/li>\n<\/ul>\n<p>\nNon ho spiegato in dettaglio come avviene il routing, sarebbe venuta una lunga storia.<\/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=\"Riproduci 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 4.9.10 - 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 \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\" \/>\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) 4.9.10\" \/>\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 \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\" \/>\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":"Pubbliciamo nuovamente la trascrizione della presentazione alla conferenza HighLoad++ 2016, che si \u00e8 svolta a Skolkovo, nella regione di Mosca, il 7-8 novembre dell'anno scorso. Vladimir Protasov spiega come ampliare la funzionalit\u00e0 di NGINX con OpenResty e Lua. Ciao a tutti, mi chiamo Vladimir Protasov e lavoro in Parallels. Vi parler\u00f2 un po' di me. Ho trascorso tre quarti della mia vita scrivendo codice. Sono diventato","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 \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","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"},"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}]}}