Aller au contenu principal

Nginx

Bienvenue dans ce guide dédié à Nginx, un serveur web open-source performant et flexible. Que vous soyez un administrateur système expérimenté ou un débutant cherchant à comprendre les bases des serveurs web, ce guide est conçu pour vous aider à maîtriser Nginx.

Dans ce guide, nous explorerons l'historique de Nginx, ses fonctionnalités principales et ses concepts clés. Vous apprendrez également comment installer et configurer Nginx, sécuriser votre serveur et optimiser ses performances pour répondre à vos besoins spécifiques. Que vous ayez besoin de servir des pages web statiques, de gérer des applications dynamiques, ou d'optimiser les performances de votre infrastructure, Nginx est l'outil qu'il vous faut.

Historique de Nginx

Nginx a été créé par Igor Sysoev en 2004. À cette époque, Sysoev travaillait sur des projets nécessitant une gestion efficace d'un grand nombre de connexions simultanées. Les serveurs web disponibles, comme Apache, montraient des limites en termes de performance et de scalabilité sous forte charge. C'est pour répondre à ces défis que Sysoev a développé Nginx, en se concentrant sur une architecture asynchrone et événementielle, permettant de gérer efficacement des milliers de connexions simultanées avec une utilisation réduite des ressources.

Au fil des années, Nginx a gagné en popularité grâce à ses performances élevées et à sa fiabilité. Il est devenu une alternative incontournable à Apache, offrant des avantages notables en termes de rapidité, flexibilité et efficacité. En 2011, Nginx Inc. a été fondée pour soutenir le développement du projet et proposer des services commerciaux autour de Nginx.

Aujourd'hui, Nginx est largement utilisé par des entreprises de toutes tailles, allant des startups aux géants de l'industrie comme Netflix, Dropbox et WordPress.com. Son adoption continue de croître grâce à sa capacité à répondre aux besoins des infrastructures modernes, que ce soit pour servir des contenus statiques, agir comme proxy inverse, ou équilibrer la charge des serveurs.

L'évolution de Nginx se poursuit avec des mises à jour régulières et l'ajout de nouvelles fonctionnalités, ce qui en fait un choix toujours pertinent et avant-gardiste pour les administrateurs systèmes et les développeurs cherchant à optimiser leurs environnements web.

Fonctionnalités de Nginx

Nginx est apprécié pour sa richesse fonctionnelle qui répond aux divers besoins des administrateurs systèmes et des développeurs. Voici quelques-unes des fonctionnalités les plus notables de Nginx :

Gestion des Fichiers Statiques

Nginx est extrêmement efficace pour servir des fichiers statiques tels que les images, les vidéos et les feuilles de style. Sa capacité à gérer de manière rapide et efficace les contenus statiques en fait un choix idéal pour les sites à fort trafic.

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

Cache

Le cache est une fonctionnalité puissante de Nginx qui permet de stocker en mémoire des réponses pour réduire la charge sur les serveurs backend et améliorer les temps de réponse. Voici un exemple de configuration de cache :

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_cache my_cache;
        proxy_pass http://backend;
    }
}

Réécriture et Redirection d'URL

Nginx offre des fonctionnalités avancées de réécriture et redirection d'URL, permettant de manipuler les requêtes entrantes et de les rediriger vers les emplacements appropriés.

server {
    listen 80;
    server_name oldsite.com;

    location / {
        rewrite ^/(.*)$ http://newsite.com/$1 permanent;
    }
}

Reverse Proxy

Nginx est souvent utilisé comme Revers Proxy. Il peut recevoir les requêtes des clients et les transmettre à différents serveurs de backend, répartissant ainsi la charge et améliorant la performance globale. Cette fonctionnalité est particulièrement utile pour les applications web nécessitant une haute disponibilité et une mise à l'échelle facile.

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Équilibrage de Charge

L'équilibrage de charge est une autre fonctionnalité clé de Nginx. En distribuant le trafic entrant sur plusieurs serveurs, Nginx assure une répartition uniforme des requêtes, améliorant ainsi la disponibilité et la performance des applications.

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}

server {
    listen 80;

    location / {
        proxy_pass http://backend;
    }
}

Modules

Nginx est conçu pour être extensible grâce à son système de modules dynamiques. Ces modules permettent d'ajouter des fonctionnalités supplémentaires sans altérer le cœur du serveur. Par exemple, le module ngx_http_ssl_module permet de gérer les connexions HTTPS.

Installation d'une Version Récente de Nginx sur Linux

L'installation de Nginx sur Linux peut varier légèrement selon la distribution que vous utilisez. Dans cette section, je vais vous guider à travers les étapes pour installer une version récente de Nginx sur les distributions Ubuntu et Red Hat-based distributions (RHEL, CentOS, Fedora).

Installation sur Ubuntu

Avant d'installer un nouveau logiciel, il est toujours conseillé de mettre à jour les paquets existants.

sudo apt update
sudo apt upgrade

Pour obtenir la dernière version de Nginx, vous devez ajouter le dépôt officiel de Nginx.

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

Une fois le dépôt ajouté, vous pouvez installer Nginx.

sudo apt update
sudo apt install nginx

Après l'installation, vérifiez que Nginx fonctionne correctement.

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

Installation sur les Distributions de Type Red Hat (RHEL, CentOS, Fedora)

Mettez à jour votre système avec les commandes suivantes :

sudo yum update

Ajoutez le dépôt officiel de Nginx pour les distributions basées sur Red Hat.

sudo tee /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/rhel/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF

Pour Fedora, remplacez rhel par fedora dans l'URL du dépôt.

Installez la dernière version de Nginx depuis le dépôt officiel.

sudo yum install nginx

Après l'installation, vérifiez que Nginx fonctionne correctement.

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

Configuration de Nginx

Configurer Nginx pour répondre à vos besoins spécifiques est essentiel pour tirer parti de ses capacités. Je vais vous guider à travers les éléments fondamentaux de la configuration de base de Nginx.

Fichier de Configuration Principal

Le fichier principal de configuration de Nginx est nginx.conf, généralement situé dans /etc/nginx/nginx.conf sur les systèmes Linux. Ce fichier contrôle les paramètres globaux de Nginx ainsi que les paramètres par défaut pour tous les sites.

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 1024;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

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

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    server {
        listen 80;
        server_name example.com www.example.com;

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

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

        location /images/ {
            root /data;
        }

        location /api/ {
            proxy_pass http://backend_server;
            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;
        }

        error_page 404 /404.html;
            location = /404.html {
            internal;
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
            internal;
        }
    }
}

Les directives globales s'appliquent à l'ensemble de la configuration de Nginx.

  • user : Définit l'utilisateur et le groupe sous lesquels les processus de travail de Nginx s'exécuteront.
  • worker_processes : Détermine le nombre de processus de travail. Utiliser auto permet à Nginx de déterminer le nombre optimal de processus.
  • pid : Spécifie le fichier PID où le processus principal de Nginx enregistre son identifiant de processus.
  • include : Inclut d'autres fichiers de configuration.

Le bloc events contient des directives qui affectent la façon dont Nginx gère les connexions réseau.

  • worker_connections : Définit le nombre maximum de connexions simultanées qu'un processus de travail peut gérer.

Le bloc http contient les directives qui définissent le comportement du serveur web HTTP.

  • sendfile : Permet l'utilisation de l'appel système sendfile pour améliorer les performances.
  • tcp_nopush et tcp_nodelay : Optimisent les performances de transmission des paquets TCP.
  • keepalive_timeout : Définit la durée pendant laquelle les connexions persistent ouvertes.
  • types_hash_max_size : Optimise le hachage des types MIME.
  • include : Inclut des fichiers de configuration supplémentaires.
  • default_type : Définit le type de fichier par défaut.
  • ssl_protocols et ssl_prefer_server_ciphers : Configurent les protocoles SSL/TLS et les préférences de chiffrement.
  • access_log et error_log : Spécifient les emplacements des journaux d'accès et des erreurs.
  • gzip : Active la compression gzip.

Le bloc server définit les paramètres spécifiques à un serveur virtuel.

  • listen : Spécifie l'adresse IP et le port sur lesquels le serveur écoute.
  • server_name : Définit le nom du serveur virtuel.
  • root : Définit le répertoire racine des documents pour ce serveur.
  • index : Spécifie les fichiers d'index.

Le bloc location configure la gestion des requêtes pour les URI spécifiques.

  • location / : La configuration par défaut pour le serveur. Utilise try_files pour vérifier l'existence du fichier demandé.
  • location /images/ : Change la racine des documents pour ce sous-chemin.
  • location /api/ : Proxy les requêtes vers un serveur backend avec les en-têtes appropriés.
  • error_page : Définit les pages d'erreur personnalisées. Les blocs location internes pour les pages d'erreur sont marqués comme internal pour qu'ils ne soient accessibles que par Nginx.

Configuration des Hôtes Virtuels

Les hôtes virtuels (ou virtual hosts) permettent à Nginx de servir plusieurs sites web à partir d'une seule instance de serveur. Cela est réalisé en configurant différents blocs server pour chaque site, souvent dans des fichiers de configuration séparés. Cette approche facilite la gestion et la maintenance des configurations, surtout lorsque plusieurs sites sont hébergés sur le même serveur.

Nginx charge les configurations des hôtes virtuels à partir des fichiers inclus. Ces fichiers sont généralement situés dans un répertoire dédié /etc/nginx/conf.d/.

Exemple de Fichier d'Hôte Virtuel

Voici un exemple de fichier de configuration pour un hôte virtuel situé dans /etc/nginx/conf.d/example.com :

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html index.htm;

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

    location /images/ {
        root /data;
    }

    location /api/ {
        proxy_pass http://backend_server;
        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;
    }

    error_page 404 /404.html;
    location = /404.html {
        internal;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        internal;
    }
}
  • listen : Indique à Nginx d'écouter les requêtes HTTP sur le port 80.
  • server_name : Spécifie les noms de domaine pour lesquels ce bloc server répondra.
  • root : Définit le répertoire racine des fichiers pour ce domaine.
  • index : Indique les fichiers d'index par défaut.
  • location / : Gère les requêtes à la racine du site, essayant de trouver les fichiers demandés.
  • location /images/ : Spécifie un répertoire différent pour les images.
  • location /api/ : Proxy les requêtes vers un serveur backend avec les en-têtes HTTP appropriés.
  • error_page : Définit des pages d'erreur personnalisées pour les codes de statut HTTP spécifiés.

Avantages de l'Utilisation des Fichiers Inclus

  • Modularité : Chaque site a son propre fichier de configuration, ce qui simplifie la gestion.
  • Facilité de Maintenance : Les modifications apportées à un site n'affectent pas les autres sites.
  • Sécurité : Les configurations spécifiques à chaque site peuvent être gérées indépendamment, permettant des réglages de sécurité adaptés.

Modules et Extensions

Nginx est conçu pour être extensible grâce à ses modules dynamiques. Ces modules permettent d'ajouter des fonctionnalités supplémentaires sans altérer le cœur du serveur. Voici comment gérer les modules et extensions dans Nginx.

Chargement des Modules Dynamiques

Nginx supporte les modules dynamiques qui peuvent être chargés à la demande, ce qui permet de personnaliser votre serveur sans recompiler Nginx. Voici comment charger un module dynamique dans la configuration de Nginx :

load_module modules/ngx_http_geoip_module.so;

Les modules dynamiques sont souvent situés dans le répertoire modules sous l'emplacement d'installation de Nginx.

Modules Courants

Voici quelques modules courants et leurs fonctionnalités :

  • ngx_http_ssl_module : Gère les connexions HTTPS.
  • ngx_http_gzip_module : Permet la compression des réponses HTTP pour réduire la bande passante.
  • ngx_http_geoip_module : Fournit des informations géographiques basées sur les adresses IP.
  • ngx_http_image_filter_module : Permet la transformation d'images (redimensionnement, recadrage).
  • ngx_http_realip_module : Remplace l'adresse IP du client par celle envoyée dans un en-tête spécifique (utilisé avec les proxys).

Installation des Modules

Certaines distributions de Nginx viennent avec des modules pré-compilés, mais d'autres nécessitent de compiler Nginx avec les modules souhaités. Pour installer des modules supplémentaires sur une distribution Nginx standard, vous pouvez utiliser des gestionnaires de paquets ou compiler les modules à partir des sources.

Utilisation des gestionnaires de paquets

Sur Debian/Ubuntu, vous pouvez installer des modules supplémentaires avec apt :

sudo apt-get install nginx-module-geoip

Sur CentOS/RHEL, utilisez yum :

sudo yum install nginx-mod-http-geoip

Si le module souhaité n'est pas disponible via le gestionnaire de paquets, vous devrez recompiler Nginx avec ce module. Voici les étapes pour ajouter un module à Nginx en le compilant à partir des sources.

Exemples de Configuration de Modules

Configuration du Module SSL

Le module ngx_http_ssl_module permet de configurer les connexions HTTPS. Voici un exemple de configuration :

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/your_domain_name.pem;
    ssl_certificate_key /etc/ssl/private/your_domain_name.key;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

Configuration du Module Gzip

Le module ngx_http_gzip_module permet de compresser les réponses HTTP pour économiser de la bande passante :

http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

Gestion des Modules Tiers

En plus des modules fournis par défaut avec Nginx, il existe de nombreux modules tiers développés par la communauté. Par exemple, ngx_pagespeed est un module développé par Google pour optimiser automatiquement les performances des pages web.

Sécurisation de Nginx

La sécurisation de Nginx est une étape importante pour protéger votre serveur web contre les attaques et les vulnérabilités. Voici les principales mesures de sécurité que vous pouvez mettre en place.

Utilisation de HTTPS

Le premier pas vers la sécurisation de votre serveur Nginx est d'utiliser HTTPS pour chiffrer les communications entre le client et le serveur. Pour cela, vous aurez besoin d'un certificat SSL/TLS. Vous pouvez obtenir un certificat gratuit de Let's Encrypt.

Sur Debian/Ubuntu :

sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx

Sur CentOS/RHEL :

sudo yum install epel-release
sudo yum install certbot python-certbot-nginx

Obtention et Installation du Certificat

sudo certbot --nginx -d example.com -d www.example.com

Certbot va automatiquement configurer Nginx pour utiliser le certificat obtenu.

Configuration SSL/TLS

Une fois que vous avez un certificat, configurez Nginx pour utiliser SSL/TLS correctement.

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;

    location / {
        root /var/www/html;
        index index.html;
    }
}

Redirection HTTP vers HTTPS

Pour s'assurer que tout le trafic utilise HTTPS, redirigez les requêtes HTTP vers HTTPS.

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

Limitation du Nombre de Connexions

Limiter le nombre de connexions par adresse IP peut aider à protéger contre les attaques par déni de service (DoS).

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_conn addr 10;
            root /var/www/html;
            index index.html;
        }
    }
}

Désactivation des informations sur le serveur

En désactivant les server tokens, vous limitez les informations divulguées sur votre serveur web, ce qui contribue à améliorer la sécurité en rendant plus difficile pour les attaquants de cibler des faiblesses spécifiques.

La directive server_tokens off dans la configuration de NGINX sert à masquer les informations sur la version de NGINX dans les réponses HTTP. Par défaut, NGINX inclut des informations sur la version dans l'en-tête Server et dans les pages d'erreur. Cette information peut être utilisée par des attaquants pour identifier les versions spécifiques de NGINX qui pourraient être vulnérables à certaines attaques.

http {
    ...
    server_tokens off;
    ...
}

Utilisation des En-Têtes de Sécurité

Ajouter des en-têtes de sécurité HTTP peut aider à protéger contre des attaques courantes comme le cross-site scripting (XSS) et le clickjacking.

server {
    listen 80;
    server_name example.com;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    location / {
        root /var/www/html;
        index index.html;
    }
}

Restriction de l'Accès par IP

Pour protéger des sections sensibles de votre site, vous pouvez restreindre l'accès à certaines adresses IP.

server {
    listen 80;
    server_name example.com;

    location /admin {
        allow 192.168.1.0/24;
        deny all;
        root /var/www/html;
        index index.html;
    }
}

Désactivation des Méthodes HTTP non Utilisées

Pour réduire la surface d'attaque, désactivez les méthodes HTTP que votre application n'utilise pas.

server {
    listen 80;
    server_name example.com;

    location / {
        if ($request_method !~ ^(GET|POST|HEAD)$ ) {
            return 444;
        }
        root /var/www/html;
        index index.html;
    }
}

Mise à Jour Régulière de Nginx

Assurez-vous que votre installation de Nginx est toujours à jour avec les dernières versions pour bénéficier des correctifs de sécurité et des améliorations.

Sur Debian/Ubuntu :

sudo apt-get update
sudo apt-get upgrade nginx

Sur CentOS/RHEL :

sudo yum update nginx

Monitoring et Maintenance de Nginx

Pour garantir la disponibilité et la performance de votre serveur Nginx, il est important de mettre en place des pratiques de monitoring et de maintenance régulières. Voici les étapes et les outils recommandés pour surveiller et maintenir efficacement votre serveur Nginx.

Surveillance des Logs

Les logs sont une source d'informations précieuse pour comprendre le comportement de votre serveur et identifier les problèmes.

Accès aux Logs

Les logs d'accès et les logs d'erreurs de Nginx sont situés par défaut dans le répertoire /var/log/nginx/.

  • Log d'accès : /var/log/nginx/access.log
  • Log d'erreurs : /var/log/nginx/error.log

Pour surveiller les logs en temps réel, utilisez la commande tail :

tail -f /var/log/nginx/access.log /var/log/nginx/error.log

Monitoring avec Outils Spécifiques

Nginx Amplify

Nginx Amplify est un outil de monitoring développé spécifiquement pour Nginx. Il offre une surveillance détaillée des performances et des configurations.

  • Inscription : Créez un compte sur Nginx Amplify.
  • Installation de l'agent : Suivez les instructions pour installer l'agent Amplify sur votre serveur.

Grafana et Prometheus

Pour une solution de monitoring plus générale, vous pouvez utiliser Prometheus pour collecter des métriques et Grafana pour les visualiser.

  • Installation de Prometheus : Suivez les instructions sur le site officiel de Prometheus.
  • Configuration de l'exporter Nginx : Utilisez un exporter comme nginx-exporter pour envoyer des métriques à Prometheus.
  • Installation de Grafana : Installez Grafana et configurez-le pour récupérer les données de Prometheus.

Rotation des Logs

Configurez la rotation des logs pour éviter que les fichiers de log ne deviennent trop volumineux et remplissent le disque.

Utilisation de logrotate

Créez un fichier de configuration pour Nginx dans /etc/logrotate.d/nginx :

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Mise à Jour et Sécurité

Assurez-vous que votre serveur Nginx est toujours à jour pour bénéficier des derniers correctifs de sécurité et des améliorations de performance.

Mise à Jour Régulière

Sur Debian/Ubuntu :

sudo apt update
sudo apt upgrade nginx

Sur CentOS/RHEL :

sudo yum update nginx

Audit de Sécurité

Effectuez régulièrement des audits de sécurité pour identifier et corriger les vulnérabilités potentielles.

Utilisation de OpenVAS

OpenVAS est un outil d'audit de sécurité open-source qui peut être utilisé pour scanner votre serveur Nginx.

  • Installation d'OpenVAS : Suivez les instructions sur le site officiel d'OpenVAS.
  • Scan de Sécurité : Lancez un scan de sécurité et analysez les résultats pour identifier les failles de sécurité.

Sauvegarde et Récupération

Mettez en place une stratégie de sauvegarde pour pouvoir récupérer rapidement en cas de problème.

Sauvegarde des Configurations

Sauvegardez régulièrement vos configurations Nginx :

tar -czvf nginx-config-backup.tar.gz /etc/nginx

Restauration des Configurations

Pour restaurer une configuration sauvegardée :

tar -xzvf nginx-config-backup.tar.gz -C /
sudo systemctl restart nginx

Concepts Avancés

Une fois que vous maîtrisez les bases de Nginx, il est utile de se pencher sur des concepts avancés pour tirer pleinement parti de ses capacités. Cette section explore les fonctionnalités avancées telles que le load balancing, l'utilisation de modules tiers et la configuration avancée des règles de réécriture et de redirection.

Load Balancing (Répartition de Charge)

Le load balancing est essentiel pour distribuer les requêtes entrantes sur plusieurs serveurs backend, améliorant ainsi la disponibilité et la performance de votre application.

Configuration de Base du Load Balancing

Voici un exemple de configuration simple pour le load balancing :

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;
            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;
        }
    }
}

Cette configuration distribue les requêtes entre backend1.example.com et backend2.example.com.

Algorithmes de Répartition

Nginx supporte plusieurs algorithmes de répartition de charge :

  • Round Robin (par défaut) : Les requêtes sont distribuées de manière cyclique.
  • Least Connections : Les requêtes sont envoyées au serveur ayant le moins de connexions actives.

Configuration pour Least Connections :

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
}

Health Checks

Les health checks permettent de vérifier l'état des serveurs backend et d'éviter d'envoyer des requêtes à des serveurs défaillants.

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;

    server backend4.example.com;
    server backend5.example.com backup;

    # Active health checks
    server backend6.example.com max_fails=3 fail_timeout=30s;
}

Règles de Réécriture et de Redirection

Les règles de réécriture et de redirection permettent de manipuler les URLs entrantes pour répondre aux besoins de votre application.

Réécritures Simples

Une réécriture simple pour ajouter un préfixe à toutes les URLs :

server {
    listen 80;
    server_name example.com;

    location / {
        rewrite ^/oldpath/(.*)$ /newpath/$1 permanent;
    }
}

Utilisation de Variables

Nginx offre de nombreuses variables internes pour des réécritures dynamiques :

server {
    listen 80;
    server_name example.com;

    location / {
        set $new_url "/newpath";
        rewrite ^/oldpath/(.*)$ $new_url/$1;
    }
}

Configuration SSL Avancée

Pour sécuriser votre site, utilisez SSL avec une configuration avancée pour des performances optimales.

Configuration de Base SSL

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;

    location / {
        root /var/www/html;
        index index.html;
    }
}

SSL avec HTTP/2

Pour activer HTTP/2 avec SSL :

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
}

Sécurisation SSL

Pour une sécurité renforcée, désactivez les protocoles obsolètes et activez les suites de chiffrement sécurisées :

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM';
ssl_prefer_server_ciphers on;

WebSockets

Nginx peut gérer les WebSockets pour les applications en temps réel.

Configuration de WebSockets

http {
    upstream websocket {
        server websocket_backend:8080;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
}

Reverse Proxy avec Caching

Utiliser Nginx comme reverse proxy avec caching peut améliorer les performances et réduire la charge sur les serveurs backend.

Configuration de Base du Reverse Proxy avec Caching

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    location / {
        proxy_pass http://backend;
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
    }
}

Dépannage et Résolution des Problèmes

Même avec une configuration optimale, des problèmes peuvent survenir sur votre serveur Nginx. Cette section vous guide à travers les étapes de dépannage et de résolution des problèmes courants pour maintenir votre serveur en bon état de fonctionnement.

Vérification des Logs

Les logs de Nginx sont une source précieuse d'informations pour diagnostiquer les problèmes.

Accéder aux Logs

Les logs d'accès et les logs d'erreurs se trouvent généralement dans /var/log/nginx/.

  • Log d'accès : /var/log/nginx/access.log
  • Log d'erreurs : /var/log/nginx/error.log

Surveillance des Logs en Temps Réel

Pour surveiller les logs en temps réel, utilisez tail :

tail -f /var/log/nginx/access.log /var/log/nginx/error.log

Problèmes de Démarrage de Nginx

Si Nginx ne démarre pas, vérifiez les messages d'erreur pour identifier la cause.

Vérification de la Configuration

Avant de démarrer Nginx, vérifiez que la configuration est correcte :

sudo nginx -t

Si des erreurs de configuration sont détectées, corrigez-les en suivant les indications fournies par le message d'erreur.

Redémarrage de Nginx

Pour redémarrer Nginx après avoir corrigé les erreurs de configuration :

sudo systemctl restart nginx

Erreurs 502 Bad Gateway

Les erreurs 502 Bad Gateway indiquent généralement un problème de communication entre Nginx et le serveur backend.

Vérification du Serveur Backend

Assurez-vous que le serveur backend est en cours d'exécution et accessible. Utilisez des outils comme curl pour tester la connectivité :

curl -I http://backend_server

Configuration du Proxy Pass

Vérifiez que la directive proxy_pass est correctement configurée :

location / {
    proxy_pass http://backend_server;
    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;
}

Erreurs 504 Gateway Timeout

Les erreurs 504 Gateway Timeout se produisent lorsque Nginx n'obtient pas de réponse du serveur backend dans le délai imparti.

Augmentation des Timeout

Ajustez les valeurs de timeout pour accorder plus de temps au serveur backend pour répondre :

server {
    location / {
        proxy_read_timeout 120;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_pass http://backend_server;
    }
}

Erreurs de Permission

Les erreurs de permission se produisent souvent lorsque Nginx n'a pas les droits nécessaires pour accéder aux fichiers ou répertoires spécifiés.

Vérification des Permissions

Assurez-vous que Nginx a les permissions nécessaires sur les répertoires et fichiers spécifiés dans la configuration :

sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html

Résolution des Conflits de Port

Les conflits de port se produisent lorsque plusieurs services tentent d'écouter sur le même port.

Identification des Conflits de Port

Utilisez netstat ou ss pour identifier les services écoutant sur les ports de Nginx :

sudo netstat -tuln | grep :80

Si un autre service utilise le même port, modifiez la configuration de ce service ou celle de Nginx pour éviter le conflit.

Erreurs SSL/TLS

Les erreurs SSL/TLS se produisent souvent en raison de certificats expirés ou mal configurés.

Vérification des Certificats

Assurez-vous que les certificats SSL/TLS sont valides et correctement configurés :

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/your_domain_name.pem;
    ssl_certificate_key /etc/ssl/private/your_domain_name.key;
}

Renouvellement des Certificats

Si vous utilisez Let's Encrypt, renouvelez les certificats automatiquement avec certbot :

sudo certbot renew

Débogage des Performances

Si Nginx est lent, il est important d'identifier les goulots d'étranglement.

Analyse des Performances

Utilisez des outils comme htop, iostat et vmstat pour surveiller l'utilisation des ressources système :

htop

Ajustement des Paramètres de Performance

Ajustez les paramètres de configuration de Nginx pour optimiser les performances :

worker_processes auto;
worker_connections 2048;

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
}

Assistance Communautaire et Support

Si vous êtes bloqué, n'hésitez pas à rechercher de l'aide sur les forums et les communautés en ligne.

Forums et Communautés

Conclusion

Nginx est un serveur web polyvalent et performant, largement utilisé pour ses capacités à gérer de grandes quantités de trafic avec efficacité. À travers ce guide, j'ai exploré les différentes facettes de Nginx, de son historique à ses nombreuses fonctionnalités avancées, en passant par les concepts de base et les configurations pratiques.

Nginx continue d'évoluer avec des améliorations régulières et des nouvelles fonctionnalités. L'introduction de Nginx Plus, la version commerciale, apporte des capacités supplémentaires pour les entreprises cherchant des solutions encore plus robustes et scalables. Avec l'augmentation des besoins en matière de performance web et de sécurité, Nginx restera un outil incontournable pour les administrateurs systèmes et les développeurs DevOps.

Plus d'infos

Pour aller plus loin, voici quelques ressources indispensables :

Livres Gratuits

Livres