Aller au contenu
medium

Nginx : performant, flexible et sécurisé

34 min de lecture

logo 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.

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.

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 :

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;
}
}

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;
}
}

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;
}
}

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;
}
}

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;
}
}

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

Section intitulée « 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).

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

Fenêtre de terminal
sudo apt update
sudo apt upgrade

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

Fenêtre de terminal
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.

Fenêtre de terminal
sudo apt update
sudo apt install nginx

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

Fenêtre de terminal
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

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

Section intitulée « Installation sur les Distributions de Type Red Hat (RHEL, CentOS, Fedora) »

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

Fenêtre de terminal
sudo yum update

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

Fenêtre de terminal
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.

Fenêtre de terminal
sudo yum install nginx

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

Fenêtre de terminal
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status 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.

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.

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/.

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.
  • 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.

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.

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.

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).

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.

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

Fenêtre de terminal
sudo apt-get install nginx-module-geoip

Sur CentOS/RHEL, utilisez yum :

Fenêtre de terminal
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.

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;
}
}

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;
}

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.

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.

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 :

Fenêtre de terminal
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx

Sur CentOS/RHEL :

Fenêtre de terminal
sudo yum install epel-release
sudo yum install certbot python-certbot-nginx
Fenêtre de terminal
sudo certbot --nginx -d example.com -d www.example.com

Certbot va automatiquement configurer Nginx pour utiliser le certificat obtenu.

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;
}
}

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;
}

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;
}
}
}

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.

Fenêtre de terminal
http {
...
server_tokens off;
...
}

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;
}
}

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;
}
}

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;
}
}

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 :

Fenêtre de terminal
sudo apt-get update
sudo apt-get upgrade nginx

Sur CentOS/RHEL :

Fenêtre de terminal
sudo yum update 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.

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

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 :

Fenêtre de terminal
tail -f /var/log/nginx/access.log /var/log/nginx/error.log

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.

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.

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

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
}

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.

Sur Debian/Ubuntu :

Fenêtre de terminal
sudo apt update
sudo apt upgrade nginx

Sur CentOS/RHEL :

Fenêtre de terminal
sudo yum update nginx

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

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é.

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

Sauvegardez régulièrement vos configurations Nginx :

Fenêtre de terminal
tar -czvf nginx-config-backup.tar.gz /etc/nginx

Pour restaurer une configuration sauvegardée :

Fenêtre de terminal
tar -xzvf nginx-config-backup.tar.gz -C /
sudo systemctl restart nginx

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.

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.

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.

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;
}

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;
}

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

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;
}
}

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;
}
}

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

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;
}
}

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;
}

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;

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

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";
}
}
}

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

Section intitulée « 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;
}
}

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.

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

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

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

Fenêtre de terminal
tail -f /var/log/nginx/access.log /var/log/nginx/error.log

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

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

Fenêtre de terminal
sudo nginx -t

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

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

Fenêtre de terminal
sudo systemctl restart nginx

Les erreurs 502 Bad Gateway indiquent généralement un problème de communication entre Nginx et le 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é :

Fenêtre de terminal
curl -I http://backend_server

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;
}

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

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;
}
}

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.

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

Fenêtre de terminal
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html

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

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

Fenêtre de terminal
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.

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

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;
}

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

Fenêtre de terminal
sudo certbot renew

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

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

Fenêtre de terminal
htop

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;
}

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

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.

Pour aller plus loin, voici quelques ressources indispensables :