TP5: Web avec NGINX - SaigoNoo/Admin-II GitHub Wiki
Info | Value |
---|---|
Lien vers le TP | EPHEC-LLN |
Accès | SSH |
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.
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 !
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 !
Pour tester l'accès au site, on va utiliser lynx (
sudo apt-get install lynx
)
lynx localhost:8080
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 !
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;
}
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 !
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 !
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");
<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>
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;
}
}
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
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;
Dans Webmin, on a un utilitaire "Tunnel HTTP", qui nous permet de faire des requêtes internes sur un navigateur.