{"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\/da\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","title":{"rendered":"Principperne for udvikling af moderne applikationer fra NGINX. Del 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej venner. I takt med lanceringen af vores kursus <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h4Ez\/\">\u00abBackend udvikler i PHP\u00bb<\/a><\/noindex>, deler vi traditionelt en overs\u00e6ttelse af nyttigt materiale med jer.<\/p>\n<p>Software l\u00f8ser flere og flere hverdagsproblemer og bliver samtidig mere og mere kompleks. Som Mark Andreessen engang sagde, det opsluger verden. <\/p>\n<p><img decoding=\"async\" alt=\"Principperne for udvikling af moderne applikationer fra NGINX. Del 1\" src=\"\/wp-content\/uploads\/928924e3036beaac518dd4a2674a8a30.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom et resultat er tilgange til udvikling og levering af applikationer alvorligt \u00e6ndret gennem de seneste par \u00e5r. Disse har v\u00e6ret tektoniske skift, der har f\u00f8rt til en r\u00e6kke principper. Disse principper har vist sig at v\u00e6re nyttige i opbygningen af team, design, udvikling og levering af din applikation til slutbrugerne. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Principperne kan opsummeres som f\u00f8lger: <i>applikationen skal v\u00e6re lille, netv\u00e6rksbaseret og have en udviklerorienteret arkitektur<\/i>. Baseret p\u00e5 disse tre principper kan du skabe en p\u00e5lidelig, omfattende applikation, der hurtigt og sikkert kan leveres til slutbrugerne, samt nemt skaleres og udvides.<\/p>\n<p><img decoding=\"async\" alt=\"Principperne for udvikling af moderne applikationer fra NGINX. Del 1\" src=\"\/wp-content\/uploads\/9116869a53fb6cf89d92f1d507d7904f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvert af de foresl\u00e5ede principper har en r\u00e6kke aspekter, vi vil diskutere for at vise, hvordan hvert princip bidrager til at n\u00e5 det endelige m\u00e5l, som er hurtig levering af p\u00e5lidelige applikationer, der er lette at vedligeholde og bruge. Vi vil se p\u00e5 principperne i forhold til deres modpoler for at pr\u00e6cisere, hvad det vil sige f.eks. 'S\u00f8rg for at du bruger <i>principperne om lille st\u00f8rrelse<\/i>\u00bb.<\/p>\n<p>Vi h\u00e5ber, at denne artikel vil opmuntre dig til at anvende de foresl\u00e5ede principper for moderne applikationsopbygning, som vil sikre en ensartet tilgang til design i konteksten af den kontinuerligt voksende teknologistak. <\/p>\n<p>Ved at anvende disse principper vil du finde ud af, at du bruger de nyeste tendenser inden for softwareudvikling, herunder tilgangen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/devops\/\">DevOps<\/a><\/noindex> til udvikling og levering af applikationer, brug af containere (f.eks. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/docker\/\">Docker<\/a><\/noindex>) og frameworks til orkestrering af containere (f.eks. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/kubernetes\/\">Kubernetes<\/a><\/noindex>), brug af mikrotjenester (inklusive Mikroservices Arkitektur <noindex>NGINX<\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/what-is-a-service-mesh\/\">netv\u00e6rksarkitektur<\/a><\/noindex> til mikrotjenesteapplikationer.<\/p>\n<p><b>Hvad er en moderne applikation?<\/b><\/p>\n<p>Moderne applikationer? Moderne stak? Hvad betyder 'moderne' egentlig? <\/p>\n<p>De fleste udviklere har kun en generel forst\u00e5else af, hvad en moderne applikation best\u00e5r af, s\u00e5 det er n\u00f8dvendigt at give en klar definition af dette begreb.<\/p>\n<p>Moderne applikationer underst\u00f8tter flere klienter, uanset om det er en brugergr\u00e6nseflade bygget p\u00e5 JavaScript-biblioteket React, en mobilapplikation til Android eller iOS, eller en applikation, der forbinder med en anden via API. Moderne applikationer indeb\u00e6rer et ubestemt antal klienter, som de tilbyder data eller tjenester til.<\/p>\n<p>Moderne applikationer leverer API'er til adgang til de \u00f8nskede data og tjenester. API'et skal v\u00e6re invariant og konstant og ikke skrevet specifikt til en bestemt foresp\u00f8rgsel fra en bestemt klient. API'et er tilg\u00e6ngeligt via HTTP(S) og giver adgang til al funktionalitet, der findes i GUI eller CLI. <\/p>\n<p>Data skal v\u00e6re tilg\u00e6ngelige i et almindeligt accepteret, kompatibelt format, s\u00e5som JSON. API'et leverer objekter og tjenester i en forst\u00e5elig, organiseret form, for eksempel giver RESTful API eller GraphQL et v\u00e6rdifuldt interface.<\/p>\n<p>Moderne applikationer bygges p\u00e5 en moderne tech-stak, og en moderne stak er en, der underst\u00f8tter s\u00e5danne applikationer. En s\u00e5dan stak g\u00f8r det muligt for udvikleren let at oprette en applikation med et HTTP-interface og klare API-endepunkter. Den valgte tilgang vil give din applikation mulighed for nemt at modtage og sende data i JSON-format. Med andre ord matcher den moderne stak elementerne i Twelve-Factor app'en. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/microservices-reference-architecture-nginx-twelve-factor-app\/\">mikrotjenester<\/a><\/noindex>. <\/p>\n<p>Popul\u00e6re versioner af denne type stak er baseret p\u00e5 <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> og <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-content-service\">Go<\/a><\/noindex>. Mikrotjenestearkitektur <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-ingenious\">NGINX<\/a><\/noindex> eksemplificerer et eksempel p\u00e5 en moderne stak, implementeret p\u00e5 hvert af de n\u00e6vnte sprog.<\/p>\n<p>Bem\u00e6rk, at vi ikke udelukkende promoverer et mikrotjeneste-tilgang. Mange af jer arbejder med monolitter, der skal udvikles, mens andre besk\u00e6ftiger sig med SOA-applikationer, som udvides og udvikles for at blive mikrotjenesteapplikationer. Andre bev\u00e6ger sig mod at anvende serverl\u00f8se applikationer, og nogle implementerer kombinationer af det ovenst\u00e5ende. De principper, der skitseres i artiklen, g\u00e6lder for hver af disse systemer med kun nogle f\u00e5 mindre \u00e6ndringer. <\/p>\n<p><b>Principper<\/b><\/p>\n<p>Nu, hvor vi har opn\u00e5et en f\u00e6lles forst\u00e5else af, hvad moderne applikationer og moderne stakke er, er det tid til at dykke ned i de principper for arkitektur og udvikling, der vil v\u00e6re til stor hj\u00e6lp i udviklingen, implementeringen og vedligeholdelsen af moderne applikationer.<\/p>\n<p>Et af principperne lyder: 'Skab sm\u00e5 applikationer', lad os blot kalde det <i>princippet om sm\u00e5hed<\/i>. Der findes utroligt komplekse applikationer, der best\u00e5r af mange bev\u00e6gelige komponenter. At bygge en applikation af sm\u00e5 diskrete komponenter forenkler imidlertid design, vedligeholdelse og den generelle brug af den. (Bem\u00e6rk, at vi sagde 'forenkler', ikke 'g\u00f8r det simpelt').<\/p>\n<p>Det andet princip er, at vi kan \u00f8ge udvikleres produktivitet ved at hj\u00e6lpe dem med at fokusere p\u00e5 de funktioner, de udvikler, samtidig med at vi frig\u00f8r dem fra bekymringer om infrastruktur og CI\/CD under implementeringen. S\u00e5 kort sagt er vores tilgang <i>udviklerorienteret<\/i>.<\/p>\n<p>Endelig skal alt, hvad der ang\u00e5r din applikation, v\u00e6re forbundet til nettet. I l\u00f8bet af de sidste 20 \u00e5r har vi gjort store fremskridt mod en netv\u00e6rksbaseret fremtid, da netv\u00e6rk er blevet hurtigere, og applikationer er blevet mere komplekse. Som vi allerede har fastsl\u00e5et, skal moderne applikationer bruges over netv\u00e6rket af mange forskellige klienter. Anvendelsen af netv\u00e6rkstankegang i arkitekturen har betydelige fordele, der passer godt sammen med <i>princippet om sm\u00e5hed<\/i> og konceptet om en tilgang, <i>der er udviklerorienteret<\/i>.<\/p>\n<p>Hvis du under udviklingen og implementeringen af din applikation husker de n\u00e6vnte principper, vil du have en uovertruffen fordel i udviklingen og leveringen af dit produkt.<\/p>\n<p>Lad os se n\u00e6rmere p\u00e5 disse tre principper.<\/p>\n<p><b>Princippet om sm\u00e5hed<\/b><\/p>\n<p>Det er sv\u00e6rt for den menneskelige hjerne at opfatte en stor m\u00e6ngde information p\u00e5 \u00e9n gang. I psykologien refererer begrebet kognitiv belastning til den samlede m\u00e6ngde mentale anstrengelser, der kr\u00e6ves for at bevare information i hukommelsen. At reducere den kognitive belastning for udviklerne er en prioritet, da de p\u00e5 den m\u00e5de kan fokusere p\u00e5 at l\u00f8se problemet i stedet for at holde den nuv\u00e6rende komplekse model af hele applikationen og de udviklede funktioner i tankerne. <\/p>\n<p><img decoding=\"async\" alt=\"Principperne for udvikling af moderne applikationer fra NGINX. Del 1\" src=\"\/wp-content\/uploads\/26df2016a46d8b82b45832fe1df9bf23.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Applikationer nedbrydes af f\u00f8lgende grunde:<\/p>\n<ul>\n<li>Reduceret kognitiv belastning for udviklerne;<\/li>\n<li>Hurtigere og nemmere testning;<\/li>\n<li>Hurtig levering af \u00e6ndringer i applikationen.<\/li>\n<\/ul>\n<p><\/i><br \/>\nDer er flere m\u00e5der at mindske den kognitive belastning for udviklerne p\u00e5, og her kommer princippet om sm\u00e5hed ind i billedet.<\/p>\n<p>S\u00e5 tre m\u00e5der at reducere den kognitive belastning p\u00e5:<\/p>\n<ol>\n<li>Reducere de tidsrammer, de skal tage h\u00f8jde for, n\u00e5r de udvikler en ny funktion \u2013 jo kortere tidsrammen er, desto lavere bliver den kognitive belastning.<\/li>\n<li>Reducere antallet af kodelinjer, der arbejdes med p\u00e5 \u00e9n gang \u2013 mindre kode = mindre belastning.<\/li>\n<li>Forenkle processen med at foretage inkrementelle \u00e6ndringer i applikationen.<\/li>\n<\/ol>\n<p>\n<b>Reducerede udviklingstidsrammer<\/b><\/p>\n<p>Lad os vende tilbage til de dage, hvor metodologien <code>waterfall<\/code> var standarden i udviklingsprocessen, og tidsrammer p\u00e5 seks m\u00e5neder til to \u00e5r for udvikling eller opdatering af en applikation var almindelig praksis. Normalt l\u00e6ste ingeni\u00f8rerne f\u00f8rst de relevante dokumenter, s\u00e5som produktkrav (PRD), systemudviklingsdokument (SRD), arkitekturplanen og begyndte at samle alle disse ting i en kognitiv model, if\u00f8lge hvilken de skrev kode. Efterh\u00e5nden som kravene og dermed arkitekturen \u00e6ndrede sig, m\u00e5tte der g\u00f8res en betydelig indsats for at informere hele teamet om opdateringer i den kognitive model. En s\u00e5dan tilgang kunne i v\u00e6rste fald simpelthen lamme arbejdet.<\/p>\n<p>Den st\u00f8rste forandring i applikationsudviklingsprocessen blev implementeringen af metodologien agile. En af hovedtr\u00e6k ved metodologien <code>agile<\/code> er iterativ udvikling. Dette f\u00f8rer i sin tur til en reduktion i den kognitive belastning for ingeni\u00f8rerne. I stedet for at kr\u00e6ve, at udviklerteamet \u0440\u0435\u0430\u043b\u0438\u0437ere applikationen i \u00e9n lang cyklus, <code>agile<\/code> giver tilgangen mulighed for at fokusere p\u00e5 sm\u00e5 m\u00e6ngder kode, der kan testes hurtigt og implementeres, samtidig med at der opn\u00e5s feedback. Den kognitive belastning ved applikationen er skiftet fra tidsrammer p\u00e5 seks m\u00e5neder til to \u00e5r med et stort antal specifikationer til en to-ugers tilf\u00f8jelse eller \u00e6ndring af funktioner, der er rettet mod en mere diffus forst\u00e5else af et stort applikation.<\/p>\n<p>At fortr\u00e6kkes fokus at flytte fra massive applikationer til specifikke sm\u00e5 funktioner, der kan afsluttes p\u00e5 en to-ugers sprint, med kun en enkelt funktion fra det n\u00e6ste sprint i tankerne, er en betydelig \u00e6ndring. Dette har gjort det muligt at \u00f8ge udviklingsproduktiviteten, samtidig med at den kognitive belastning, der konstant svingede, er blevet reduceret.<\/p>\n<p>I metoden <code>agile<\/code> antages det, at den endelige applikation vil v\u00e6re en lidt \u00e6ndret version af det oprindelige koncept, s\u00e5 det endelige udviklingspunkt er n\u00f8dvendigvis tvetydigt. Kun resultaterne fra hvert specifikt sprint kan v\u00e6re klare og pr\u00e6cise.<\/p>\n<p><b>Sm\u00e5 kodebaser<\/b><\/p>\n<p>N\u00e6ste skridt i at reducere den kognitive belastning er at mindske kodebasen. Som regel er moderne applikationer massive \u2013 en p\u00e5lidelig, virksomhedsm\u00e6ssig applikation kan best\u00e5 af tusindvis af filer og hundredtusindvis af linjer kode. Afh\u00e6ngigt af hvordan filer er organiseret, kan forbindelser og afh\u00e6ngigheder mellem kode og filer v\u00e6re \u00e5benlyse eller omvendt. Selv debugging af selve kodeudf\u00f8relsen kan skabe problemer, afh\u00e6ngigt af de anvendte biblioteker og hvor godt debug-v\u00e6rkt\u00f8jerne adskiller biblioteker\/pakker\/moduler fra brugerdefineret kode.<\/p>\n<p>At opbygge en funktionel mental model af applikationskoden kan tage en betydelig m\u00e6ngde tid og p\u00e5l\u00e6gge udvikleren en stor kognitiv belastning. Dette er is\u00e6r typisk for monolitiske kodebaser, hvor der er en stor m\u00e6ngde kode, og interaktionen mellem funktionelle komponenter ikke er klart defineret, og hvor opm\u00e6rksomhedens gr\u00e6nser ofte er uklare, da funktionelle gr\u00e6nser ikke overholdes. <\/p>\n<p>En effektiv m\u00e5de at reducere den kognitive belastning p\u00e5 ingeni\u00f8rer er at overg\u00e5 til en mikrotjenestearkitektur. I den mikrotjeneste tilgang fokuserer hver tjeneste p\u00e5 et s\u00e6t funktioner; men betydningen af tjenesten er typisk defineret og klar. Gr\u00e6nserne for tjenesten er ogs\u00e5 tydelige \u2013 husk, at kommunikationen med tjenesten foreg\u00e5r via API, s\u00e5 de data, der genereres af en tjeneste, nemt kan overf\u00f8res til en anden.<\/p>\n<p>Interaktion med andre tjenester er ofte begr\u00e6nset til et par brugerdefinerede tjenester og et par udbyder tjenester, der bruger enkle og klare API-opkald, for eksempel via REST. Det betyder, at den kognitive belastning p\u00e5 ingeni\u00f8ren reduceres betydeligt. Den vanskeligste opgave er stadig at forst\u00e5, hvordan tjenester interagerer, og hvordan ting som transaktioner foreg\u00e5r mellem flere tjenester. Samlet set reducerer brugen af mikrotjenester den kognitive belastning ved at mindske m\u00e6ngden af kode, definere klare gr\u00e6nser for tjenesterne og sikre forst\u00e5else af forholdet mellem brugere og udbydere.<\/p>\n<p><b>Sm\u00e5 inkrementelle \u00e6ndringer<\/b><\/p>\n<p>Den sidste del af princippet <i>sm\u00e5ting<\/i> \u2013 er forholdet til h\u00e5ndtering af \u00e6ndringer. En s\u00e6rlig fristelse for udviklere er at se p\u00e5 kodebasen (m\u00e5ske endda deres egen, \u00e6ldre kode) og sige: \"Det her er elendigt, vi skal omskrive det hele.\" Nogle gange er det den rigtige beslutning, og nogle gange er det ikke. Det p\u00e5l\u00e6gger udviklerteamet byrden ved at \u00e6ndre modellen drastisk, hvilket igen f\u00f8rer til en omfattende kognitiv belastning. Det er bedre for ingeni\u00f8rerne at fokusere p\u00e5 de \u00e6ndringer, de kan foretage i l\u00f8bet af sprinten, s\u00e5 de kan implementere n\u00f8dvendig funktionalitet rettidigt, om end gradvist. Det endelige produkt b\u00f8r minde om den oprindeligt planlagte, men med nogle \u00e6ndringer og test for at opfylde kundens behov.<\/p>\n<p>N\u00e5r man omskriver store dele af koden, kan det nogle gange v\u00e6re umuligt at hurtigt levere \u00e6ndringer, da andre systemafh\u00e6ngigheder spiller ind. For at kontrollere \u00e6ndringsstr\u00f8mmen kan man anvende funktionalitetsskjuling (feature hiding). Det betyder grundl\u00e6ggende, at funktionaliteten er i produktionen, men ikke er tilg\u00e6ngelig via konfiguration af milj\u00f8variabler (env-var) eller en anden konfigurationsmekanisme. Hvis koden har best\u00e5et alle kvalitetskontroller, kan den befinde sig i produktionen i en skjult tilstand. Denne strategi fungerer dog kun, hvis funktionen til sidst vil blive aktiveret. Ellers vil den blot rode koden til og tilf\u00f8re ekstra kognitiv belastning, som udvikleren skal h\u00e5ndtere for at kunne arbejde produktivt. Styring af \u00e6ndringer og inkrementelle \u00e6ndringer hj\u00e6lper i sig selv med at holde den kognitive belastning for udviklerne p\u00e5 et administrerbart niveau. <\/p>\n<p>Ingeni\u00f8rer st\u00e5r over for mange udfordringer, selv ved simpel implementering af yderligere funktionalitet. Fra ledelsens side ville det v\u00e6re fornuftigt at mindske den un\u00f8dvendige belastning p\u00e5 teamet, s\u00e5 de kan fokusere p\u00e5 de vigtigste elementer af funktionaliteten. Der er tre ting, du kan g\u00f8re for at hj\u00e6lpe dit udviklerteam:<\/p>\n<ol>\n<li>Anvend en metode <code>agile<\/code>, der begr\u00e6nser den tidsramme, hvori teamet skal fokusere p\u00e5 n\u00f8glefunktioner.<\/li>\n<li>Implementer din applikation som flere mikrotjenester. Dette vil begr\u00e6nse antallet af implementerede funktioner og styrke gr\u00e6nserne, der holder den kognitive belastning p\u00e5 et h\u00e5ndterbart niveau under arbejdet.<\/li>\n<li>Foretr\u00e6k inkrementelle \u00e6ndringer frem for store og klodsede; \u00e6ndr sm\u00e5 dele af koden. Anvend funktionalitetsskjuling for at implementere \u00e6ndringer, selvom de ikke er synlige straks efter tilf\u00f8jelsen.<\/li>\n<\/ol>\n<p>\nHvis du anvender princippet om sm\u00e5 enheder i dit arbejde, vil dit team blive langt gladere, bedre fokuseret p\u00e5 at implementere de n\u00f8dvendige funktioner og med st\u00f8rre sandsynlighed hurtigere kunne rulle kvalitets\u00e6ndringer ud. Men det betyder ikke, at arbejdet ikke kan blive mere komplekst; nogle gange kr\u00e6ver implementering af nye funktioner justeringer af flere tjenester, og denne proces kan v\u00e6re mere udfordrende end den tilsvarende i en monolitisk arkitektur. Under alle omst\u00e6ndigheder er fordelene ved at anvende tilgangen med sm\u00e5 enheder det hele v\u00e6rd.<\/p>\n<p>Slutningen af den f\u00f8rste del.<\/p>\n<p>Vi offentligg\u00f8r snart den anden del af overs\u00e6ttelsen, men indtil da venter vi p\u00e5 dine kommentarer og inviterer dig til <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/mJ6e\/\">\u00e5bent hus<\/a><\/noindex>, der finder sted i dag klokken 20.00.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Principper for udvikling af moderne applikationer fra NGINX. Del 1 | ProHoster","description":"Hej, venner.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/34140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=34140"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/34140\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=34140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=34140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=34140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}