{"id":34140,"date":"2019-10-31T21:56:35","date_gmt":"2019-10-31T18:56:35","guid":{"rendered":"https:\/\/prohoster.info\/blog\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\/"},"modified":"2019-10-31T21:56:35","modified_gmt":"2019-10-31T18:56:35","slug":"printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","title":{"rendered":"Principi per lo sviluppo di applicazioni moderne da NGINX. Parte 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ciao, amici. In attesa del lancio del corso <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h4Ez\/\">\u00abSviluppatore Backend su PHP\u00bb<\/a><\/noindex>, tradizionalmente condividiamo con voi la traduzione di materiale utile.<\/p>\n<p>Il software sta risolvendo un numero sempre maggiore di compiti quotidiani, diventando sempre pi\u00f9 complesso. Come disse una volta Marc Andreessen, sta assorbendo il mondo. <\/p>\n<p><img decoding=\"async\" alt=\"Principi per lo sviluppo di applicazioni moderne da NGINX. Parte 1\" src=\"\/wp-content\/uploads\/928924e3036beaac518dd4a2674a8a30.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDi conseguenza, negli ultimi anni, gli approcci allo sviluppo e alla consegna delle applicazioni sono cambiati drasticamente. Si sono verificati spostamenti di portata tettonica, che hanno portato alla nascita di un insieme di principi. Questi principi si sono rivelati utili per formare team, progettare, sviluppare e consegnare la tua applicazione agli utenti finali. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>I principi possono essere riassunti nei seguenti modi: <i>l'applicazione deve essere piccola, collegata alla rete e avere un'architettura orientata agli sviluppatori<\/i>. Facendo leva su questi tre principi, puoi creare un'applicazione affidabile e complessa che pu\u00f2 essere rapidamente e in sicurezza consegnata all'utente finale, oltre a essere facilmente scalabile e ampliabile.<\/p>\n<p><img decoding=\"async\" alt=\"Principi per lo sviluppo di applicazioni moderne da NGINX. Parte 1\" src=\"\/wp-content\/uploads\/9116869a53fb6cf89d92f1d507d7904f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOgnuno dei principi proposti ha una serie di aspetti che discuteremo per mostrare come ciascun principio contribuisca al raggiungimento dell'obiettivo finale, che \u00e8 una rapida consegna di applicazioni affidabili, facili da mantenere e utilizzare. Considereremo i principi in confronto alle loro opposizioni, per chiarire cosa significa, ad esempio, \"Assicurati di utilizzare <i>il principio della piccolezza<\/i>\u00bb.<\/p>\n<p>Speriamo che questo articolo ti incoraggi a utilizzare i principi suggeriti per costruire applicazioni moderne che garantiscano un approccio unificato alla progettazione nell'ambito di un crescente stack tecnologico. <\/p>\n<p>Applicando questi principi, scoprirai di adottare le ultime tendenze nello sviluppo del software, incluso l'approccio <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/devops\/\">DevOps<\/a><\/noindex> per lo sviluppo e la consegna delle applicazioni, l'uso dei container (ad esempio, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/docker\/\">Docker<\/a><\/noindex>) e framework per l'orchestrazione dei container (ad esempio, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/kubernetes\/\">Kubernetes<\/a><\/noindex>), l'uso dei microservizi (inclusa l'Architettura a Microservizi <noindex>NGINX<\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/what-is-a-service-mesh\/\">architettura di rete<\/a><\/noindex> per applicazioni basate su microservizi.<\/p>\n<p><b>Cosa sono le applicazioni moderne?<\/b><\/p>\n<p>Applicazioni moderne? Stack moderno? Cosa significa esattamente \"moderno\"? <\/p>\n<p>La maggior parte degli sviluppatori ha solo una conoscenza generale di cosa sia un'applicazione moderna, quindi \u00e8 necessario fornire una definizione chiara di questo concetto.<\/p>\n<p>Un'applicazione moderna supporta pi\u00f9 client, sia che si tratti di un'interfaccia utente basata sulla libreria JavaScript React, di un'app mobile per Android o iOS, o di un'app che si collega ad un'altra tramite API. Un'applicazione moderna implica la presenza di un numero indefinito di client, per i quali fornisce dati o servizi.<\/p>\n<p>Un'applicazione moderna fornisce API per accedere ai dati e ai servizi richiesti. L'API deve essere invariabile e costante, e non scritta specificamente per una richiesta concreta proveniente da un client specifico. L'API \u00e8 accessibile tramite HTTP(S) e consente l'accesso a tutte le funzionalit\u00e0 disponibili nell'interfaccia grafica (GUI) o nella linea di comando (CLI). <\/p>\n<p>I dati devono essere disponibili in un formato comune e compatibile, come JSON. L'API fornisce oggetti e servizi in una forma comprensibile e organizzata; ad esempio, le API RESTful o GraphQL offrono un'interfaccia adeguata.<\/p>\n<p>Le applicazioni moderne sono costruite su stack moderni, e uno stack moderno \u00e8 quello che supporta tali applicazioni. Questo stack consente agli sviluppatori di creare facilmente un'app con interfaccia HTTP e endpoint API chiari. L'approccio scelto consentir\u00e0 alla tua applicazione di ricevere e inviare dati in formato JSON con facilit\u00e0. In altre parole, lo stack moderno corrisponde agli elementi dell'App a Dodici Fattori per <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/microservices-reference-architecture-nginx-twelve-factor-app\/\">microservizi<\/a><\/noindex>. <\/p>\n<p>Le versioni popolari di questo tipo di stack si basano su <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-photoresizer\">Java<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-user-manager\">Python<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-photouploader\">Node<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-album-manager\">Ruby<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-pages\">PHP<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-content-service\">Go<\/a><\/noindex>. L'Architettura a Microservizi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-ingenious\">NGINX<\/a><\/noindex> incarna un esempio di stack moderno implementato in ciascuno dei linguaggi menzionati.<\/p>\n<p>Si prega di notare che non promuoviamo esclusivamente un approccio a microservizi. Molti di voi lavorano con monoliti che devono evolversi, mentre altri gestiscono applicazioni SOA che si espandono e si sviluppano per diventare applicazioni a microservizi. Altri ancora si stanno dirigendo verso l'implementazione di applicazioni serverless, mentre alcuni stanno adottando combinazioni di quanto sopra. I principi esposti nell'articolo sono applicabili a ciascuno di questi sistemi con alcune leggere modifiche. <\/p>\n<p><b>Principi<\/b><\/p>\n<p>Ora che abbiamo raggiunto una comprensione generale di cosa siano le moderne applicazioni e lo stack moderno, \u00e8 tempo di immergerci nei principi di architettura e sviluppo che vi saranno di grande aiuto nella creazione, implementazione e supporto di un'applicazione moderna.<\/p>\n<p>Uno dei principi \u00e8 \"creare piccole applicazioni\", chiamiamolo semplicemente <i>il principio della piccolezza<\/i>. Ci sono applicazioni incredibilmente complesse costituite da molti componenti mobili. Allo stesso modo, costruire un'applicazione utilizzando piccoli componenti discreti semplifica la sua progettazione, manutenzione e gestione complessiva. (Nota che abbiamo detto \"semplifica\" e non \"rende semplice\").<\/p>\n<p>Il secondo principio \u00e8 che possiamo aumentare la produttivit\u00e0 degli sviluppatori aiutandoli a concentrarsi sulle funzionalit\u00e0 che stanno sviluppando, liberandoli cos\u00ec dalle preoccupazioni relative all'infrastruttura e al CI\/CD durante l'implementazione. Quindi, in poche parole, il nostro approccio \u00e8 <i>orientato agli sviluppatori<\/i>.<\/p>\n<p>Infine, tutto ci\u00f2 che riguarda la vostra applicazione dovrebbe essere connesso in rete. Negli ultimi 20 anni abbiamo fatto notevoli progressi verso un futuro di rete, poich\u00e9 le reti sono diventate pi\u00f9 veloci e le applicazioni pi\u00f9 complesse. Come abbiamo gi\u00e0 scoperto, un'applicazione moderna deve essere utilizzata in rete da molti diversi client. L'adozione di un pensiero di rete nell'architettura porta notevoli vantaggi, che si combinano bene con <i>il principio della piccolezza<\/i> e il concetto di approccio, <i>orientato agli sviluppatori<\/i>.<\/p>\n<p>Se durante la progettazione e l'implementazione di un'applicazione ricorderete i principi sopra citati, avrete un vantaggio innegabile nello sviluppo e nella consegna del vostro prodotto.<\/p>\n<p>Esaminiamo questi tre principi in modo pi\u00f9 dettagliato.<\/p>\n<p><b>Il principio della piccolezza<\/b><\/p>\n<p>Il cervello umano fatica a elaborare una grande quantit\u00e0 di informazioni contemporaneamente. In psicologia, il termine carico cognitivo indica la quantit\u00e0 complessiva di sforzi mentali necessari per mantenere le informazioni in memoria. Ridurre il carico cognitivo per gli sviluppatori \u00e8 una priorit\u00e0, poich\u00e9 in questo modo possono concentrarsi sulla risoluzione dei problemi invece di dover tenere a mente il modello complesso dell'intera applicazione e delle funzionalit\u00e0 in fase di sviluppo. <\/p>\n<p><img decoding=\"async\" alt=\"Principi per lo sviluppo di applicazioni moderne da NGINX. Parte 1\" src=\"\/wp-content\/uploads\/26df2016a46d8b82b45832fe1df9bf23.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Le applicazioni vengono scomposte per i seguenti motivi:<\/p>\n<ul>\n<li>Ridurre il carico cognitivo per gli sviluppatori;<\/li>\n<li>Accelerare e semplificare il testing;<\/li>\n<li>Consegna rapida delle modifiche nell'applicazione.<\/li>\n<\/ul>\n<p><\/i><br \/>\nEsistono diversi modi per ridurre il carico cognitivo per gli sviluppatori, ed \u00e8 qui che entra in gioco il principio della piccolezza.<\/p>\n<p>Quindi, tre modi per ridurre il carico cognitivo:<\/p>\n<ol>\n<li>Ridurre le scadenze che devono considerare quando sviluppano una nuova funzione: pi\u00f9 breve \u00e8 il timeframe, minore \u00e8 il carico cognitivo.<\/li>\n<li>Ridurre il numero di righe di codice su cui si lavora contemporaneamente: meno codice implica meno carico.<\/li>\n<li>Semplificare il processo di apportare modifiche incrementali all'applicazione.<\/li>\n<\/ol>\n<p>\n<b>Riduzione delle scadenze nello sviluppo<\/b><\/p>\n<p>Torniamo a quei tempi in cui la metodologia <code>waterfall<\/code> era lo standard per il processo di sviluppo, e scadenze di sei mesi a due anni per lo sviluppo o l'aggiornamento di un'applicazione erano la norma. In genere, gli ingegneri leggevano prima i documenti pertinenti, come i requisiti di prodotto (PRD), il documento di riferimento del sistema (SRD), il piano architettonico e iniziavano a mettere insieme tutte queste cose in un unico modello cognitivo, secondo il quale scrivevano il codice. Man mano che i requisiti e, di conseguenza, l'architettura cambiavano, era necessaria una notevole quantit\u00e0 di sforzi per informare l'intero team sugli aggiornamenti del modello cognitivo. Questo approccio, nel peggiore dei casi, poteva paralizzare completamente il lavoro.<\/p>\n<p>La pi\u00f9 grande svolta nel processo di sviluppo delle applicazioni \u00e8 stata l'introduzione della metodologia agile. Una delle caratteristiche principali della metodologia <code>agile<\/code> \u2013 \u00e8 uno sviluppo iterativo. Questo, a sua volta, porta a una riduzione del carico cognitivo sugli ingegneri. Invece di richiedere al team di sviluppo di realizzare l'applicazione in un lungo ciclo, <code>agile<\/code> l'approccio consente di concentrarsi su piccole porzioni di codice che possono essere testate e distribuite rapidamente, ricevendo anche un feedback. Il carico cognitivo dell'applicazione \u00e8 passato da un intervallo di sei mesi a due anni, considerando l'enorme quantit\u00e0 di specifiche, a un'aggiunta o modifica di funzione ogni due settimane, mirata a una comprensione pi\u00f9 sfumata di una grande applicazione.<\/p>\n<p>Spostare il focus da un'applicazione massiccia a funzioni piccole e specifiche, che possono essere completate in uno sprint di due settimane, guardando non oltre una funzione del prossimo sprint, rappresenta un cambiamento significativo. Questo ha permesso di aumentare la produttivit\u00e0 nello sviluppo, riducendo al contempo il carico cognitivo, che oscillava costantemente.<\/p>\n<p>Nella metodologia <code>agile<\/code> si presume che l'applicazione finale sar\u00e0 una versione leggermente modificata del concetto iniziale, quindi il punto finale dello sviluppo \u00e8 necessariamente ambiguo. Solo i risultati di ciascun sprint specifico possono essere chiari e definiti.<\/p>\n<p><b>Piccole basi di codice<\/b><\/p>\n<p>Il passo successivo per ridurre il carico cognitivo \u00e8 diminuire la base di codice. In genere, le applicazioni moderne sono massicce: un'applicazione aziendale robusta pu\u00f2 consistere di migliaia di file e centinaia di migliaia di righe di codice. A seconda della struttura dei file, le relazioni e le dipendenze tra codice e file possono essere ovvie o meno. Anche il debug dell'esecuzione stessa del codice pu\u00f2 presentare problemi, a seconda delle librerie utilizzate e di quanto bene gli strumenti di debug distinguano tra librerie\/pacchetti\/moduli e codice utente.<\/p>\n<p>Costruire un modello mentale operativo del codice di un'applicazione pu\u00f2 richiedere un notevole quantitativo di tempo e ripristinare un'elevata carico cognitivo per lo sviluppatore. Questo \u00e8 particolarmente vero per i codici monolitici, dove esiste una grande quantit\u00e0 di codice, il cui interazione tra i componenti funzionali non \u00e8 chiaramente definita, e la divisione degli oggetti di attenzione \u00e8 spesso sfocata, poich\u00e9 non vengono rispettati i confini funzionali. <\/p>\n<p>Uno dei modi pi\u00f9 efficaci per ridurre il carico cognitivo sugli ingegneri \u00e8 passare a un'architettura a microservizi. Nel paradigma dei microservizi, ogni servizio si concentra su un insieme di funzionalit\u00e0; il che significa che la logica del servizio \u00e8 generalmente ben definita e comprensibile. I confini del servizio sono altrettanto chiari: ricorda che la comunicazione con il servizio avviene tramite API, quindi i dati generati da un servizio possono essere facilmente trasferiti a un altro.<\/p>\n<p>L'interazione con altri servizi \u00e8 solitamente limitata a diversi servizi utente e alcuni servizi del fornitore, che utilizzano chiamate API semplici e pulite, ad esempio tramite REST. Questo significa che il carico cognitivo per l'ingegnere si riduce notevolmente. La sfida pi\u00f9 complessa rimane quella di comprendere il modello di interazione dei servizi e come cose come le transazioni si svolgono tra pi\u00f9 servizi. Alla fine, l'uso dei microservizi riduce il carico cognitivo, diminuendo la quantit\u00e0 di codice, delineando confini chiari per il servizio e garantendo una comprensione delle relazioni tra utenti e fornitori.<\/p>\n<p><b>Piccole modifiche incrementali<\/b><\/p>\n<p>L'ultimo elemento del principio <i>piccolezze<\/i> \u2013 questo \u00e8 la gestione del cambiamento. Per i programmatori \u00e8 una tentazione particolare dare un'occhiata al codice sorgente (anche, forse, al loro stesso codice pi\u00f9 vecchio) e affermare: \u00abQuesta \u00e8 spazzatura, dobbiamo riscrivere tutto questo.\u00bb A volte \u00e8 la decisione giusta, altre volte no. Questo comporta per il team di sviluppo il peso di un cambiamento globale del modello, il che porta a un carico cognitivo su larga scala. \u00c8 meglio che gli ingegneri si concentrino sui cambiamenti che possono apportare nel corso dello sprint, per poi rilasciare tempestivamente le funzionalit\u00e0 necessarie, anche se gradualmente. Il prodotto finale dovrebbe assomigliare a quanto pianificato in precedenza, ma con alcune modifiche e test per soddisfare le esigenze del cliente.<\/p>\n<p>Durante la riscrittura di grandi parti di codice, a volte diventa impossibile effettuare rapidamente la consegna delle modifiche, poich\u00e9 entrano in gioco altre dipendenze del sistema. Per controllare il flusso delle modifiche, \u00e8 possibile utilizzare l'associazione di funzionalit\u00e0 (feature hiding). In linea di principio, ci\u00f2 significa che la funzionalit\u00e0 \u00e8 presente in produzione, ma non \u00e8 accessibile tramite impostazioni di variabili ambientali (env-var) o qualche altro meccanismo di configurazione. Se il codice ha superato tutti i processi di verifica della qualit\u00e0, pu\u00f2 trovarsi in produzione in uno stato nascosto. Tuttavia, questa strategia funziona solo se la funzione alla fine verr\u00e0 attivata. Altrimenti, non far\u00e0 altro che ingombrare il codice e aggiungere un carico cognitivo che lo sviluppatore dovr\u00e0 affrontare per lavorare in modo produttivo. La gestione del cambiamento e le modifiche incrementali aiutano a mantenere il carico cognitivo degli sviluppatori a un livello gestibile. <\/p>\n<p>Gli ingegneri devono affrontare molte difficolt\u00e0 anche quando si tratta di implementare funzionalit\u00e0 aggiuntive semplici. Da parte della direzione, sarebbe saggio ridurre il carico eccessivo sul team, affinch\u00e9 possa concentrarsi sugli elementi chiave della funzionalit\u00e0. Ci sono tre cose che puoi fare per aiutare il tuo team di sviluppatori:<\/p>\n<ol>\n<li>Utilizzare una metodologia <code>agile<\/code>, per limitare il tempo durante il quale il team deve concentrarsi sulle funzionalit\u00e0 chiave.<\/li>\n<li>Realizza la tua applicazione come una serie di microservizi. Questo limiter\u00e0 il numero di funzionalit\u00e0 implementate e solidificher\u00e0 i confini che mantengono il carico cognitivo durante il lavoro.<\/li>\n<li>Preferisci cambiamenti incrementali piuttosto che grandi e ingombranti, modifica piccoli pezzi di codice. Utilizza l'astro di funzionalit\u00e0 per implementare cambiamenti, anche se non saranno visibili immediatamente dopo l'aggiunta.<\/li>\n<\/ol>\n<p>\nSe applichi il principio della piccolezza nel tuo lavoro, il tuo team sar\u00e0 molto pi\u00f9 felice, si concentrer\u00e0 meglio nell'implementare le funzionalit\u00e0 necessarie e avr\u00e0 maggiori probabilit\u00e0 di rilasciare cambiamenti di qualit\u00e0 pi\u00f9 rapidamente. Ma questo non significa che il lavoro non possa complicarsi; a volte, al contrario, l'implementazione di una nuova funzionalit\u00e0 richiede la modifica di diversi servizi e questo processo pu\u00f2 essere pi\u00f9 complicato rispetto a quello in un'architettura monolitica. In ogni caso, i vantaggi dell'applicazione dell'approccio della piccolezza valgono lo sforzo.<\/p>\n<p>Fine della prima parte.<\/p>\n<p>Presto pubblicheremo la seconda parte della traduzione, e nel frattempo aspettiamo i vostri commenti e vi invitiamo al <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/mJ6e\/\">giornata di porte aperte<\/a><\/noindex>, che avr\u00e0 luogo gi\u00e0 oggi alle 20:00.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/452748\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f. \u0412 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u0443\u0440\u0441\u0430 \u00abBackend \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 PHP\u00bb, \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0441\u044c \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041a\u0430\u043a \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0441\u043a\u0430\u0437\u0430\u043b \u041c\u0430\u0440\u043a \u0410\u043d\u0434\u0440\u0435\u0441\u0441\u0435\u043d, \u043e\u043d\u043e \u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0435\u0442 \u043c\u0438\u0440. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34140","post","type-post","status-publish","format-standard","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=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f.\" \/>\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\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\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\udd47\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043e\u0442 NGINX. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\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=\"2019-10-31T18:56:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:56:35+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\udd47Principi dello sviluppo di moderne applicazioni da NGINX. Parte 1 | ProHoster","description":"Ciao, amici.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","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\udd47\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043e\u0442 NGINX. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","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":"2019-10-31T18:56:35+00:00","article:modified_time":"2019-10-31T18:56:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34140","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":"2026-01-21 18:05:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:27:30","updated":"2026-01-21 18:05:19","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\/34140","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=34140"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/34140\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=34140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=34140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=34140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}