From 1c53a4789f407e9ce5cba6cf2f5e310eda5f64a7 Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Fri, 20 May 2022 10:02:38 +0200 Subject: [PATCH] 3 layer architecture doc --- README.org | 18 ++++++++++++++++-- media/nginxApacheGraph.png | Bin 0 -> 24504 bytes 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 media/nginxApacheGraph.png diff --git a/README.org b/README.org index 174df4d..fa8cec1 100644 --- a/README.org +++ b/README.org @@ -63,15 +63,29 @@ Una volta cliccato verrà chiesto all'utente l'inserimento dell'URL del canale d * DONE Setup ** Configurazione ed installazione server -/Architettua a 3 livelli./ +L'architettura a 3 livelli è un'architettura software che organizza il codice in 3 livelli logici: +- Presentation layer: interfaccia con l'utente +- Application layer: dove i dati vengono processati +- Data layer: dove i dati dell'applicazione vengono immagazzinati ed organizzati + +Un vantaggio che offre questa architettura è la netta divisione delle 3 parti, questo permette la modifica o completo cambiamento di un layer senza andare ad influenzarne altri. *** Presentation Layer - Nginx +Il presentation layer è il layer che si occupa dell'interazione con l'utente. +Il suo compito principale è quello di mostrare e ricevere informazioni dal client. + Ho deciso di utilizzare Nginx come web server per le performance nettamente migliori e leggerezza in confronto ad altri web server. Inoltre la configura di Nginx è molto più semplice di web server come Apache. +[[./media/nginxApacheGraph.png]] /Soluzioni microsoft come il web server IIS non sono state considerate per via delle license sotto cui sono pubblicate ed a causa del mio odio verso i loro prodotti./ -*** Business Logic Layer - PHP +*** Application Layer - PHP +L'application layer rappresenta il cuore dell'applicazione. +In questo layer le informazioni ricevute dal presentation layer vengono elaborate anche in base a dati presenti nel data layer. +L'application layer può inoltre aggiungere, cancellare e modificare i dati nel data layer. + +Un docker container si occupa dell'esecuzione di php-fpm e rimane in ascolto sulla porta 9000. *** Data Layer - MariaDB L'installazione del database server mariadb viene anch'essa eseguita tramite un docker container e la container image disponibile su [[https://hub.docker.com/_/mariadb][hub.docker]] per cui non ha bisogno di alcuna configurazione. diff --git a/media/nginxApacheGraph.png b/media/nginxApacheGraph.png new file mode 100644 index 0000000000000000000000000000000000000000..148480e711895e968445ab60cdc126cca02a18e0 GIT binary patch literal 24504 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 literal 0 HcmV?d00001 -- 2.52.0