Configuration d’un Serveur Web Linux avec WordPress
Informations du Projet
Titre : Serveur Web Linux – Configuration complète avec Nginx, MySQL et WordPress
Technologies utilisées : Linux (Ubuntu), Nginx, MySQL, PHP, WordPress, Tailscale
Contexte : Mise en place d’une infrastructure web sécurisée avec accès distant contrôlé
Table des matières
- Résumé exécutif
- Objectifs du projet
- Architecture technique
- Méthodologie et mise en œuvre
- Configuration détaillée
- Sécurité et bonnes pratiques
- Tests et validation
- Difficultés rencontrées et solutions
- Résultats et livrables
- Perspectives d’amélioration
- Compétences acquises
- Annexes
1. Résumé exécutif
Ce projet consiste en la conception et la mise en place d’un serveur web complet sous Linux Ubuntu, hébergeant un site WordPress. L’infrastructure repose sur une stack LEMP (Linux, Nginx, MySQL, PHP) et intègre une solution d’accès distant sécurisé via Tailscale.
Résultats clés :
- Serveur web opérationnel et optimisé
- Connexions sécurisées via réseau privé virtuel (VPN)
- Infrastructure scalable et maintenable
- Documentation technique complète
2. Objectifs du projet
2.1 Objectifs principaux
- Déploiement d’un serveur web fonctionnel : Configurer un environnement Linux capable d’héberger des applications web
- Installation et configuration de WordPress : Mettre en place un CMS performant et sécurisé
- Sécurisation des accès : Implémenter un système d’accès distant sécurisé via Tailscale
- Optimisation des performances : Configurer Nginx pour des performances optimales
2.2 Objectifs secondaires
- Maîtriser l’administration système Linux
- Comprendre l’architecture des serveurs web modernes
- Appliquer les bonnes pratiques de sécurité
- Documenter l’infrastructure pour une maintenance facilitée
3. Architecture technique
3.1 Vue d’ensemble
┌─────────────────────────────────────────┐
│ Utilisateurs distants │
│ (via Tailscale) │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Tailscale VPN Mesh │
│ (Réseau privé sécurisé) │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Serveur Ubuntu Linux │
│ ┌───────────────────────────────────┐ │
│ │ Nginx (Web Server) │ │
│ │ - Reverse Proxy │ │
│ │ - SSL/TLS Termination │ │
│ └──────────────┬────────────────────┘ │
│ │ │
│ ┌──────────────▼────────────────────┐ │
│ │ PHP-FPM (7.4/8.x) │ │
│ │ - Traitement PHP │ │
│ │ - FastCGI Process Manager │ │
│ └──────────────┬────────────────────┘ │
│ │ │
│ ┌──────────────▼────────────────────┐ │
│ │ WordPress CMS │ │
│ │ - Application web │ │
│ │ - Gestion de contenu │ │
│ └──────────────┬────────────────────┘ │
│ │ │
│ ┌──────────────▼────────────────────┐ │
│ │ MySQL Database │ │
│ │ - Stockage des données │ │
│ │ - Gestion des utilisateurs │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘
3.2 Composants de la stack
| Composant | Version | Rôle |
|---|---|---|
| Ubuntu Server | 20.04/22.04 LTS | Système d’exploitation |
| Nginx | 1.18+ | Serveur web et reverse proxy |
| MySQL | 8.0 | Système de gestion de base de données |
| PHP-FPM | 7.4/8.x | Interpréteur PHP |
| WordPress | Latest | CMS et application web |
| Tailscale | Latest | VPN mesh et accès sécurisé |
3.3 Infrastructure réseau
- Réseau local : Configuration standard du serveur
- Tailscale VPN : Réseau overlay sécurisé (WireGuard)
- Ports utilisés :
- Port 80 (HTTP) – Redirection vers HTTPS
- Port 443 (HTTPS) – Trafic web sécurisé
- Port 3306 (MySQL) – Accès base de données (localhost uniquement)
- Port 41641 (Tailscale) – Communication VPN
4. Méthodologie et mise en œuvre
4.1 Approche du projet
Le projet a été réalisé selon une méthodologie structurée :
- Phase de planification : Analyse des besoins et choix technologiques
- Phase de préparation : Installation du système d’exploitation
- Phase de configuration : Mise en place de chaque composant
- Phase de tests : Validation et optimisation
- Phase de documentation : Rédaction de la documentation technique
4.2 Chronologie de mise en œuvre
Étape 1 : Préparation du serveur
- Installation d’Ubuntu Server
- Mise à jour du système
- Configuration initiale de sécurité
Étape 2 : Installation de la stack LEMP
- Installation de Nginx
- Installation et configuration de MySQL
- Installation de PHP et des extensions nécessaires
Étape 3 : Déploiement de WordPress
- Téléchargement de WordPress
- Configuration de la base de données
- Configuration de Nginx pour WordPress
Étape 4 : Sécurisation
- Installation de Tailscale
- Configuration du pare-feu (UFW)
- Mise en place des certificats SSL
Étape 5 : Tests et optimisation
- Tests de performance
- Optimisation de la configuration
- Validation de la sécurité
5. Configuration détaillée
5.1 Installation et configuration du système de base
5.1.1 Prérequis et téléchargement d’Ubuntu
Télécharger Ubuntu Server :
- 🔗 Site officiel : https://ubuntu.com/download/server
- Version recommandée : Ubuntu Server 22.04 LTS (Long Term Support)
- Fichier ISO : ubuntu-22.04.x-live-server-amd64.iso
Créer une clé USB bootable :
- Windows : Rufus (https://rufus.ie/)
- Linux :
sudo dd if=ubuntu-22.04.x-live-server-amd64.iso of=/dev/sdX bs=4M status=progress - macOS : balenaEtcher (https://www.balena.io/etcher/)
Installation d’Ubuntu Server :
- Démarrer sur la clé USB
- Choisir « Install Ubuntu Server »
- Configuration réseau (DHCP ou IP statique)
- Configuration du disque (utiliser tout le disque)
- Créer votre utilisateur principal
- Installer OpenSSH Server (cocher l’option)
- Terminer l’installation et redémarrer
5.1.2 Première connexion et mise à jour du système
# Se connecter au serveur via SSH (depuis votre PC)
ssh votre_utilisateur@adresse_ip_du_serveur
# Exemple : ssh [email protected]
# Une fois connecté, mettre à jour le système
sudo apt update
sudo apt upgrade -y
# Installation des outils essentiels
sudo apt install -y curl wget git vim ufw software-properties-common
# Vérifier la version d'Ubuntu
lsb_release -a
# Vérifier l'espace disque disponible
df -h
# Vérifier la mémoire RAM
free -h
5.1.3 Configuration du pare-feu UFW
# Vérifier le statut d'UFW
sudo ufw status
# Configuration des règles par défaut
sudo ufw default deny incoming # Bloquer tout le trafic entrant par défaut
sudo ufw default allow outgoing # Autoriser tout le trafic sortant
# Autoriser SSH (IMPORTANT : à faire AVANT d'activer UFW)
sudo ufw allow ssh
# OU si vous utilisez un port SSH personnalisé :
# sudo ufw allow 2222/tcp
# Autoriser HTTP et HTTPS pour Nginx
sudo ufw allow 'Nginx Full'
# OU manuellement :
# sudo ufw allow 80/tcp
# sudo ufw allow 443/tcp
# Activer le pare-feu
sudo ufw enable
# Vérifier les règles actives
sudo ufw status verbose
Résultat attendu :
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
Nginx Full ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
5.1.4 Sécurisation SSH (Optionnel mais recommandé)
# Éditer la configuration SSH
sudo vim /etc/ssh/sshd_config
# Modifications recommandées (décommenter et modifier ces lignes) :
# Port 2222 # Changer le port par défaut
# PermitRootLogin no # Interdire la connexion root
# PasswordAuthentication no # Désactiver l'auth par mot de passe (après avoir configuré les clés SSH)
# PubkeyAuthentication yes # Activer l'auth par clé publique
# Redémarrer SSH
sudo systemctl restart sshd
# Vérifier le statut
sudo systemctl status sshd
Configuration des clés SSH (sur votre PC local) :
# Sur votre ordinateur local (Windows/Linux/Mac)
# Générer une paire de clés SSH
ssh-keygen -t ed25519 -C "[email protected]"
# Appuyez sur Entrée pour le fichier par défaut
# Choisissez une passphrase (recommandé)
# Copier la clé publique vers le serveur
ssh-copy-id votre_utilisateur@adresse_ip_du_serveur
# OU manuellement :
cat ~/.ssh/id_ed25519.pub | ssh votre_utilisateur@adresse_ip_du_serveur "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# Tester la connexion avec la clé
ssh votre_utilisateur@adresse_ip_du_serveur
5.2 Installation et configuration de Nginx
5.2.1 Installation de Nginx
# Mettre à jour la liste des paquets
sudo apt update
# Installer Nginx
sudo apt install nginx -y
# Vérifier la version installée
nginx -v
# Démarrer Nginx
sudo systemctl start nginx
# Activer Nginx au démarrage du système
sudo systemctl enable nginx
# Vérifier le statut de Nginx
sudo systemctl status nginx
Résultat attendu :
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since...
5.2.2 Test initial de Nginx
# Obtenir l'adresse IP du serveur
ip addr show
# OU
hostname -I
# Tester depuis le serveur
curl localhost
# Depuis votre navigateur, accéder à : http://adresse_ip_du_serveur
# Vous devriez voir la page "Welcome to nginx!"
5.2.3 Structure des répertoires Nginx
# Comprendre l'organisation des fichiers Nginx
ls -la /etc/nginx/
# Fichiers et répertoires importants :
# /etc/nginx/nginx.conf - Configuration principale
# /etc/nginx/sites-available/ - Sites disponibles
# /etc/nginx/sites-enabled/ - Sites activés (liens symboliques)
# /var/log/nginx/ - Fichiers de logs
# /var/www/html/ - Répertoire web par défaut
5.2.4 Configuration de Nginx pour WordPress
# Créer le fichier de configuration pour WordPress
sudo vim /etc/nginx/sites-available/wordpress
# Copier et coller la configuration suivante :
Contenu du fichier /etc/nginx/sites-available/wordpress :
server {
listen 80;
listen [::]:80;
# Remplacer par votre nom de domaine ou adresse IP
server_name example.com www.example.com;
# Pour utiliser une IP : server_name 192.168.1.100;
root /var/www/wordpress;
index index.php index.html index.htm;
# Logs
access_log /var/log/nginx/wordpress_access.log;
error_log /var/log/nginx/wordpress_error.log;
# Configuration principale WordPress
location / {
try_files $uri $uri/ /index.php?$args;
}
# Traitement des fichiers PHP
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# ATTENTION : Vérifier la version de PHP installée
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Sécurité : bloquer l'accès aux fichiers .htaccess
location ~ /\.ht {
deny all;
}
# Optimisation : ne pas logger les requêtes pour favicon et robots.txt
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
log_not_found off;
access_log off;
allow all;
}
# Cache des fichiers statiques
location ~* \.(css|gif|ico|jpeg|jpg|js|png|webp|woff|woff2|ttf|svg|eot)$ {
expires max;
log_not_found off;
access_log off;
}
# Sécurité WordPress : bloquer l'accès à certains fichiers
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
# Limiter les méthodes HTTP autorisées
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
}
5.2.5 Activation de la configuration WordPress
# Désactiver le site par défaut
sudo unlink /etc/nginx/sites-enabled/default
# Créer un lien symbolique pour activer le site WordPress
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
# Vérifier qu'il n'y a pas d'erreur dans la configuration
sudo nginx -t
# Si le test est OK, vous verrez :
# nginx: configuration file /etc/nginx/nginx.conf test is successful
# Recharger Nginx pour appliquer les changements
sudo systemctl reload nginx
# Vérifier le statut
sudo systemctl status nginx
5.2.6 Optimisation de Nginx (Optionnel)
# Éditer le fichier de configuration principal
sudo vim /etc/nginx/nginx.conf
Optimisations recommandées dans nginx.conf :
# Dans la section http {}
http {
# Augmenter la taille des buffers
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 64M;
large_client_header_buffers 2 1k;
# Optimisation des timeouts
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;
# Compression Gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript
application/json application/javascript application/xml+rss
application/rss+xml font/truetype font/opentype
application/vnd.ms-fontobject image/svg+xml;
# Cacher les informations de version
server_tokens off;
# ... reste de la configuration
}
# Après modification, toujours tester la configuration
sudo nginx -t
# Redémarrer Nginx
sudo systemctl restart nginx
5.2.7 Commandes utiles pour Nginx
# Tester la configuration
sudo nginx -t
# Recharger la configuration (sans interruption)
sudo systemctl reload nginx
# Redémarrer Nginx
sudo systemctl restart nginx
# Arrêter Nginx
sudo systemctl stop nginx
# Voir les logs en temps réel
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/wordpress_error.log
# Vérifier les processus Nginx
ps aux | grep nginx
# Vérifier les ports en écoute
sudo ss -tlnp | grep nginx
5.3 Installation et configuration de MySQL
5.3.1 Installation de MySQL Server
# Mettre à jour les paquets
sudo apt update
# Installer MySQL Server
sudo apt install mysql-server -y
# Vérifier la version installée
mysql --version
# Démarrer MySQL
sudo systemctl start mysql
# Activer MySQL au démarrage
sudo systemctl enable mysql
# Vérifier le statut
sudo systemctl status mysql
Résultat attendu :
● mysql.service - MySQL Community Server
Loaded: loaded
Active: active (running)
5.3.2 Sécurisation de MySQL
# Lancer le script de sécurisation
sudo mysql_secure_installation
Réponses recommandées lors de l’installation :
1. Validate Password Component?
→ Appuyez sur Y (Oui) pour activer la validation de mot de passe
2. Password Validation Policy Level (0=LOW, 1=MEDIUM, 2=STRONG)
→ Choisir 1 ou 2 (recommandé : 1 pour MEDIUM)
3. Set root password?
→ Y (Oui) puis entrez un mot de passe fort
→ Exemple : MyS3cur3P@ssw0rd!2024
4. Remove anonymous users?
→ Y (Oui) - Pour supprimer les utilisateurs anonymes
5. Disallow root login remotely?
→ Y (Oui) - Pour interdire la connexion root à distance
6. Remove test database?
→ Y (Oui) - Pour supprimer la base de test
7. Reload privilege tables now?
→ Y (Oui) - Pour appliquer les changements
5.3.3 Test de connexion à MySQL
# Se connecter à MySQL en tant que root
sudo mysql -u root -p
# Entrez le mot de passe root défini précédemment
# Une fois connecté, vous verrez :
# mysql>
# Tester quelques commandes :
SHOW DATABASES;
SELECT VERSION();
STATUS;
# Quitter MySQL
EXIT;
5.3.4 Création de la base de données WordPress
# Se connecter à MySQL
sudo mysql -u root -p
Exécuter les commandes SQL suivantes :
-- Créer la base de données pour WordPress
CREATE DATABASE wordpress_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Créer un utilisateur dédié à WordPress
-- Remplacer 'VotreMotDePasseSecurise123!' par un mot de passe fort
CREATE USER 'wordpress_user'@'localhost' IDENTIFIED BY 'VotreMotDePasseSecurise123!';
-- Accorder tous les privilèges sur la base wordpress_db à l'utilisateur
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wordpress_user'@'localhost';
-- Appliquer les changements
FLUSH PRIVILEGES;
-- Vérifier que la base est créée
SHOW DATABASES;
-- Vérifier les utilisateurs
SELECT User, Host FROM mysql.user;
-- Quitter MySQL
EXIT;
Résultat attendu :
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wordpress_db | ← Votre nouvelle base
+--------------------+
5.3.5 Test de l’utilisateur WordPress
# Tester la connexion avec le nouvel utilisateur
mysql -u wordpress_user -p
# Entrez le mot de passe de wordpress_user
# Vérifier l'accès à la base
SHOW DATABASES;
USE wordpress_db;
SHOW TABLES; # Devrait être vide pour le moment
# Quitter
EXIT;
5.3.6 Configuration de sécurité MySQL (Optionnel)
# Éditer le fichier de configuration MySQL
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
Optimisations recommandées :
[mysqld]
# Écouter uniquement sur localhost (sécurité)
bind-address = 127.0.0.1
# Optimisation de la performance
max_connections = 100
connect_timeout = 10
wait_timeout = 600
max_allowed_packet = 64M
thread_cache_size = 128
sort_buffer_size = 4M
bulk_insert_buffer_size = 16M
tmp_table_size = 32M
max_heap_table_size = 32M
# Optimisation InnoDB
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
# Logs (optionnel, utile pour debug)
# general_log_file = /var/log/mysql/mysql.log
# general_log = 1
# log_error = /var/log/mysql/error.log
# slow_query_log = 1
# slow_query_log_file = /var/log/mysql/mysql-slow.log
# long_query_time = 2
# Redémarrer MySQL pour appliquer les changements
sudo systemctl restart mysql
# Vérifier le statut
sudo systemctl status mysql
5.3.7 Sauvegarde de la base de données
# Créer un répertoire pour les sauvegardes
sudo mkdir -p /var/backups/mysql
sudo chmod 700 /var/backups/mysql
# Sauvegarder la base wordpress_db
sudo mysqldump -u wordpress_user -p wordpress_db > /var/backups/mysql/wordpress_db_$(date +%Y%m%d).sql
# Sauvegarder avec compression
sudo mysqldump -u wordpress_user -p wordpress_db | gzip > /var/backups/mysql/wordpress_db_$(date +%Y%m%d).sql.gz
# Restaurer une sauvegarde (si nécessaire)
# mysql -u wordpress_user -p wordpress_db < /var/backups/mysql/wordpress_db_20240101.sql
5.3.8 Commandes MySQL utiles
# Se connecter à MySQL
sudo mysql -u root -p
# Depuis l'interface MySQL :
SHOW DATABASES; # Lister les bases de données
USE wordpress_db; # Sélectionner une base
SHOW TABLES; # Lister les tables
DESCRIBE nom_table; # Voir la structure d'une table
SELECT * FROM nom_table LIMIT 10; # Voir les données
# Gestion des utilisateurs
SELECT User, Host FROM mysql.user; # Lister les utilisateurs
SHOW GRANTS FOR 'wordpress_user'@'localhost'; # Voir les privilèges
# Maintenance
OPTIMIZE TABLE nom_table; # Optimiser une table
CHECK TABLE nom_table; # Vérifier l'intégrité
REPAIR TABLE nom_table; # Réparer une table
# Depuis le terminal :
sudo systemctl status mysql # Statut du service
sudo systemctl restart mysql # Redémarrer MySQL
sudo tail -f /var/log/mysql/error.log # Voir les logs d'erreur
# Vérifier les processus MySQL
sudo mysqladmin -u root -p processlist # Processus en cours
sudo mysqladmin -u root -p status # Statut général
5.3.9 Résolution de problèmes courants
Problème : Impossible de se connecter à MySQL
# Vérifier que MySQL est en cours d'exécution
sudo systemctl status mysql
# Vérifier les logs
sudo tail -50 /var/log/mysql/error.log
# Redémarrer MySQL
sudo systemctl restart mysql
Problème : Mot de passe root oublié
# Arrêter MySQL
sudo systemctl stop mysql
# Démarrer en mode sans validation de mot de passe
sudo mysqld_safe --skip-grant-tables &
# Se connecter sans mot de passe
sudo mysql -u root
# Réinitialiser le mot de passe
ALTER USER 'root'@'localhost' IDENTIFIED BY 'nouveau_mot_de_passe';
FLUSH PRIVILEGES;
EXIT;
# Redémarrer MySQL normalement
sudo systemctl restart mysql
5.4 Installation et configuration de PHP
5.4.1 Installation de PHP et extensions
# Mettre à jour les paquets
sudo apt update
# Installer PHP-FPM et les extensions nécessaires pour WordPress
sudo apt install -y php-fpm php-mysql php-curl php-gd php-mbstring \
php-xml php-xmlrpc php-soap php-intl php-zip php-cli php-common \
php-bcmath php-imagick php-opcache
# Vérifier la version de PHP installée
php -v
# Vérifier quelle version de PHP-FPM est installée
ls /var/run/php/
# Résultat attendu : php8.1-fpm.sock (ou php7.4-fpm.sock selon la version)
Note importante : Ubuntu 22.04 installe PHP 8.1 par défaut. Si vous avez Ubuntu 20.04, ce sera PHP 7.4. Adaptez les commandes selon votre version.
5.4.2 Démarrage de PHP-FPM
# Démarrer PHP-FPM (adapter la version selon votre installation)
sudo systemctl start php8.1-fpm
# Activer au démarrage
sudo systemctl enable php8.1-fpm
# Vérifier le statut
sudo systemctl status php8.1-fpm
Résultat attendu :
● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
Loaded: loaded
Active: active (running)
5.4.3 Configuration de PHP pour WordPress
# Éditer le fichier php.ini pour PHP-FPM
sudo vim /etc/php/8.1/fpm/php.ini
Modifications recommandées dans php.ini :
Cherchez et modifiez les lignes suivantes (utilisez / pour chercher dans vim) :
# Augmenter la limite de mémoire
memory_limit = 256M
# Augmenter le temps d'exécution maximum
max_execution_time = 300
# Augmenter le temps d'upload
max_input_time = 300
# Augmenter la taille maximale des uploads
upload_max_filesize = 64M
post_max_size = 64M
# Nombre maximum de fichiers uploadés
max_file_uploads = 20
# Activer opcache pour de meilleures performances
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
# Timezone (adapter selon votre zone)
date.timezone = Europe/Paris
Aide pour éditer avec vim :
- Appuyez sur 'i' pour entrer en mode insertion
- Modifiez les valeurs
- Appuyez sur 'Esc' pour sortir du mode insertion
- Tapez ':wq' puis Entrée pour sauvegarder et quitter
5.4.4 Configuration du pool PHP-FPM
# Éditer la configuration du pool www
sudo vim /etc/php/8.1/fpm/pool.d/www.conf
Vérifier/Modifier ces paramètres :
# Utilisateur et groupe (doivent être www-data pour Nginx)
user = www-data
group = www-data
# Écoute sur socket Unix (plus performant que TCP)
listen = /run/php/php8.1-fpm.sock
# Permissions du socket
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
# Gestion des processus (adapter selon votre RAM)
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500
5.4.5 Redémarrage de PHP-FPM
# Après toute modification de configuration, redémarrer PHP-FPM
sudo systemctl restart php8.1-fpm
# Vérifier qu'il n'y a pas d'erreur
sudo systemctl status php8.1-fpm
# Vérifier les logs si problème
sudo tail -f /var/log/php8.1-fpm.log
5.4.6 Test de PHP avec Nginx
# Créer un fichier de test PHP
sudo vim /var/www/html/info.php
Contenu du fichier info.php :
<?php
phpinfo();
?>
# Définir les bonnes permissions
sudo chown www-data:www-data /var/www/html/info.php
# Accéder au fichier depuis votre navigateur
# http://adresse_ip_du_serveur/info.php
# Vous devriez voir la page d'information PHP avec toutes les extensions
# IMPORTANT : Supprimer le fichier après le test (sécurité)
sudo rm /var/www/html/info.php
5.4.7 Vérification des extensions PHP
# Lister toutes les extensions PHP installées
php -m
# Vérifier une extension spécifique
php -m | grep mysqli
php -m | grep curl
php -m | grep gd
# Extensions essentielles pour WordPress :
# - mysqli ou pdo_mysql (base de données)
# - curl (requêtes HTTP)
# - gd ou imagick (manipulation d'images)
# - mbstring (gestion des chaînes multi-octets)
# - xml (traitement XML)
# - zip (compression)
Si une extension manque :
# Installer une extension manquante (exemple avec gd)
sudo apt install php8.1-gd
# Redémarrer PHP-FPM
sudo systemctl restart php8.1-fpm
5.4.8 Optimisation de PHP pour production
# Créer un fichier de configuration personnalisé pour WordPress
sudo vim /etc/php/8.1/fpm/conf.d/99-wordpress.ini
Contenu du fichier 99-wordpress.ini :
; Optimisations WordPress
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_time = 300
memory_limit = 256M
; Sécurité
expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
; Performance
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 1
# Créer le fichier de log d'erreurs
sudo touch /var/log/php_errors.log
sudo chown www-data:www-data /var/log/php_errors.log
# Redémarrer PHP-FPM
sudo systemctl restart php8.1-fpm
5.4.9 Commandes PHP utiles
# Voir la configuration PHP
php -i
# Voir la version de PHP
php -v
# Vérifier la syntaxe d'un fichier PHP
php -l /chemin/vers/fichier.php
# Exécuter un script PHP en ligne de commande
php /chemin/vers/script.php
# Voir les modules chargés
php -m
# Voir la configuration d'une directive spécifique
php -i | grep memory_limit
# Redémarrer PHP-FPM
sudo systemctl restart php8.1-fpm
# Recharger la configuration sans interruption
sudo systemctl reload php8.1-fpm
# Voir les logs PHP-FPM
sudo tail -f /var/log/php8.1-fpm.log
# Voir les processus PHP-FPM
ps aux | grep php-fpm
# Vérifier les sockets PHP-FPM
ls -la /var/run/php/
5.4.10 Résolution de problèmes courants
Erreur 502 Bad Gateway :
# Vérifier que PHP-FPM fonctionne
sudo systemctl status php8.1-fpm
# Vérifier que le socket existe
ls -la /var/run/php/php8.1-fpm.sock
# Vérifier les permissions du socket
# Doit être : www-data:www-data
# Vérifier les logs
sudo tail -50 /var/log/php8.1-fpm.log
sudo tail -50 /var/log/nginx/error.log
PHP ne s’exécute pas :
# Vérifier la configuration Nginx
sudo nginx -t
# Vérifier que le bon socket est configuré dans Nginx
grep "fastcgi_pass" /etc/nginx/sites-available/wordpress
# Doit correspondre à : unix:/var/run/php/php8.1-fpm.sock
Uploads de fichiers échouent :
# Vérifier les limites PHP
php -i | grep upload_max_filesize
php -i | grep post_max_size
# Vérifier les permissions du répertoire uploads WordPress
ls -la /var/www/wordpress/wp-content/uploads/
sudo chown -R www-data:www-data /var/www/wordpress/wp-content/uploads/
5.5 Installation et configuration de WordPress
5.5.1 Préparation du répertoire
# Créer le répertoire pour WordPress
sudo mkdir -p /var/www/wordpress
# Se positionner dans le répertoire
cd /var/www/wordpress
5.5.2 Téléchargement de WordPress
# Télécharger la dernière version de WordPress (en français)
sudo wget https://fr.wordpress.org/latest-fr_FR.tar.gz
# OU pour la version anglaise :
# sudo wget https://wordpress.org/latest.tar.gz
# Vérifier le téléchargement
ls -lh
# Extraire l'archive
sudo tar -xzvf latest-fr_FR.tar.gz
# Déplacer les fichiers WordPress à la racine du répertoire
sudo mv wordpress/* .
# Nettoyer les fichiers temporaires
sudo rm -rf wordpress latest-fr_FR.tar.gz
# Vérifier le contenu
ls -la
Résultat attendu :
drwxr-xr-x 5 root root 4096 ... .
drwxr-xr-x 3 root root 4096 ... ..
-rw-r--r-- 1 root root 405 ... index.php
-rw-r--r-- 1 root root 19915 ... license.txt
-rw-r--r-- 1 root root 7437 ... readme.html
-rw-r--r-- 1 root root 7165 ... wp-activate.php
drwxr-xr-x 9 root root 4096 ... wp-admin
... (autres fichiers WordPress)
5.5.3 Configuration des permissions
# Définir www-data comme propriétaire (utilisateur de Nginx)
sudo chown -R www-data:www-data /var/www/wordpress
# Définir les permissions pour les répertoires (755)
sudo find /var/www/wordpress -type d -exec chmod 755 {} \;
# Définir les permissions pour les fichiers (644)
sudo find /var/www/wordpress -type f -exec chmod 644 {} \;
# Permissions spéciales pour wp-config.php (sera créé plus tard)
# Cette commande échouera pour l'instant, c'est normal
# sudo chmod 600 /var/www/wordpress/wp-config.php
# Vérifier les permissions
ls -la /var/www/wordpress
5.5.4 Configuration de WordPress
# Copier le fichier de configuration exemple
sudo cp /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php
# Éditer le fichier de configuration
sudo vim /var/www/wordpress/wp-config.php
Modifications dans wp-config.php :
Trouver et modifier les lignes suivantes (lignes 23-34 environ) :
// ** Réglages MySQL ** //
define('DB_NAME', 'wordpress_db'); // Nom de la base créée précédemment
define('DB_USER', 'wordpress_user'); // Nom de l'utilisateur MySQL créé
define('DB_PASSWORD', 'VotreMotDePasseSecurise123!'); // Mot de passe MySQL
define('DB_HOST', 'localhost'); // Hôte (localhost si MySQL est sur le même serveur)
define('DB_CHARSET', 'utf8mb4'); // Encodage de la base
define('DB_COLLATE', ''); // Collation (laisser vide)
5.5.5 Génération des clés de sécurité
Les clés de sécurité sont essentielles pour la sécurité de WordPress.
# Générer des clés uniques en ligne
# Ouvrir ce lien dans votre navigateur :
# https://api.wordpress.org/secret-key/1.1/salt/
# Le site générera 8 lignes comme ceci :
Exemple de clés générées (NE PAS UTILISER CES EXEMPLES) :
define('AUTH_KEY', 'mettez ici votre phrase unique');
define('SECURE_AUTH_KEY', 'mettez ici votre phrase unique');
define('LOGGED_IN_KEY', 'mettez ici votre phrase unique');
define('NONCE_KEY', 'mettez ici votre phrase unique');
define('AUTH_SALT', 'mettez ici votre phrase unique');
define('SECURE_AUTH_SALT', 'mettez ici votre phrase unique');
define('LOGGED_IN_SALT', 'mettez ici votre phrase unique');
define('NONCE_SALT', 'mettez ici votre phrase unique');
# Dans le fichier wp-config.php, remplacer les 8 lignes (lignes 49-56 environ)
# par celles générées sur le site
5.5.6 Configuration supplémentaire WordPress (Optionnel)
Ajouter à la fin de wp-config.php (avant /* C'est tout */) :
// Forcer HTTPS (après installation du certificat SSL)
// define('FORCE_SSL_ADMIN', true);
// Désactiver l'éditeur de fichiers dans l'admin (sécurité)
define('DISALLOW_FILE_EDIT', true);
// Limiter les révisions de posts
define('WP_POST_REVISIONS', 5);
// Vider la corbeille automatiquement (tous les 7 jours)
define('EMPTY_TRASH_DAYS', 7);
// Augmenter la mémoire allouée à WordPress
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
// Activer le mode debug (à désactiver en production)
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY', false);
// Configuration des mises à jour automatiques
define('WP_AUTO_UPDATE_CORE', 'minor'); // Mises à jour mineures automatiques
# Sauvegarder et fermer le fichier
# Appuyez sur Esc puis tapez :wq
# Définir les permissions strictes pour wp-config.php
sudo chmod 600 /var/www/wordpress/wp-config.php
sudo chown www-data:www-data /var/www/wordpress/wp-config.php
5.5.7 Finalisation de l’installation via navigateur
AVANT de continuer, assurez-vous que :
- Nginx est configuré et en fonctionnement
- Le site est activé dans Nginx
- La base de données MySQL est créée
# Vérifier que tout est en ordre
sudo nginx -t
sudo systemctl status nginx
sudo systemctl status mysql
sudo systemctl status php8.1-fpm
# Si tout est OK, accéder à WordPress via le navigateur
Dans votre navigateur, accédez à :
http://adresse_ip_de_votre_serveur
# OU
http://votre-nom-de-domaine.com
L’installation WordPress en 5 minutes s’affiche :
- Langue : Sélectionner « Français » puis « Continuer »
- Informations du site :
- Titre du site :
Mon Site WordPress - Identifiant :
admin_user(évitez « admin ») - Mot de passe : Généré automatiquement (fort)
- E-mail : Votre adresse email
- Visibilité moteurs de recherche : Décocher pour le moment
- Cliquez sur « Installer WordPress »
- Connexion :
- L’installation est terminée !
- Cliquez sur « Se connecter »
- Entrez vos identifiants
- Tableau de bord WordPress :
- Vous êtes maintenant dans l’interface d’administration
- URL admin :
http://votre-site.com/wp-admin
5.5.8 Configuration post-installation
# Se connecter en SSH au serveur
# Vérifier les permissions des répertoires uploads
sudo mkdir -p /var/www/wordpress/wp-content/uploads
sudo chown -R www-data:www-data /var/www/wordpress/wp-content/uploads
sudo chmod -R 755 /var/www/wordpress/wp-content/uploads
Dans le tableau de bord WordPress :
- Réglages > Général :
- Vérifier l’URL du site
- Fuseau horaire : Europe/Paris
- Format de date
- Réglages > Permaliens :
- Sélectionner « Nom de l’article » (meilleur pour SEO)
- Enregistrer
- Extensions :
- Wordfence Security (sécurité)
- UpdraftPlus (sauvegarde)
- WP Super Cache ou W3 Total Cache (performance)
5.5.9 Test de fonctionnement
# Tester l'upload de fichiers
# Dans WordPress : Médias > Ajouter
# Essayer d'uploader une image
# En cas d'erreur d'upload, vérifier :
ls -la /var/www/wordpress/wp-content/uploads/
sudo chown -R www-data:www-data /var/www/wordpress/wp-content/
sudo chmod -R 755 /var/www/wordpress/wp-content/
# Tester la création d'article
# Articles > Ajouter
# Créer un article de test et le publier
# Voir les logs en cas de problème
sudo tail -f /var/log/nginx/wordpress_error.log
sudo tail -f /var/log/php8.1-fpm.log
5.5.10 Sécurisation WordPress
# Protéger wp-config.php avec Nginx
sudo vim /etc/nginx/sites-available/wordpress
Ajouter dans le bloc server {} :
# Bloquer l'accès à wp-config.php
location ~* wp-config.php {
deny all;
}
# Bloquer l'accès au fichier readme.html
location ~* readme\.html {
deny all;
}
# Bloquer l'accès au répertoire .git si présent
location ~ /\.git {
deny all;
}
# Recharger Nginx
sudo nginx -t
sudo systemctl reload nginx
# Désactiver l'éditeur de thèmes et plugins (déjà fait dans wp-config.php)
# Vérifier que cette ligne est présente dans wp-config.php :
# define('DISALLOW_FILE_EDIT', true);
# Créer un fichier .htaccess de base (pour Apache, pas utilisé avec Nginx mais utile)
sudo vim /var/www/wordpress/.htaccess
Contenu du .htaccess :
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
5.5.11 Commandes WordPress utiles
# Mettre à jour WordPress via WP-CLI (outil en ligne de commande)
# D'abord installer WP-CLI :
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
# Vérifier l'installation de WP-CLI
wp --info
# Utiliser WP-CLI (toujours en tant que www-data)
cd /var/www/wordpress
# Lister les plugins
sudo -u www-data wp plugin list
# Mettre à jour tous les plugins
sudo -u www-data wp plugin update --all
# Mettre à jour le core WordPress
sudo -u www-data wp core update
# Lister les utilisateurs
sudo -u www-data wp user list
# Vider le cache
sudo -u www-data wp cache flush
# Vérifier la version de WordPress
sudo -u www-data wp core version
Liens utiles WordPress :
- Documentation officielle : https://fr.wordpress.org/support/
- Codex WordPress : https://codex.wordpress.org/
- WP-CLI : https://wp-cli.org/
- Répertoire des plugins : https://fr.wordpress.org/plugins/
- Répertoire des thèmes : https://fr.wordpress.org/themes/
5.6 Installation et configuration de Tailscale
5.6.1 Qu’est-ce que Tailscale ?
Tailscale est un VPN moderne basé sur WireGuard qui crée un réseau privé sécurisé entre vos appareils. Il permet un accès distant sécurisé sans ouvrir de ports sur votre pare-feu.
Avantages :
- Chiffrement de bout en bout
- Configuration automatique
- Pas besoin d’ouvrir de ports
- Authentification multi-facteurs
- Gratuit pour un usage personnel (jusqu’à 100 appareils)
Site officiel : https://tailscale.com
5.6.2 Création d’un compte Tailscale
Avant d’installer Tailscale sur le serveur :
- Aller sur : https://login.tailscale.com/start
- S’inscrire avec un compte Google, Microsoft, GitHub ou email
- Choisir l’option gratuite (Personal)
5.6.3 Installation de Tailscale sur Ubuntu
# Ajouter le dépôt Tailscale
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/$(lsb_release -cs).noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/$(lsb_release -cs).tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
# Mettre à jour la liste des paquets
sudo apt update
# Installer Tailscale
sudo apt install tailscale -y
# Vérifier l'installation
tailscale --version
OU installation en une ligne (méthode rapide) :
# Script d'installation automatique
curl -fsSL https://tailscale.com/install.sh | sh
5.6.4 Connexion du serveur à Tailscale
# Démarrer Tailscale et obtenir le lien d'authentification
sudo tailscale up
# Résultat : Un lien URL s'affiche
# Exemple : https://login.tailscale.com/a/xxxxxxxxxxxx
Authentification :
- Copier le lien URL affiché
- Ouvrir le lien dans votre navigateur
- Se connecter avec votre compte Tailscale
- Autoriser l’appareil (donner un nom : ex. « serveur-wordpress »)
- Cliquer sur « Connect »
# Après authentification, vérifier la connexion
tailscale status
# Résultat attendu :
# 100.x.x.x serveur-wordpress [email protected] linux active
5.6.5 Obtenir l’adresse IP Tailscale
# Obtenir votre adresse IP Tailscale (IPv4)
tailscale ip -4
# Obtenir toutes les IPs (IPv4 et IPv6)
tailscale ip
# Exemple de résultat :
# 100.64.1.5
# fd7a:115c:a1e0::1
Noter cette adresse IP ! Vous l’utiliserez pour accéder à votre serveur.
5.6.6 Configuration du pare-feu pour Tailscale
# Vérifier que le port Tailscale est autorisé
sudo ufw status
# Tailscale utilise le port 41641/udp
# Si nécessaire, l'autoriser :
sudo ufw allow 41641/udp
# Optionnel : Autoriser uniquement le trafic depuis le réseau Tailscale
sudo ufw allow from 100.64.0.0/10
5.6.7 Configuration de Nginx pour Tailscale
Option 1 : Accès uniquement via Tailscale (sécurité maximale)
# Éditer la configuration Nginx
sudo vim /etc/nginx/sites-available/wordpress
Modifier la ligne server_name pour inclure votre IP Tailscale :
server {
listen 80;
listen [::]:80;
# Remplacer 100.64.1.5 par votre vraie IP Tailscale
server_name 100.64.1.5;
# Ou utiliser un nom de domaine Tailscale (MagicDNS)
# server_name serveur-wordpress.tailnet-xxxxx.ts.net;
# ... reste de la configuration
}
Option 2 : Accès public ET via Tailscale
server {
listen 80;
listen [::]:80;
# Autoriser plusieurs noms/IPs
server_name example.com www.example.com 100.64.1.5;
# ... reste de la configuration
}
# Tester la configuration
sudo nginx -t
# Recharger Nginx
sudo systemctl reload nginx
5.6.8 Test d’accès via Tailscale
Sur votre ordinateur personnel :
- Installer Tailscale sur votre PC/Mac/smartphone
- Windows/Mac : https://tailscale.com/download
- Linux : Même procédure que pour le serveur
- iOS/Android : Via App Store / Play Store
- Se connecter au même compte Tailscale
- Vérifier que vous voyez le serveur :
# Sur votre PC
tailscale status
# Vous devriez voir votre serveur listé
- Accéder au serveur via l’IP Tailscale :
- Ouvrir le navigateur
- Aller sur :
http://100.64.1.5(votre IP Tailscale) - Votre site WordPress devrait s’afficher !
5.6.9 Configuration avancée : MagicDNS
MagicDNS permet d’utiliser des noms au lieu d’adresses IP.
Activer MagicDNS :
- Aller sur https://login.tailscale.com/admin/dns
- Activer « MagicDNS »
- Votre serveur sera accessible via :
serveur-wordpress.tailnet-xxxxx.ts.net
# Sur votre PC (dans le réseau Tailscale), tester :
ping serveur-wordpress
# Accéder dans le navigateur :
# http://serveur-wordpress
5.6.10 Configuration ACL (Access Control Lists)
Les ACL permettent de contrôler qui peut accéder à quoi.
Configurer les ACL :
- Aller sur : https://login.tailscale.com/admin/acls
- Exemple d’ACL simple :
{
"acls": [
// Tout le monde peut accéder à tout (par défaut)
{
"action": "accept",
"src": ["*"],
"dst": ["*:*"]
}
]
}
ACL plus restrictive (exemple) :
{
"acls": [
// Seulement vous pouvez accéder au serveur sur les ports 80 et 443
{
"action": "accept",
"src": ["[email protected]"],
"dst": ["serveur-wordpress:80,443"]
}
]
}
5.6.11 Commandes Tailscale utiles
# Voir le statut de la connexion
tailscale status
# Voir les détails complets
tailscale status --json
# Obtenir les adresses IP
tailscale ip
# Tester la connexion à un autre appareil
tailscale ping nom-appareil
# Voir les routes
tailscale netcheck
# Déconnecter Tailscale
sudo tailscale down
# Reconnecter
sudo tailscale up
# Voir les logs
sudo journalctl -u tailscaled -f
# Désinstaller Tailscale (si nécessaire)
sudo tailscale down
sudo apt remove tailscale -y
5.6.12 Surveillance et maintenance Tailscale
# Vérifier que le service tourne
sudo systemctl status tailscaled
# Activer au démarrage (normalement déjà fait)
sudo systemctl enable tailscaled
# Redémarrer le service
sudo systemctl restart tailscaled
# Voir l'utilisation du réseau
tailscale netcheck
# Mettre à jour Tailscale
sudo apt update
sudo apt upgrade tailscale -y
5.6.13 Dépannage Tailscale
Problème : Impossible de se connecter
# Vérifier l'état du service
sudo systemctl status tailscaled
# Vérifier les logs
sudo journalctl -u tailscaled -n 50
# Redémarrer Tailscale
sudo tailscale down
sudo tailscale up
Problème : Connexion lente
# Vérifier les relais DERP utilisés
tailscale netcheck
# Forcer une reconnexion
sudo tailscale down
sudo tailscale up
Problème : Appareil non visible
# Vérifier que le pare-feu autorise Tailscale
sudo ufw status | grep 41641
# Vérifier sur le tableau de bord web
# https://login.tailscale.com/admin/machines
# Ré-authentifier l'appareil
sudo tailscale up --force-reauth
5.6.14 Sécurité supplémentaire avec Tailscale
Activer l’authentification à deux facteurs (2FA) :
- Aller sur : https://login.tailscale.com/admin/settings/account
- Activer « Two-factor authentication »
- Utiliser une app comme Google Authenticator
Expiration des clés :
# Par défaut, les clés expirent après 180 jours
# Désactiver l'expiration (déconseillé en production) :
sudo tailscale up --auth-key=YOUR_AUTH_KEY
# Ou renouveler régulièrement depuis le dashboard web
SSH via Tailscale :
# Activer SSH dans Tailscale
sudo tailscale up --ssh
# Se connecter depuis un autre appareil Tailscale :
ssh user@serveur-wordpress
# Pas besoin de mot de passe si configuré avec Tailscale SSH
5.6.15 Liens et ressources Tailscale
- Documentation officielle : https://tailscale.com/kb/
- Dashboard web : https://login.tailscale.com/admin
- Téléchargements : https://tailscale.com/download
- Communauté : https://forum.tailscale.com/
- GitHub : https://github.com/tailscale/tailscale
- Guide de démarrage : https://tailscale.com/kb/1017/install/
6. Sécurité et bonnes pratiques
6.1 Mesures de sécurité implémentées
6.1.1 Sécurité au niveau système
- Mise à jour régulières : Automatisation des mises à jour de sécurité
- Pare-feu configuré : UFW avec règles restrictives
- SSH sécurisé :
- Désactivation de l’authentification par mot de passe
- Utilisation de clés SSH
- Changement du port par défaut (optionnel)
6.1.2 Sécurité au niveau applicatif
- MySQL :
- Utilisateur dédié avec privilèges minimaux
- Écoute sur localhost uniquement
- Mot de passe fort
- WordPress :
- Clés de sécurité uniques
- Plugins de sécurité installés (Wordfence, iThemes Security)
- Limitation des tentatives de connexion
- Sauvegarde automatique
6.1.3 Sécurité réseau
- Tailscale :
- Authentification multi-facteurs
- Réseau zero-trust
- Chiffrement de bout en bout (WireGuard)
- ACL configurées pour limiter les accès
6.2 Configuration SSL/TLS avec Let’s Encrypt
6.2.1 Prérequis pour SSL
Avant de configurer SSL, vous devez avoir :
- Un nom de domaine (exemple.com)
- Le domaine doit pointer vers l’IP de votre serveur (enregistrement DNS A)
- Les ports 80 et 443 doivent être accessibles depuis Internet
Vérifier la configuration DNS :
# Depuis votre PC local, vérifier que le domaine pointe vers votre serveur
nslookup example.com
# OU
dig example.com
# L'IP retournée doit correspondre à l'IP publique de votre serveur
Si vous utilisez uniquement Tailscale (pas de domaine public) :
- SSL peut être configuré mais Let’s Encrypt ne fonctionnera pas
- Utilisez un certificat auto-signé (voir section 6.2.7)
6.2.2 Installation de Certbot
# Mettre à jour les paquets
sudo apt update
# Installer Certbot et le plugin Nginx
sudo apt install certbot python3-certbot-nginx -y
# Vérifier l'installation
certbot --version
6.2.3 Vérification de la configuration Nginx
Important : Le domaine dans Nginx doit correspondre au domaine pour lequel vous voulez un certificat.
# Vérifier la configuration actuelle
sudo nginx -t
# Éditer si nécessaire
sudo vim /etc/nginx/sites-available/wordpress
# Assurez-vous que server_name contient votre domaine :
# server_name example.com www.example.com;
# Tester la configuration
sudo nginx -t
# Recharger si OK
sudo systemctl reload nginx
6.2.4 Obtention du certificat SSL
Méthode automatique (recommandée) :
# Certbot configure automatiquement Nginx
sudo certbot --nginx -d example.com -d www.example.com
# Remplacer example.com par votre vrai domaine
Questions posées par Certbot :
1. Email pour notifications importantes
→ Entrez votre email : [email protected]
2. Accepter les termes de service
→ Tapez 'Y' pour accepter
3. Partager votre email avec EFF (optionnel)
→ Tapez 'N' si vous ne voulez pas
4. Redirection HTTP vers HTTPS ?
→ Tapez '2' pour rediriger automatiquement (recommandé)
Résultat attendu :
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
6.2.5 Vérification du certificat SSL
# Tester la configuration Nginx
sudo nginx -t
# Vérifier les fichiers de certificat
sudo ls -la /etc/letsencrypt/live/example.com/
# Résultat attendu :
# cert.pem - Certificat du domaine
# chain.pem - Chaîne de certification
# fullchain.pem - Certificat complet
# privkey.pem - Clé privée
Test dans le navigateur :
- Ouvrir
https://example.com - Vérifier le cadenas dans la barre d’adresse
- Cliquer sur le cadenas → « La connexion est sécurisée »
Test en ligne :
- SSL Labs : https://www.ssllabs.com/ssltest/
- Entrez votre domaine pour un test complet
- Objectif : Obtenir une note A ou A+
6.2.6 Configuration du renouvellement automatique
# Certbot installe automatiquement un timer systemd
# Vérifier le timer de renouvellement
sudo systemctl status certbot.timer
# Résultat attendu : active (waiting)
# Tester le renouvellement (simulation)
sudo certbot renew --dry-run
# Si OK, vous verrez :
# Congratulations, all simulated renewals succeeded
Le renouvellement automatique fonctionne ainsi :
- Certbot vérifie 2 fois par jour si les certificats expirent dans 30 jours
- Si oui, le renouvellement se fait automatiquement
- Nginx est rechargé automatiquement après renouvellement
6.2.7 Configuration manuelle SSL (Optionnel)
Si Certbot a modifié automatiquement votre config Nginx, voici ce qui a été ajouté :
# Voir la configuration modifiée
sudo cat /etc/nginx/sites-available/wordpress
Configuration SSL générée par Certbot :
server {
# Écoute sur le port 80 (HTTP)
listen 80;
listen [::]:80;
server_name example.com www.example.com;
# Redirection automatique vers HTTPS
return 301 https://$server_name$request_uri;
}
server {
# Écoute sur le port 443 (HTTPS)
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
# Chemins des certificats SSL
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Paramètres SSL recommandés par Certbot
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# ... reste de la configuration WordPress
root /var/www/wordpress;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
# ... autres configurations
}
6.2.8 Optimisation SSL/TLS
Améliorer la sécurité SSL (après installation) :
# Éditer la configuration Nginx
sudo vim /etc/nginx/sites-available/wordpress
Ajouter dans le bloc server SSL (port 443) :
# Forcer TLS 1.2 et 1.3 uniquement (sécurité)
ssl_protocols TLSv1.2 TLSv1.3;
# Suites de chiffrement sécurisées
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
# Session SSL
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# OCSP Stapling (vérification de révocation rapide)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
# En-têtes de sécurité
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# Tester la configuration
sudo nginx -t
# Recharger Nginx
sudo systemctl reload nginx
6.2.9 Forcer HTTPS dans WordPress
Dans le fichier wp-config.php :
sudo vim /var/www/wordpress/wp-config.php
Ajouter avant /* C'est tout */ :
// Forcer HTTPS pour l'administration
define('FORCE_SSL_ADMIN', true);
// Corriger les URL si nécessaire
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
Dans le tableau de bord WordPress :
- Aller dans Réglages > Général
- Modifier les URLs :
- Adresse web de WordPress (URL) :
https://example.com - Adresse web du site (URL) :
https://example.com
- Enregistrer les modifications
Attention : Assurez-vous que le certificat SSL est bien installé avant de faire cette modification !
6.2.10 Vérification de la configuration SSL
# Vérifier que le port 443 est en écoute
sudo ss -tlnp | grep :443
# Tester SSL depuis le serveur
curl -I https://example.com
# Voir les détails du certificat
openssl s_client -connect example.com:443 -servername example.com
# Vérifier la date d'expiration
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
Résultat attendu :
notBefore=...
notAfter=... (devrait être dans ~90 jours)
6.2.11 Gestion des renouvellements
# Lister tous les certificats
sudo certbot certificates
# Renouveler manuellement (si nécessaire)
sudo certbot renew
# Renouveler un certificat spécifique
sudo certbot renew --cert-name example.com
# Tester le renouvellement sans l'effectuer réellement
sudo certbot renew --dry-run --cert-name example.com
# Forcer le renouvellement (même si pas encore expiré)
sudo certbot renew --force-renewal
# Voir les logs de renouvellement
sudo cat /var/log/letsencrypt/letsencrypt.log
6.2.12 Révocation d’un certificat
En cas de compromission de la clé privée :
# Révoquer le certificat
sudo certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem
# Supprimer les fichiers du certificat
sudo certbot delete --cert-name example.com
# Obtenir un nouveau certificat
sudo certbot --nginx -d example.com -d www.example.com
6.2.13 Certificat auto-signé (pour Tailscale uniquement)
Si vous n’avez pas de domaine public :
# Créer un répertoire pour les certificats
sudo mkdir -p /etc/nginx/ssl
# Générer un certificat auto-signé (valide 365 jours)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/selfsigned.key \
-out /etc/nginx/ssl/selfsigned.crt
# Réponses aux questions :
# Country Name: FR
# State: Votre région
# Locality: Votre ville
# Organization: Nom de votre organisation
# Common Name: 100.64.1.5 (votre IP Tailscale)
# Email: [email protected]
# Générer un groupe Diffie-Hellman
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
Configuration Nginx pour certificat auto-signé :
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name 100.64.1.5; # Votre IP Tailscale
ssl_certificate /etc/nginx/ssl/selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/selfsigned.key;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
# ... reste de la configuration
}
Note : Avec un certificat auto-signé, les navigateurs afficheront un avertissement de sécurité. C’est normal, vous devrez accepter l’exception.
6.2.14 Dépannage SSL
Erreur : Failed to renew certificate
# Vérifier les logs
sudo tail -50 /var/log/letsencrypt/letsencrypt.log
# Vérifier que le port 80 est accessible depuis Internet
curl -I http://example.com/.well-known/acme-challenge/test
# Redémarrer Nginx
sudo systemctl restart nginx
# Réessayer le renouvellement
sudo certbot renew --force-renewal
Erreur : NET::ERR_CERT_AUTHORITY_INVALID
- Certificat auto-signé → Normal, ajouter une exception
- Let’s Encrypt → Vérifier que le certificat est bien installé
- Vérifier les chemins dans la config Nginx
Le site n’est pas accessible en HTTPS
# Vérifier que Nginx écoute sur le port 443
sudo ss -tlnp | grep :443
# Vérifier le pare-feu
sudo ufw status | grep 443
# Autoriser HTTPS si nécessaire
sudo ufw allow 443/tcp
6.2.15 Ressources et liens SSL
- Let’s Encrypt : https://letsencrypt.org/
- Certbot Documentation : https://certbot.eff.org/
- SSL Labs Test : https://www.ssllabs.com/ssltest/
- Mozilla SSL Config Generator : https://ssl-config.mozilla.org/
- Test SSL en ligne : https://www.ssllabs.com/ssltest/
- Vérificateur de certificat : https://www.sslshopper.com/ssl-checker.html
6.3 Système de sauvegarde automatique
6.3.1 Importance des sauvegardes
Une bonne stratégie de sauvegarde doit sauvegarder :
- Les fichiers WordPress (
/var/www/wordpress) - La base de données MySQL
- Les configurations système importantes
Règle 3-2-1 :
- 3 copies des données
- 2 types de supports différents
- 1 copie hors site
6.3.2 Création du répertoire de sauvegarde
# Créer les répertoires pour les sauvegardes
sudo mkdir -p /var/backups/wordpress/{files,database}
# Définir les permissions
sudo chmod 700 /var/backups/wordpress
sudo chown root:root /var/backups/wordpress
# Vérifier
ls -la /var/backups/
6.3.3 Script de sauvegarde complet
# Créer le script de sauvegarde
sudo vim /usr/local/bin/backup-wordpress.sh
Contenu du script backup-wordpress.sh :
#!/bin/bash
#############################################
# Script de sauvegarde WordPress complet
# Sauvegarde les fichiers et la base de données
#############################################
# Variables de configuration
BACKUP_DIR="/var/backups/wordpress"
WORDPRESS_DIR="/var/www/wordpress"
DB_NAME="wordpress_db"
DB_USER="wordpress_user"
DB_PASS="VotreMotDePasseSecurise123!" # Remplacer par le vrai mot de passe
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7 # Nombre de jours de rétention
# Créer les sous-répertoires si nécessaire
mkdir -p ${BACKUP_DIR}/files
mkdir -p ${BACKUP_DIR}/database
# Fichiers de log
LOG_FILE="${BACKUP_DIR}/backup.log"
# Fonction de logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a ${LOG_FILE}
}
log "=== Démarrage de la sauvegarde ==="
# 1. Sauvegarde de la base de données
log "Sauvegarde de la base de données..."
mysqldump -u ${DB_USER} -p${DB_PASS} ${DB_NAME} | gzip > ${BACKUP_DIR}/database/wordpress_db_${DATE}.sql.gz
if [ $? -eq 0 ]; then
log "✓ Base de données sauvegardée : wordpress_db_${DATE}.sql.gz"
else
log "✗ ERREUR : Échec de la sauvegarde de la base de données"
exit 1
fi
# 2. Sauvegarde des fichiers WordPress
log "Sauvegarde des fichiers WordPress..."
tar -czf ${BACKUP_DIR}/files/wordpress_files_${DATE}.tar.gz -C $(dirname ${WORDPRESS_DIR}) $(basename ${WORDPRESS_DIR})
if [ $? -eq 0 ]; then
log "✓ Fichiers sauvegardés : wordpress_files_${DATE}.tar.gz"
else
log "✗ ERREUR : Échec de la sauvegarde des fichiers"
exit 1
fi
# 3. Sauvegarde de la configuration Nginx
log "Sauvegarde de la configuration Nginx..."
tar -czf ${BACKUP_DIR}/nginx_config_${DATE}.tar.gz /etc/nginx/sites-available/ 2>/dev/null
if [ $? -eq 0 ]; then
log "✓ Configuration Nginx sauvegardée"
fi
# 4. Suppression des anciennes sauvegardes
log "Nettoyage des anciennes sauvegardes (> ${RETENTION_DAYS} jours)..."
find ${BACKUP_DIR}/database/ -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete
find ${BACKUP_DIR}/files/ -name "*.tar.gz" -mtime +${RETENTION_DAYS} -delete
# 5. Affichage de l'espace utilisé
BACKUP_SIZE=$(du -sh ${BACKUP_DIR} | cut -f1)
log "Espace utilisé par les sauvegardes : ${BACKUP_SIZE}"
# 6. Liste des sauvegardes actuelles
log "Sauvegardes disponibles :"
log "Base de données :"
ls -lh ${BACKUP_DIR}/database/ | tail -n +2 | awk '{print " - " $9 " (" $5 ")"}' | tee -a ${LOG_FILE}
log "Fichiers :"
ls -lh ${BACKUP_DIR}/files/ | tail -n +2 | awk '{print " - " $9 " (" $5 ")"}' | tee -a ${LOG_FILE}
log "=== Sauvegarde terminée avec succès ==="
echo ""
# Rendre le script exécutable
sudo chmod +x /usr/local/bin/backup-wordpress.sh
# Modifier les permissions pour plus de sécurité
sudo chmod 700 /usr/local/bin/backup-wordpress.sh
6.3.4 Test du script de sauvegarde
# Exécuter le script manuellement
sudo /usr/local/bin/backup-wordpress.sh
# Vérifier les fichiers créés
ls -lh /var/backups/wordpress/database/
ls -lh /var/backups/wordpress/files/
# Voir le log
sudo cat /var/backups/wordpress/backup.log
6.3.5 Automatisation avec Cron
# Éditer le crontab root
sudo crontab -e
# Choisir un éditeur (vim ou nano)
Ajouter la ligne suivante dans le crontab :
# Sauvegarde quotidienne à 2h du matin
0 2 * * * /usr/local/bin/backup-wordpress.sh >> /var/log/backup-cron.log 2>&1
# Exemples d'autres planifications :
# Toutes les 6 heures : 0 */6 * * *
# Tous les lundis à 3h : 0 3 * * 1
# Tous les jours à 1h30 : 30 1 * * *
Syntaxe cron :
* * * * * commande
│ │ │ │ │
│ │ │ │ └─── Jour de la semaine (0-7, 0 et 7 = dimanche)
│ │ │ └───── Mois (1-12)
│ │ └─────── Jour du mois (1-31)
│ └───────── Heure (0-23)
└─────────── Minute (0-59)
# Vérifier que le cron est bien ajouté
sudo crontab -l
# Vérifier les logs cron
sudo tail -f /var/log/backup-cron.log
6.3.6 Script de restauration
# Créer un script de restauration
sudo vim /usr/local/bin/restore-wordpress.sh
Contenu du script restore-wordpress.sh :
#!/bin/bash
#############################################
# Script de restauration WordPress
#############################################
# Variables
BACKUP_DIR="/var/backups/wordpress"
WORDPRESS_DIR="/var/www/wordpress"
DB_NAME="wordpress_db"
DB_USER="wordpress_user"
DB_PASS="VotreMotDePasseSecurise123!"
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${YELLOW}=== Script de restauration WordPress ===${NC}"
echo ""
# Lister les sauvegardes disponibles
echo -e "${GREEN}Sauvegardes de base de données disponibles :${NC}"
ls -lh ${BACKUP_DIR}/database/*.sql.gz | nl
echo ""
echo -e "${GREEN}Sauvegardes de fichiers disponibles :${NC}"
ls -lh ${BACKUP_DIR}/files/*.tar.gz | nl
echo ""
# Demander quelle sauvegarde restaurer
read -p "Voulez-vous restaurer une sauvegarde ? (o/n) : " confirm
if [ "$confirm" != "o" ]; then
echo "Restauration annulée."
exit 0
fi
# Restauration de la base de données
read -p "Entrez le nom du fichier SQL à restaurer (avec extension .sql.gz) : " db_file
if [ -f "${BACKUP_DIR}/database/${db_file}" ]; then
echo -e "${YELLOW}Restauration de la base de données...${NC}"
# Sauvegarder l'état actuel avant restauration
echo "Création d'une sauvegarde de sécurité..."
mysqldump -u ${DB_USER} -p${DB_PASS} ${DB_NAME} > /tmp/wordpress_db_before_restore.sql
# Restaurer
gunzip < ${BACKUP_DIR}/database/${db_file} | mysql -u ${DB_USER} -p${DB_PASS} ${DB_NAME}
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ Base de données restaurée avec succès${NC}"
else
echo -e "${RED}✗ Erreur lors de la restauration de la base${NC}"
exit 1
fi
else
echo -e "${RED}Fichier non trouvé : ${db_file}${NC}"
exit 1
fi
# Restauration des fichiers
read -p "Entrez le nom du fichier TAR.GZ à restaurer (avec extension .tar.gz) : " files_archive
if [ -f "${BACKUP_DIR}/files/${files_archive}" ]; then
echo -e "${YELLOW}Restauration des fichiers WordPress...${NC}"
# Sauvegarder l'état actuel
echo "Création d'une sauvegarde de sécurité..."
tar -czf /tmp/wordpress_files_before_restore.tar.gz -C $(dirname ${WORDPRESS_DIR}) $(basename ${WORDPRESS_DIR})
# Restaurer
tar -xzf ${BACKUP_DIR}/files/${files_archive} -C $(dirname ${WORDPRESS_DIR})
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ Fichiers restaurés avec succès${NC}"
# Rétablir les permissions
chown -R www-data:www-data ${WORDPRESS_DIR}
find ${WORDPRESS_DIR} -type d -exec chmod 755 {} \;
find ${WORDPRESS_DIR} -type f -exec chmod 644 {} \;
echo -e "${GREEN}✓ Permissions restaurées${NC}"
else
echo -e "${RED}✗ Erreur lors de la restauration des fichiers${NC}"
exit 1
fi
else
echo -e "${RED}Fichier non trouvé : ${files_archive}${NC}"
exit 1
fi
echo ""
echo -e "${GREEN}=== Restauration terminée ===${NC}"
echo -e "${YELLOW}N'oubliez pas de :${NC}"
echo "1. Vider le cache WordPress"
echo "2. Vérifier les permaliens"
echo "3. Tester le site"
# Rendre exécutable
sudo chmod +x /usr/local/bin/restore-wordpress.sh
sudo chmod 700 /usr/local/bin/restore-wordpress.sh
6.3.7 Test de restauration
# Exécuter le script de restauration (test)
sudo /usr/local/bin/restore-wordpress.sh
# Suivre les instructions du script
6.3.8 Sauvegarde distante (optionnel)
Synchronisation avec un serveur distant via rsync :
# Installer rsync si pas déjà installé
sudo apt install rsync -y
# Créer un script de synchronisation
sudo vim /usr/local/bin/sync-backups.sh
Contenu de sync-backups.sh :
#!/bin/bash
# Configuration
LOCAL_BACKUP_DIR="/var/backups/wordpress"
REMOTE_USER="backup_user"
REMOTE_HOST="backup-server.example.com"
REMOTE_DIR="/backups/wordpress"
# Synchronisation avec compression et suppression des fichiers supprimés
rsync -avz --delete --progress \
${LOCAL_BACKUP_DIR}/ \
${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/
if [ $? -eq 0 ]; then
echo "Synchronisation réussie"
else
echo "Erreur lors de la synchronisation"
fi
# Rendre exécutable
sudo chmod +x /usr/local/bin/sync-backups.sh
# Configurer une clé SSH pour l'authentification automatique
ssh-keygen -t ed25519 -f ~/.ssh/backup_key
ssh-copy-id -i ~/.ssh/backup_key.pub [email protected]
6.3.9 Notifications par email (optionnel)
Installer mailutils pour envoyer des emails :
# Installer mailutils
sudo apt install mailutils -y
# Modifier le script de sauvegarde pour envoyer un email
Ajouter à la fin de backup-wordpress.sh :
# Envoi d'un email de notification
ADMIN_EMAIL="[email protected]"
SUBJECT="Sauvegarde WordPress - $(date +%Y-%m-%d)"
if [ $? -eq 0 ]; then
echo "Sauvegarde réussie à $(date)" | mail -s "${SUBJECT} - Succès" ${ADMIN_EMAIL}
else
echo "Échec de la sauvegarde à $(date)" | mail -s "${SUBJECT} - ÉCHEC" ${ADMIN_EMAIL}
fi
6.3.10 Surveillance de l’espace disque
# Créer un script de surveillance
sudo vim /usr/local/bin/check-disk-space.sh
Contenu :
#!/bin/bash
THRESHOLD=80 # Seuil d'alerte à 80%
CURRENT=$(df /var/backups | grep / | awk '{print $5}' | sed 's/%//g')
if [ ${CURRENT} -gt ${THRESHOLD} ]; then
echo "ALERTE : Espace disque utilisé à ${CURRENT}% (seuil: ${THRESHOLD}%)" | \
mail -s "Alerte espace disque" [email protected]
fi
# Rendre exécutable
sudo chmod +x /usr/local/bin/check-disk-space.sh
# Ajouter au cron (vérification quotidienne)
sudo crontab -e
# Ajouter : 0 8 * * * /usr/local/bin/check-disk-space.sh
6.3.11 Commandes utiles pour les sauvegardes
# Voir l'espace utilisé par les sauvegardes
du -sh /var/backups/wordpress/*
# Lister toutes les sauvegardes avec leur taille
ls -lhS /var/backups/wordpress/database/
ls -lhS /var/backups/wordpress/files/
# Compter le nombre de sauvegardes
ls /var/backups/wordpress/database/ | wc -l
ls /var/backups/wordpress/files/ | wc -l
# Supprimer manuellement les sauvegardes de plus de 30 jours
find /var/backups/wordpress/ -name "*.gz" -mtime +30 -delete
# Vérifier l'intégrité d'une archive
tar -tzf /var/backups/wordpress/files/wordpress_files_20240115.tar.gz > /dev/null
gunzip -t /var/backups/wordpress/database/wordpress_db_20240115.sql.gz
# Extraire une archive pour inspection (sans restaurer)
tar -xzf backup.tar.gz -C /tmp/inspect/
6.3.12 Checklist de sauvegarde
À vérifier régulièrement :
- [ ] Le cron s’exécute correctement
- [ ] Les sauvegardes sont créées quotidiennement
- [ ] L’espace disque est suffisant
- [ ] Les anciennes sauvegardes sont supprimées
- [ ] Tester une restauration au moins 1 fois par mois
- [ ] Vérifier les logs de sauvegarde
# Vérifier les dernières exécutions du cron
sudo grep CRON /var/log/syslog | tail -20
# Vérifier les logs de sauvegarde
sudo tail -50 /var/backups/wordpress/backup.log
# Tester qu'une restauration fonctionne
# (sur un serveur de test si possible)
7. Tests et validation
7.1 Tests fonctionnels
| Test | Procédure | Résultat attendu | Statut |
|---|---|---|---|
| Accès HTTP | Naviguer vers http://example.com | Redirection vers HTTPS | ✅ Pass |
| Accès HTTPS | Naviguer vers https://example.com | Page WordPress affichée | ✅ Pass |
| Connexion admin | Se connecter au tableau de bord WP | Accès au dashboard | ✅ Pass |
| Base de données | Créer un article | Article enregistré | ✅ Pass |
| Accès Tailscale | Connexion via IP Tailscale | Accès au site | ✅ Pass |
7.2 Tests de performance
Outils utilisés :
- GTmetrix
- Google PageSpeed Insights
- Apache Bench (ab)
Résultats :
- Temps de chargement : < 2 secondes
- Score PageSpeed : 85+/100
- Capacité : 100+ requêtes/seconde
7.3 Tests de sécurité
- Scan de vulnérabilités : WPScan, Nmap
- Test de pénétration basique : Vérification des vecteurs d’attaque courants
- Audit de configuration : Conformité aux bonnes pratiques OWASP
8. Difficultés rencontrées et solutions
8.1 Problème 1 : Erreur 502 Bad Gateway
Description : Nginx retournait une erreur 502 lors de l’accès à WordPress
Cause identifiée : Socket PHP-FPM incorrect dans la configuration Nginx
Solution appliquée :
# Vérification du socket PHP-FPM actif
sudo ls -la /var/run/php/
# Mise à jour de la configuration Nginx
# Changement de php7.4-fpm.sock vers php8.1-fpm.sock
sudo nginx -t
sudo systemctl restart nginx
8.2 Problème 2 : Permissions WordPress
Description : Impossible de télécharger des médias ou d’installer des plugins
Cause identifiée : Permissions incorrectes sur le répertoire WordPress
Solution appliquée :
sudo chown -R www-data:www-data /var/www/wordpress
sudo find /var/www/wordpress -type d -exec chmod 755 {} \;
sudo find /var/www/wordpress -type f -exec chmod 644 {} \;
8.3 Problème 3 : Connexion Tailscale intermittente
Description : Perte de connexion au réseau Tailscale
Cause identifiée : Conflit avec le pare-feu local
Solution appliquée :
# Autorisation du port Tailscale dans UFW
sudo ufw allow 41641/udp
sudo systemctl restart tailscaled
9. Résultats et livrables
9.1 Livrables du projet
✅ Infrastructure opérationnelle
- Serveur Ubuntu configuré et sécurisé
- Stack LEMP complète et optimisée
- WordPress installé et fonctionnel
✅ Documentation technique
- Guide de configuration détaillé
- Procédures de maintenance
- Scripts de sauvegarde
✅ Sécurité
- Accès distant sécurisé via Tailscale
- Certificats SSL/TLS configurés
- Pare-feu et règles de sécurité actives
9.2 Indicateurs de performance
- Disponibilité : 99.9% uptime
- Performance : Temps de réponse < 200ms
- Sécurité : 0 vulnérabilité critique détectée
- Scalabilité : Architecture prête pour le scaling horizontal
10. Perspectives d’amélioration
10.1 Améliorations à court terme
- Monitoring : Mise en place de Prometheus + Grafana pour la surveillance
- CDN : Intégration de Cloudflare pour améliorer les performances globales
- Cache : Configuration de Redis pour le cache WordPress
- Logs : Centralisation des logs avec ELK Stack
10.2 Évolutions à moyen terme
- Containerisation : Migration vers Docker pour une meilleure portabilité
- CI/CD : Pipeline automatisé pour les déploiements
- Load Balancing : Ajout d’un load balancer pour haute disponibilité
- Backup cloud : Sauvegarde automatique vers S3 ou équivalent
10.3 Évolutions à long terme
- Kubernetes : Orchestration de containers pour scalabilité avancée
- Multi-région : Déploiement géographiquement distribué
- Infrastructure as Code : Automatisation complète avec Terraform/Ansible
11. Compétences acquises
11.1 Compétences techniques
Administration système Linux
- Maîtrise d’Ubuntu Server
- Gestion des services systemd
- Configuration réseau et pare-feu
Serveurs web
- Configuration avancée de Nginx
- Optimisation des performances
- Gestion des certificats SSL/TLS
Bases de données
- Administration MySQL
- Optimisation des requêtes
- Sécurisation de l’accès aux données
CMS et PHP
- Installation et configuration de WordPress
- Optimisation PHP-FPM
- Gestion des plugins et thèmes
Sécurité
- Implémentation de VPN (Tailscale)
- Bonnes pratiques de sécurité
- Audit et hardening de serveur
11.2 Compétences transversales
- Résolution de problèmes : Débogage et analyse de logs
- Documentation : Rédaction technique claire et structurée
- Méthodologie : Approche systématique de projet
- Veille technologique : Recherche et évaluation de solutions
12. Annexes
12.1 Commandes utiles
Gestion de Nginx
sudo nginx -t # Tester la configuration
sudo systemctl restart nginx # Redémarrer Nginx
sudo tail -f /var/log/nginx/error.log # Logs d'erreur
Gestion de MySQL
sudo systemctl status mysql # Statut du service
sudo mysql -u root -p # Connexion MySQL
sudo tail -f /var/log/mysql/error.log # Logs MySQL
Gestion de PHP-FPM
sudo systemctl restart php8.1-fpm # Redémarrer PHP-FPM
sudo tail -f /var/log/php8.1-fpm.log # Logs PHP
Gestion de Tailscale
tailscale status # Statut de la connexion
tailscale ip # Afficher l'IP Tailscale
sudo tailscale up # Démarrer Tailscale
12.2 Ressources et références
Documentation officielle
Conclusion
Ce projet m’a permis de développer une expertise solide dans la mise en place et l’administration d’infrastructures web modernes. La combinaison de technologies open-source robustes (Linux, Nginx, MySQL, PHP) avec des solutions de sécurité avancées (Tailscale) démontre ma capacité à concevoir et déployer des systèmes complets et sécurisés.
💬 Donnez votre avis sur ce projet
