Nginx en mode proxy inverse
Le principe de fonctionnement de Nginx en mode proxy inverse (reverse proxy) consiste à placer Nginx devant un ou plusieurs serveurs backend (comme des serveurs d'application, bases de données, ou autres services) pour gérer et distribuer les requêtes entrantes.
+------------------+
| Utilisateurs |
| (Clients) |
+---------+--------+
|
v
+------------------+
| CDN |
+---------+--------+
|
v
+------------------+
| Nginx |
| Proxy Inverse |
+---------+--------+
|
+------------------+-----// ------------+-------------------------------+
| | |
v v v
+-------------------+ +-------------------+ +-------------------+
| Apache | | Serveur Backend 2 | | Serveur Backend 3 |
+-------------------+ +-------------------+ +-------------------+
| | |
v v v
+------------------+ +------------------+ +------------------+
| Master DB | | Slave DB 1 | | Slave DB 2 |
+------------------+ +------------------+ +------------------+
- Réception des Requêtes Clients : Il reçoit les requêtes HTTP ou HTTPS des clients (navigateurs web, applications mobiles, etc.).
- Distribution des Requêtes : Agit comme un intermédiaire entre les clients et les serveurs backend, redirigeant les requêtes vers le serveur approprié en fonction de règles de configuration définies (comme l'équilibrage de charge, les règles de routage, etc.).
- Équilibrage de Charge : Distribu les requêtes entrantes de manière équilibrée entre plusieurs serveurs backend, améliorant ainsi la performance et la disponibilité du service.
- Mise en Cache : Met en cache les réponses des serveurs backend, réduisant ainsi la charge sur ces serveurs et améliorant les temps de réponse pour les clients.
- Sécurité : Implémenter diverses mesures de sécurité, telles que la terminaison SSL/TLS, le filtrage des requêtes, et la protection contre les attaques DDoS.
- Réécriture et Redirection d'URL : Réécrire et rediriger les URL des requêtes entrantes pour répondre à des besoins spécifiques, comme les réécritures de SEO ou les migrations d'URL.
- Compression : compresse les réponses des serveurs backend avant de les envoyer aux clients, réduisant ainsi la bande passante utilisée.
A voir ? Shared Content Delivery Network (CDN)
Un Content Delivery Network (CDN) partagé, également connu sous le nom de "Shared CDN", est un réseau de serveurs distribués géographiquement qui travaillent ensemble pour fournir rapidement du contenu Internet aux utilisateurs finaux. Le terme "partagé" fait référence à l'utilisation de l'infrastructure CDN par plusieurs clients, ce qui permet de réduire les coûts et d'optimiser les ressources.
Les serveurs CDN sont répartis dans le monde entier. Cela permet de placer le contenu plus près des utilisateurs finaux, réduisant ainsi la latence et améliorant les temps de chargement.
Le CDN met en cache le contenu statique (images, vidéos, fichiers CSS/JS, etc.) sur ses serveurs périphériques (Edge Servers). Lorsqu'un utilisateur demande ce contenu, il est servi à partir du serveur le plus proche plutôt que du serveur d'origine.
Fournisseur de CDN : Cloudflare, Akamai, Amazon CloudFront, et Fastly
Capacités de Charge
La charge supportée par un serveur web dépend de nombreux facteurs, notamment la configuration spécifique, l'optimisation des performances, le type de contenu servi,la nature des requêtes.
2 vCores et 4 Go de RAM
- Apache : 200 à 300 requêtes par seconde
- Nginx : 1000 à 1500 requêtes par seconde
- Nginx en mode proxy inverse : environ 800 à 1200 requêtes par seconde
8 vCores et 16 Go de RAM
- Apache : 1000 à 1500 requêtes par seconde
- Nginx : 4000 à 5000 requêtes par seconde
- Nginx en mode proxy inverse : environ 3000 à 4000 requêtes par seconde
Fonctionnalités spécifiques à Apache
- .htaccess #configurer des paramètres de serveur web de manière granulaire au niveau du répertoire
- Apache utilise une architecture modulaire chargés dynamiquement , le traitement CGI, la réécriture d'URL
- Apache gère très bien les scripts Perl, Python, et autres langages via CGI.
- De nombreuses applications web et frameworks sont conçus avec une compatibilité spécifique pour Apache.
Comparaison avec Nginx
- .htaccess n'a pas la même flexibilité dans les configurations
- Les modules ne sont pas dynamiques et doivent être compilés dans le noyau Nginx
Installation
# Activer les modules proxy d'Apache sudo a2enmod proxy #nécessaire pour les fonctionnalités de proxy inverse. sudo a2enmod proxy_fcgi #Permet à Apache de communiquer avec les applications backend via le protocole FastCGI. sudo a2enmod proxy_http #Permet à Apache de fonctionner en tant que proxy HTTP. Nécessaire pour rediriger les requêtes HTTP vers des serveurs backend. sudo a2enmod proxy_balancer #configure des stratégies d'équilibrage de charge entre plusieurs serveurs backend sudo a2enmod lbmethod_byrequests #Méthode d'équilibrage de charge qui distribue les requêtes aux serveurs backend en fonction du nombre de requêtes sudo systemctl restart apache2 # Installer Nginx sudo apt install nginx -y sudo systemctl start nginx sudo systemctl enable nginx
Créer et configurer le fichier de configuration Nginx pour le proxy inverse
# Ajouter la configuration suivante dans le fichier (modifier `your_domain.com`)
sudo nano nginx.conf http { client_max_body_size 20M; }
sudo nano /etc/nginx/sites-available/reverse-proxy.conf server { listen 80; server_name your_domain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } # Si vous avez plusieurs serveurs # upstream backend_server { # server backend1.example.com; # server backend2.example.com; # }
Activer le site Nginx et désactiver le site par défautsudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/ sudo unlink /etc/nginx/sites-enabled/default sudo systemctl restart nginx # Configurer Apache pour écouter sur le port 8080 sudo nano /etc/apache2/ports.conf # Changer le port d'écoute Listen 8080 sudo nano /etc/apache2/sites-available/000-default.conf # Changer le VirtualHost pour écouter sur le port 8080 <VirtualHost *:8080> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> # Redémarrer Apache pour appliquer les modifications sudo systemctl restart apache2 # Configurer le pare-feu pour autoriser les ports 80 et 8080 sudo ufw allow 80/tcp sudo ufw allow 8080/tcp sudo ufw status verbose # Vérifier la configuration Nginx sudo nginx -t # Vérifier que les services sont actifs sudo systemctl status nginx sudo systemctl status apache2
base de donnée sur plusieurs serveurs backendGérer une base de données (BDD) dans un environnement avec Nginx en mode proxy inverse et plusieurs serveurs backend nécessite une architecture bien conçue pour assurer la disponibilité, la performance, et la scalabilité. Voici les principales approches pour gérer efficacement une base de données dans un tel environnement :
Architecture Master-Slave (Primary-Replica)
Master (Primary) : Un serveur de base de données principal qui gère les opérations de lecture et d'écriture. Slaves (Replicas) : Un ou plusieurs serveurs de base de données secondaires qui répliquent les données du serveur principal et gèrent les opérations de lecture pour répartir la charge.#Configuration du Serveur Master : $dbMaster = new mysqli('master-db-host', 'username', 'password', 'database'); #Configuration des Serveurs Slaves : $dbSlaves = [ new mysqli('slave1-db-host', 'username', 'password', 'database'), new mysqli('slave2-db-host', 'username', 'password', 'database') ]; // Fonction pour équilibrer les requêtes de lecture function getSlaveConnection($dbSlaves) { return $dbSlaves[array_rand($dbSlaves)]; } // Utilisation dans l'application $slaveDb = getSlaveConnection($dbSlaves); $result = $slaveDb->query('SELECT * FROM table');Architecture Master-Master
Master-Master : Deux ou plusieurs serveurs de base de données gèrent à la fois les opérations de lecture et d'écriture et répliquent les données entre eux.
Utilisation d'une Base de Données Distribuée (PostgreSQL avec Patroni :)
Cluster : Un groupe de serveurs de base de données qui fonctionnent comme une seule entité, gérant la répartition de la charge et la tolérance aux pannes de manière transparente.
sudo apt-get install patroni etcd
Load Balancer pour la Base de Données avec HAProxyUtilisez un équilibreur de charge spécifique à la base de données, comme HAProxy, pour distribuer les requêtes de manière intelligente entre plusieurs serveurs de base de données.
sudo apt-get install haproxy frontend mysql_front bind *:3306 default_backend mysql_back backend mysql_back mode tcp balance roundrobin server mysql1 192.168.1.1:3306 check server mysql2 192.168.1.2:3306 check sudo systemctl start haproxy