AdminII TP05 Configuration du service web public - dudleydehenau/Ephec GitHub Wiki

TP5 : Configuration du service web public

1. Configuration de base d'un serveur web

Documentation de la première version de ma configuration Web avec :

  • La première configuration de notre Nginx était la suivante.
user nginx;
worker_processes auto;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format log_per_virtualhost '[$host] $remote_addr [$time_local]  $status ' '"$request" $body_bytes_sent';

    access_log /dev/stdout log_per_virtualhost;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80;
        server_name hello.l2-6.ephec-ti.be;

        root /var/www/html/accueil;
        index index.html;

        location / {
            try_files $uri $uri/ =404;
        }

        access_log /dev/stdout log_per_virtualhost;
    }

    server {
        listen 80;
        server_name blog.l2-6.ephec-ti.be;

        root /var/www/html/blog;
        index index.html;

        location / {
            try_files $uri $uri/ =404;
        }

        access_log /dev/stdout log_per_virtualhost;
    }

    server {
        listen 80;
        server_name www.l2-6.ephec-ti.be;

        root /var/www/html/www;
        index index.html;

        location ~*\.php$ {
            fastcgi_pass php:9000;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
}

La configuration est validée par l'outil de test Nginx.

image

  • Le Virtual Hosting est fonctionnel. En utilisant les différents noms de domaine, on est bien redirigé vers les différents sites.

image

image

  • Pour les logs, il suffit de rajouter ceci au fichier de configuration Nginx.

image

Et cela fonctionne, on a accès aux logs depuis la commande docker logs <container>.

image

2. Site web dynamique

  • Pour la mise en place du site web, il a fallu préciser la page PHP dans la configuration Nginx.
server {
        server_name www.l2-6.ephec-ti.be;

        root /var/www/html/www;
        index index.html;

        location ~*\.php$ {
            fastcgi_pass php:9000; 
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
        location /.well-known/acme-challenge/ {
            root /var/www/html;
        }
}

Et créer les mêmes répertoires pour le PHP ainsi qu'un conteneur destiné à la base de données. Pour plus de sécurité, nous avons utilisé des fichiers .env pour garder nos données sensibles privées. Nous avons aussi limité le nombre de ports à ouvrir en utilisant des réseaux Docker, ce qui réduit également le nombre de failles d'entrée possibles. Voici le fichier docker-compose.yml :

services:
  nginx:
    image: nginx:latest
    container_name: nginx_web
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - letsencrypt:/etc/letsencrypt
      - ./www/html:/var/www/html
      - ./config/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - dmz

  php:
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: php
    volumes:
      - ./www/html:/var/www/html
    networks:
      - dmz
      - db_net
    env_file: 
      - env/db.env

  mariadb:
    container_name: mariadb
    image: mariadb
    volumes:
      - db-data:/var/lib/mysql
      - ./woodytoys.sql:/docker-entrypoint-initdb.d/woodytoys.sql
      - ./my-resolve.cnf:/etc/mysql/conf.d/my-resolve.cnf
    env_file:
      - env/root.env
      - env/db.env
    restart: unless-stopped
    networks:
      - db_net

networks:
  db_net:
    driver: bridge
  dmz:
    driver: bridge

volumes:
  db-data:
  letsencrypt:

Et nous ajoutons un fichier products.php pour afficher notre page dynamique :

<html>
<style>
   table,
   th,
   td {
     padding: 10px;
     border: 1px solid black;
     border-collapse: collapse;
  }
</style>

<head>
<title>Catalogue WoodyToys</title>
</head>

<body>
<h1>Catalogue WoodyToys</h1>

<?php
// Paramètres de connexion à la base de données

$dbname = getenv('MARIADB_DATABASE');
$dbuser = getenv('MARIADB_USER');
$dbpass = getenv('MARIADB_PASSWORD');
$dbhost = getenv('MARIADB_HOST');
// Connexion à la base de données
$connect = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname) 
    or die("Impossible de se connecter à '$dbhost'");

// Requête pour récupérer les produits
$result = mysqli_query($connect, "SELECT id, product_name, product_price FROM products");

?>

<!-- Tableau pour afficher les produits -->
<table>
<tr>
 <th>Numéro de produit</th>
 <th>Descriptif</th>
 <th>Prix</th>
</tr>

<?php
// Affichage des produits dans le tableau
while ($row = mysqli_fetch_array($result)) {
    printf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>", $row[0], $row[1], $row[2]);
}
?>

</table>
</body>
</html>
  • Pour vérifier que cela fonctionne, on se rend sur la page web fraîchement créée.

image

Et par acquis de confiance, on vérifie la communication avec le conteneur PHP :

image

Ce qui fonctionne parfaitement.

⚠️ **GitHub.com Fallback** ⚠️