Aller au contenu principal
Maîtriser Nginx : Installation, Configuration et Bonnes Pratiques
Retour aux articles

Maîtriser Nginx : Installation, Configuration et Bonnes Pratiques

Learn'in 1 min de lecture

Maîtriser Nginx : Installation, Configuration et Bonnes Pratiques

Nginx (prononcé "Engine-X") est l'un des serveurs web les plus populaires au monde. Connu pour ses performances exceptionnelles et sa faible consommation de ressources, il est devenu un choix privilégié pour héberger des sites web à fort trafic.

Dans ce guide, nous allons explorer l'installation, la configuration et les meilleures pratiques pour exploiter pleinement Nginx.

Pourquoi Choisir Nginx ?

Nginx se distingue par plusieurs avantages majeurs :

  • Performance élevée : Architecture événementielle permettant de gérer des milliers de connexions simultanées
  • Faible consommation mémoire : Beaucoup plus léger que Apache dans la plupart des cas
  • Reverse proxy intégré : Idéal pour la mise en place de load balancing
  • Serveur de cache : Améliore significativement les temps de réponse
  • Configuration simple : Syntaxe claire et facile à comprendre

Installation de Nginx

Sur Ubuntu/Debian

bash
# Mettre à jour les paquets
sudo apt update

# Installer Nginx
sudo apt install nginx

# Vérifier l'installation
nginx -v

# Démarrer le service
sudo systemctl start nginx

# Activer au démarrage
sudo systemctl enable nginx

Sur CentOS/RHEL

bash
# Ajouter le repository EPEL
sudo yum install epel-release

# Installer Nginx
sudo yum install nginx

# Démarrer le service
sudo systemctl start nginx

# Activer au démarrage
sudo systemctl enable nginx

Sur macOS (avec Homebrew)

bash
# Installer Homebrew si nécessaire
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Installer Nginx
brew install nginx

# Démarrer le service
brew services start nginx

Structure de Configuration

La configuration de Nginx se trouve généralement dans /etc/nginx/. Voici la structure typique :

text
/etc/nginx/
├── nginx.conf          # Configuration principale
├── conf.d/             # Configurations supplémentaires
├── sites-available/    # Sites disponibles (Debian/Ubuntu)
├── sites-enabled/      # Sites activés (Debian/Ubuntu)
└── ssl/                # Certificats SSL

Fichier de Configuration Principal

Le fichier nginx.conf contient la configuration globale :

nginx
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

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

    sendfile on;
    keepalive_timeout 65;

    include /etc/nginx/conf.d/*.conf;
}

Configuration d'un Serveur Virtuel

Un serveur virtuel permet d'héberger plusieurs sites sur un même serveur.

Configuration de Base

Créez un fichier dans /etc/nginx/sites-available/monsite.conf :

nginx
server {
    listen 80;
    server_name monsite.com www.monsite.com;
    root /var/www/monsite;
    index index.html index.htm;

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

    # Logs
    access_log /var/log/nginx/monsite_access.log;
    error_log /var/log/nginx/monsite_error.log;
}

Activer le Site

bash
# Créer un lien symbolique vers sites-enabled
sudo ln -s /etc/nginx/sites-available/monsite.conf /etc/nginx/sites-enabled/

# Tester la configuration
sudo nginx -t

# Recharger Nginx
sudo systemctl reload nginx

Configuration HTTPS avec SSL/TLS

Obtenir un Certificat Let's Encrypt

bash
# Installer Certbot
sudo apt install certbot python3-certbot-nginx

# Obtenir un certificat
sudo certbot --nginx -d monsite.com -d www.monsite.com

Configuration Manuelle SSL

nginx
server {
    listen 443 ssl http2;
    server_name monsite.com;

    ssl_certificate /etc/nginx/ssl/monsite.crt;
    ssl_certificate_key /etc/nginx/ssl/monsite.key;

    # Paramètres SSL recommandés
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

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

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

# Redirection HTTP vers HTTPS
server {
    listen 80;
    server_name monsite.com;
    return 301 https://$server_name$request_uri;
}

Nginx comme Reverse Proxy

Nginx excelle en tant que reverse proxy pour des applications backend.

Proxy vers une Application Node.js

nginx
server {
    listen 80;
    server_name api.monsite.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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;
        proxy_cache_bypass $http_upgrade;
    }
}

Proxy vers une Application PHP-FPM

nginx
server {
    listen 80;
    server_name monsite.com;
    root /var/www/monsite;
    index index.php index.html;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Load Balancing

Nginx permet de répartir la charge entre plusieurs serveurs backend.

nginx
upstream backend_servers {
    least_conn;
    server 192.168.1.10:80 weight=3;
    server 192.168.1.11:80 weight=2;
    server 192.168.1.12:80 backup;
}

server {
    listen 80;
    server_name monsite.com;

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

Optimisation des Performances

Activer la Compression Gzip

nginx
http {
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types text/plain text/css text/xml text/javascript 
               application/x-javascript application/xml application/javascript;
    gzip_disable "MSIE [1-6]\.";
}

Mise en Cache du Navigateur

nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|txt)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}

Augmenter les Limites

nginx
http {
    client_max_body_size 100M;
    client_body_buffer_size 128k;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 16k;
}

Sécurité Nginx

Masquer la Version de Nginx

nginx
http {
    server_tokens off;
}

Protéger contre les Attaques DDoS

nginx
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    
    server {
        location / {
            limit_req zone=one burst=20 nodelay;
        }
    }
}

Headers de Sécurité

nginx
server {
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
}

Restreindre l'Accès à Certains Endpoints

nginx
location /admin {
    allow 192.168.1.0/24;
    deny all;
}

Commandes Utiles

bash
# Tester la configuration
sudo nginx -t

# Recharger sans interruption
sudo systemctl reload nginx

# Redémarrer complètement
sudo systemctl restart nginx

# Vérifier le statut
sudo systemctl status nginx

# Voir les logs d'erreur
sudo tail -f /var/log/nginx/error.log

# Voir les logs d'accès
sudo tail -f /var/log/nginx/access.log

Dépannage Courant

Problème : "Permission Denied"

bash
# Vérifier les permissions des fichiers
sudo chown -R www-data:www-data /var/www/monsite
sudo chmod -R 755 /var/www/monsite

Problème : "502 Bad Gateway"

Vérifiez que votre application backend est en cours d'exécution et accessible sur le port configuré.

Problème : Configuration Non Appliquée

bash
# Toujours tester avant de recharger
sudo nginx -t

# Vérifier les liens symboliques
ls -la /etc/nginx/sites-enabled/

Conclusion

Nginx est un outil puissant et polyvalent qui mérite sa place dans votre stack technique. Que vous l'utilisiez comme serveur web, reverse proxy ou load balancer, une bonne compréhension de sa configuration vous permettra d'optimiser les performances et la sécurité de vos applications.

N'hésitez pas à consulter la documentation officielle pour explorer des fonctionnalités plus avancées comme le caching, le streaming ou les modules dynamiques.


Ressources Utiles :

Articles similaires