From 70795a3068197144a781cc5059ed0d48a4fe2258 Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Fri, 6 May 2022 10:08:48 +0200 Subject: [PATCH] Separate php container --- README.org | 12 ++++--- dockerfiles/bll/Dockerfile | 14 ++++++++ dockerfiles/docker-compose.yml | 19 ++++++++++ dockerfiles/web/Dockerfile | 17 ++------- dockerfiles/web/README.org | 25 +++++++++++++ dockerfiles/web/nginx.conf | 2 +- www/models/Vtubers.php | 64 +++++++++++++++++----------------- 7 files changed, 101 insertions(+), 52 deletions(-) create mode 100644 dockerfiles/bll/Dockerfile create mode 100644 dockerfiles/docker-compose.yml create mode 100644 dockerfiles/web/README.org diff --git a/README.org b/README.org index 18a2ba2..6828369 100644 --- a/README.org +++ b/README.org @@ -64,13 +64,17 @@ Se l'idol non è attualmente live viene mostrata una pagina che notifica l'utent * Setup ** Configurazione ed installazione server -*** Server web - Nginx +*** Presentation Layer - Nginx 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. -L'installazione viene effettuata tramite un docker container e la seguente [[./dockerfiles/web/Dockerfile][container image]]. -Nginx utilizza il seguente [[./dockerfiles/web/nginx.conf][file di configurazione]]. +/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./ -*** Server database - MariaDB +Per maggiori spiegazioni sulla container image e la configurazione di nginx recarsi [[./dockerfiles/web/README.org][qui]]. + +*** Business Logic Layer - PHP + +*** 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. ** Esecuzione server diff --git a/dockerfiles/bll/Dockerfile b/dockerfiles/bll/Dockerfile new file mode 100644 index 0000000..b826006 --- /dev/null +++ b/dockerfiles/bll/Dockerfile @@ -0,0 +1,14 @@ +FROM php:8.1.4-fpm-alpine3.14 +WORKDIR /var/www/html + +RUN apk update && apk add --no-cache \ + php8 \ + php8-fpm \ + php8-mysqli \ + php8-pdo \ + +RUN docker-php-ext-install pdo pdo_mysql mysqli + +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer + +CMD php-fpm -D diff --git a/dockerfiles/docker-compose.yml b/dockerfiles/docker-compose.yml new file mode 100644 index 0000000..ec92419 --- /dev/null +++ b/dockerfiles/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + web: + build: ./web/ + ports: + - "80:80" + volumes: + - ../www:/var/www/html + + app: + build: ./bll/ + volumes: + - ../www:/var/www/html + + db: + image: "mariadb" + environment: + MARIADB_USER: "root" + MARIADB_ROOT_PASSWORD: "root" diff --git a/dockerfiles/web/Dockerfile b/dockerfiles/web/Dockerfile index 480a6ca..75ffb8c 100644 --- a/dockerfiles/web/Dockerfile +++ b/dockerfiles/web/Dockerfile @@ -1,18 +1,5 @@ -FROM php:8.1.4-fpm-alpine3.14 +FROM nginx:stable-alpine WORKDIR /var/www/html -RUN apk update && apk add --no-cache \ - php8 \ - php8-fpm \ - php8-mysqli \ - php8-pdo \ - nginx - -RUN docker-php-ext-install pdo pdo_mysql mysqli -RUN docker-php-ext-enable pdo_mysql - -RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer -RUN php-fpm & - COPY nginx.conf /etc/nginx/nginx.conf -CMD php-fpm -D && nginx -g "daemon off;" +CMD nginx -g "daemon off;" diff --git a/dockerfiles/web/README.org b/dockerfiles/web/README.org new file mode 100644 index 0000000..5641d19 --- /dev/null +++ b/dockerfiles/web/README.org @@ -0,0 +1,25 @@ +#+title: Nginx + +* Contenuti :TOC: +- [[#configurazione-web-server][Configurazione web server]] +- [[#container-image][Container image]] + - [[#dockerfile][Dockerfile]] + +* Configurazione web server + +* Container image +Una container image è un package di software eseguibile, leggero ed isolato che include tutto il necessario per eseguire il suo compito, in questo caso svolge la funzione di web server. + +Le container image diventano container quando vengono eseguite dal *docker engine* tramite CLI o interfaccia grafica. + +Una soluzione alternativa ai container è la virtualizzazione. +Non ho optato per la virtualizzazione semplicemente perchè è molto comodo gestire i 3 diversi container tramite docker-compose da CLI. +Inoltre i container offrono performance miglori sfruttando il kernel della macchina host, ma questo nel contesto cloud è secondario. + +** Dockerfile +La base container image utilizzata è quella ufficiale di nginx reperibile sul sito web [[https://hub.docker.com/_/nginx?tab=description][hub.docker.com]]. +Per preferenza personale utilizzo il tag *stable-alpine* per usufruire della versione stable di nginx e per il ridotto numero di package preinstallati da alpine. + +#+begin_src dockerfile +FROM nginx:stable-alpine +#+end_src diff --git a/dockerfiles/web/nginx.conf b/dockerfiles/web/nginx.conf index 2775a51..8a5dac6 100644 --- a/dockerfiles/web/nginx.conf +++ b/dockerfiles/web/nginx.conf @@ -21,7 +21,7 @@ http { } location ~ \.php$ { - fastcgi_pass 127.0.0.1:9000; + fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi.conf; } diff --git a/www/models/Vtubers.php b/www/models/Vtubers.php index 0f33808..cf1f680 100644 --- a/www/models/Vtubers.php +++ b/www/models/Vtubers.php @@ -93,49 +93,49 @@ class Vtubers extends DbModel public function isLive(string $login, string $link) { - // if (str_contains($link, "twitch.tv")) { - // $clientID = Application::$app->config["twitch"]["clientid"] ?? ""; - // $token = Application::$app->config["twitch"]["token"] ?? ""; + if (str_contains($link, "twitch.tv")) { + $clientID = Application::$app->config["twitch"]["clientid"] ?? ""; + $token = Application::$app->config["twitch"]["token"] ?? ""; - // $url = "https://api.twitch.tv/helix/streams?user_login=$login"; + $url = "https://api.twitch.tv/helix/streams?user_login=$login"; - // $ch = curl_init($url); - // curl_setopt($ch, CURLOPT_URL, $url); - // curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - // curl_setopt($ch, CURLOPT_HTTPHEADER, array("Client-ID: $clientID", "Authorization: Bearer $token")); + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_HTTPHEADER, array("Client-ID: $clientID", "Authorization: Bearer $token")); - // $result = get_object_vars(json_decode(curl_exec($ch))); - // curl_close($ch); + $result = get_object_vars(json_decode(curl_exec($ch))); + curl_close($ch); - // return count($result["data"]) ? $result["data"] : []; - // } + return count($result["data"]) ? $result["data"] : []; + } - // if (str_contains($link, "youtube.com")) { - // $url = "https://www.youtube.com/channel/$login/live"; + if (str_contains($link, "youtube.com")) { + $url = "https://www.youtube.com/channel/$login/live"; - // $ch = curl_init($url); - // curl_setopt($ch, CURLOPT_URL, $url); - // curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - // $result = curl_exec($ch); - // curl_close($ch); + $result = curl_exec($ch); + curl_close($ch); - // $doc = new DOMDocument(); - // libxml_use_internal_errors(true); - // $doc->loadHTML($result); + $doc = new DOMDocument(); + libxml_use_internal_errors(true); + $doc->loadHTML($result); - // $result = $doc->getElementsByTagName("link"); - // $length = $result->length; + $result = $doc->getElementsByTagName("link"); + $length = $result->length; - // for ($i = 0; $i < $length; $i++) { - // $tag = $result->item($i)->getAttribute("href"); - // if (str_contains($tag, "https://www.youtube.com/watch?v=")) { - // return [str_replace("https://www.youtube.com/watch?v=", "", $tag)]; - // } - // } + for ($i = 0; $i < $length; $i++) { + $tag = $result->item($i)->getAttribute("href"); + if (str_contains($tag, "https://www.youtube.com/watch?v=")) { + return [str_replace("https://www.youtube.com/watch?v=", "", $tag)]; + } + } - // unset($doc); - // } + unset($doc); + } return []; } -- 2.52.0