TP5: Web avec NGINX - SaigoNoo/Admin-II GitHub Wiki

Ressources:

Info Value
Lien vers le TP EPHEC-LLN
Accès SSH

Description

NGINX est un moteur Web, concurent à Apache ! Il se veut plus optimisé, et performant que Apache. NGINX gère également mieux les proxy reverse, mais a l'instar de Apache, il ne gère pas les .htaccess, fortement utilisés par des apps comme WordPress.

Ooooh coool, je peux faire mon site web ?

Oui, il suffit de faire une bonne config, un pointage correct sur le dossier ou le service au travers d'un proxy reverse, et d'un pointage DNS !

Dans le VPS

Lancement initial

On pourrait commencer par créer un fichier de config, mais ici ca ne sera pas nécessaire, car la config par défaut de NGINX propose déjà l'accès à index.html, mais voila quand même la syntaxe:

events {
}
http {
	server {
	    listen          80;
	    server_name     localhost;
	    index           index.html;
	    root            /var/www/html/;
	}
}

On peut commencer par créer notre docker-compose.yaml:

version: "3"

services:
  web:
    image: nginx:latest
    container_name: nginxdocker
    ports:
      - "8080:80"
    volumes:
      - ./index.html:/usr/share/nginx/html/index.html:ro

Ainsi que crée un bête fichier index.html:

<html>
        <body>
                <h1>Coucou on dirait NGINX fonctionne !</h1>
        </body>
</html>

On fait notre: docker-compose up -d et le service tourne !

Tester Bind9

Pour tester l'accès au site, on va utiliser lynx (sudo apt-get install lynx)

lynx localhost:8080

VirtualHosting

Le VirtualHosting est un concept dans Apache et NGINX qui permet au sein d'un même moteur web, d'avoir plusieurs instances d'Apache, qui tourne sur la même machine et sur le même port d'écoute si on le souhaite !

Exemple de syntaxe:

# Virtual Host 1
server {
    listen 80;
    server_name www.ephec-dns.be;

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

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

# Virtual Host 2
server {
    listen 80;
    server_name www2.ephec-dns.be;

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

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

Et la on aura 2 instances dans une même config (vous pouvez également séparer vos config si la structure l'impose !

Logs

Alors, HYPER HYPER important ! Les logs, c'est 80% de troubleshoot, ca aide quasi tout le temps a savoir pourquoi un serveur ne réponds pas convenablement a une requête HTTP ! Alors comment faire ? Très simple: Dans le VirtualHost, vous insérez ceci (où <site> peut vous aider a identifier un log.

{
  access_log /var/log/nginx/access-<site>.log;
  error_log /var/log/nginx/error-<site>.log;
}

Site dynamique

Un site dynamique, c'est un site où vous pouvez afficher un site au client, mais dont le contenu sera différent du fichier source fourni par le serveur initialement !

Étape 1: Base de donnée

Alors, personnellement, je ne trouve pas l'idée de déployer une base de donnée via Docker terrible. Le but d'une base de donnée est de centraliser toutes les données, et si on s'amuse a crée une base de donnée par docker, on se retrouve avec beaucoup d'instances !

Étape 2: Créer la table et donner les accès a un utilisateur

CREATE DATABASE woodytoys;
GRANT ALL PRIVILEGES ON woodytoys.* TO admin@localhost;
FLUSH PRIVILEGES;

Ensuite avec les accès utilisateur (moi c'est admin):

USE woodytoys;
CREATE TABLE products (id mediumint(8) unsigned NOT NULL auto_increment,product_name varchar(255) default NULL,product_price varchar(255) default NULL,PRIMARY KEY (id)) AUTO_INCREMENT=1;
INSERT INTO products (product_name,product_price) VALUES ("Set de 100 cubes multicolores","50"),("Yoyo","10"),("Circuit de billes","75"),("Arc à flèches","20"),("Maison de poupées","150");

Étape 3: Créer le code PHP

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

<h1>Catalogue WoodyToys</h1>

<?php
$dbname = 'woodytoys';
$dbuser = 'admin';
$dbpass = 'passworddemo';
$dbhost = 'host.docker.internal'; // ou 172.17.0.1 si host.docker.internal ne marche pas

// Correction ici : c'est new mysqli (pas mysqli_connect)
$connect = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

// Check la connexion
if ($connect->connect_error) {
    die("Échec de la connexion : " . $connect->connect_error);
}

// Requête SQL
$result = $connect->query("SELECT id, product_name, product_price FROM products");

if ($result && $result->num_rows > 0):
?>

<table>
  <tr>
    <th>Numéro de produit</th>
    <th>Descriptif</th>
    <th>Prix</th>
  </tr>

  <?php while ($row = $result->fetch_assoc()): ?>
    <tr>
      <td><?= htmlspecialchars($row['id']) ?></td>
      <td><?= htmlspecialchars($row['product_name']) ?></td>
      <td><?= htmlspecialchars($row['product_price']) ?> €</td>
    </tr>
  <?php endwhile; ?>

</table>

<?php
else:
    echo "<p>Aucun produit trouvé.</p>";
endif;

$connect->close();
?>

</body>
</html>

Étape 4: Créer le fichier default.config

server {
    listen 80;
    server_name www.ephec-dns.be;

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

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

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

Étape 5: Créer le docker-compose.yaml

version: '3.9'

services:
  nginx:
    image: nginx:latest
    container_name: nginxdocker
    ports:
      - "8080:80"
    volumes:
      - ./www:/var/www/html          
      - ./default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - php

  php:
    image: php:8.3-fpm
    container_name: php
    volumes:
      - ./www:/var/www/html
    command: >
      sh -c "docker-php-ext-install mysqli && php-fpm"

networks:
  webnet:
    driver: bridge

Étape 6: Permettre à docker de recevoir des requetes depuis docker

Il faut modifier la bind-address dans les paramètres, en raison de tests uniquement, on va autoriser l'écoute sur 0.0.0.0, mais à éviter en prod, uniquement pour des test.

/etc/mysql/mariadb.conf.d/50-server.cnf

bind-address            = 0.0.0.0

Ensuite autoriser l'accès pour 'admin' via 'une IP':

sudo mariadb -u root
CREATE USER 'admin'@'%' IDENTIFIED BY 'passworddemo';
GRANT ALL PRIVILEGES ON woodytoys.* TO 'admin'@'%';
FLUSH PRIVILEGES;

Étape 7: Tester

Dans Webmin, on a un utilitaire "Tunnel HTTP", qui nous permet de faire des requêtes internes sur un navigateur. image

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