Hôtes Virtuels Nginx : Héberger Plusieurs Sites Web sur un Seul Serveur

Libérez la puissance des hôtes virtuels Nginx (blocs serveur) pour héberger efficacement plusieurs sites web ou sous-domaines sur un seul serveur. Ce guide propose un tutoriel complet et étape par étape, couvrant la configuration des répertoires, la création des fichiers de configuration, l'activation des blocs serveur et les tests Nginx. Apprenez les meilleures pratiques pour les sous-domaines, les blocs serveur par défaut, l'intégration HTTPS et la journalisation dédiée. Des exemples pratiques et des conseils de dépannage essentiels vous aideront à maîtriser l'hébergement multi-site Nginx, optimisant l'utilisation des ressources et simplifiant la gestion du serveur web.

40 vues

Hosts Virtuels Nginx : Héberger Plusieurs Sites Web sur un Seul Serveur

L'infrastructure web moderne exige souvent la capacité de servir plusieurs sites web ou applications web à partir d'une seule instance de serveur. Cela optimise non seulement l'utilisation des ressources, mais simplifie également la gestion et réduit les coûts opérationnels. Nginx, connu pour ses performances élevées, sa stabilité, son ensemble de fonctionnalités riche et sa faible consommation de ressources, réalise cela grâce à ce qu'il appelle des blocs de serveur (server blocks), souvent désignés comme des hôtes virtuels dans le monde Apache.

Ce guide complet vous accompagnera à travers le processus de configuration des hôtes virtuels Nginx pour gérer et servir efficacement plusieurs noms de domaine ou sous-domaines distincts à partir d'un seul serveur Nginx. Que vous hébergiez example.com et anothersite.org, ou un site principal avec des sous-domaines comme blog.example.com et shop.example.com, maîtriser les blocs de serveur Nginx est une compétence fondamentale pour tout administrateur système ou développeur. À la fin de cet article, vous aurez une compréhension claire et des exemples pratiques pour configurer votre serveur Nginx pour l'hébergement multi-sites.

Comprendre les Blocs de Serveur Nginx (Hôtes Virtuels)

Au fond, un bloc de serveur Nginx est une directive de configuration définie dans le fichier de configuration Nginx (nginx.conf ou les fichiers inclus). Chaque bloc server définit la configuration pour un hôte virtuel spécifique, dictant comment Nginx doit répondre aux requêtes pour un domaine ou un ensemble de domaines particulier. Nginx utilise la directive listen pour spécifier l'adresse IP et le port sur lesquels il doit écouter, et la directive server_name pour identifier les noms de domaine ou les noms d'hôte auxquels ce bloc de serveur doit répondre.

Lorsqu'une requête arrive, Nginx examine l'en-tête Host de la requête HTTP et la compare aux directives server_name de ses blocs de serveur configurés. Il sert ensuite le contenu défini dans le bloc de serveur correspondant. Si aucun server_name ne correspond, Nginx revient généralement au bloc de serveur par défaut (le premier bloc server ou celui explicitement marqué comme default_server).

Prérequis

Avant de commencer, assurez-vous d'avoir ce qui suit :

  1. Nginx Installé : Nginx doit être installé et en cours d'exécution sur votre serveur. Sinon, vous pouvez généralement l'installer via le gestionnaire de paquets de votre système (par exemple, sudo apt update && sudo apt install nginx sur Ubuntu/Debian, sudo yum install nginx sur CentOS/RHEL).
  2. Noms de Domaine : Vous avez besoin d'au moins deux noms de domaine (par exemple, example1.com et example2.com) ou de sous-domaines (par exemple, blog.example.com et app.example.com) que vous souhaitez héberger. Les enregistrements DNS A/AAAA de ces domaines doivent pointer vers l'adresse IP publique de votre serveur.
  3. Structure de Répertoire de Base : Un plan pour l'emplacement de vos fichiers de site web. Une pratique courante est /var/www/votre-domaine.com/html.
  4. Privilèges Sudo : Vous aurez besoin d'un accès sudo pour modifier les fichiers de configuration Nginx.

Guide de Configuration Étape par Étape

Mettons en place deux hôtes virtuels : example1.com et example2.com.

Étape 1 : Créer la Structure de Répertoire pour les Sites Web

Créez d'abord les répertoires racines pour chacun de vos sites web. C'est là que seront stockés leurs fichiers HTML, CSS, JavaScript et autres fichiers statiques. Un emplacement courant est /var/www/.

sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/html

# Définir la propriété à votre utilisateur (remplacez $USER par votre nom d'utilisateur) pour autoriser l'édition
sudo chown -R $USER:$USER /var/www/example1.com/html
sudo chown -R $USER:$USER /var/www/example2.com/html

# Définir les permissions de lecture pour le serveur web
sudo chmod -R 755 /var/www

Ensuite, créez un fichier index.html simple dans chaque répertoire pour tester la configuration :

Pour /var/www/example1.com/html/index.html :

<!-- /var/www/example1.com/html/index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Bienvenue sur Example1.com !</title>
</head>
<body>
    <h1>Succès ! Ceci est Example1.com.</h1>
    <p>Cet hôte virtuel fonctionne correctement.</p>
</body>
</html>

Pour /var/www/example2.com/html/index.html :

<!-- /var/www/example2.com/html/index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Bienvenue sur Example2.com !</title>
</head>
<body>
    <h1>Succès ! Ceci est Example2.com.</h1>
    <p>Cet hôte virtuel fonctionne également !</p>
</body>
</html>

Étape 2 : Créer les Fichiers de Configuration des Blocs de Serveur Nginx

Nginx charge généralement les configurations des blocs de serveur à partir de fichiers situés dans le répertoire /etc/nginx/sites-enabled/. Ces fichiers sont généralement des liens symboliques vers des configurations stockées dans /etc/nginx/sites-available/. Cette séparation vous permet de stocker des configurations qui ne sont pas encore actives ou de les activer/désactiver facilement.

Créez un nouveau fichier de configuration pour example1.com :

sudo nano /etc/nginx/sites-available/example1.com.conf

Ajoutez le contenu suivant :

# /etc/nginx/sites-available/example1.com.conf
server {
    listen 80;
    listen [::]:80;

    root /var/www/example1.com/html;
    index index.html index.htm index.nginx-debian.html;

    server_name example1.com www.example1.com;

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

    access_log /var/log/nginx/example1.com_access.log;
    error_log /var/log/nginx/example1.com_error.log;
}

Explication des Directives :

  • listen 80; : Nginx écoute sur le port 80 (HTTP standard). listen [::]:80; est pour l'IPv6.
  • root /var/www/example1.com/html; : Spécifie la racine du document pour ce bloc de serveur. Nginx recherchera des fichiers dans ce répertoire.
  • index index.html ...; : Définit le fichier par défaut que Nginx doit servir lorsqu'un répertoire est demandé (par exemple, lorsque quelqu'un visite example1.com/).
  • server_name example1.com www.example1.com; : Ceci est crucial. Il indique à Nginx de répondre aux requêtes pour example1.com ou www.example1.com en utilisant la configuration de ce bloc de serveur.
  • location / { ... } : Un bloc définissant comment gérer les requêtes pour des URI spécifiques. try_files tente de servir un fichier directement ($uri), puis un répertoire ($uri/), et retourne finalement une erreur 404 Not Found.
  • access_log et error_log : Spécifie des fichiers journaux séparés pour ce site spécifique, ce qui est une bonne pratique pour faciliter le débogage et l'analyse.

Maintenant, créez un fichier de configuration similaire pour example2.com :

sudo nano /etc/nginx/sites-available/example2.com.conf

Ajoutez le contenu suivant :

# /etc/nginx/sites-available/example2.com.conf
server {
    listen 80;
    listen [::]:80;

    root /var/www/example2.com/html;
    index index.html index.htm index.nginx-debian.html;

    server_name example2.com www.example2.com;

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

    access_log /var/log/nginx/example2.com_access.log;
    error_log /var/log/nginx/example2.com_error.log;
}

Étape 3 : Activer les Blocs de Serveur

Pour activer ces configurations, créez des liens symboliques du répertoire sites-available vers le répertoire sites-enabled. Cela indique à Nginx d'inclure ces fichiers lors de son démarrage.

sudo ln -s /etc/nginx/sites-available/example1.com.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com.conf /etc/nginx/sites-enabled/

Étape 4 : Tester la Configuration Nginx

Il est crucial de tester votre configuration Nginx pour les erreurs de syntaxe avant de la recharger. Cela empêche Nginx d'échouer au redémarrage à cause d'une faute de frappe.

sudo nginx -t

Vous devriez voir une sortie similaire à celle-ci, indiquant le succès :

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Si vous voyez des erreurs, corrigez-les dans les fichiers de configuration respectifs et réexécutez sudo nginx -t jusqu'à ce que cela passe.

Étape 5 : Redémarrer Nginx

Appliquez la nouvelle configuration en redémarrant ou en rechargeant Nginx. Le reload est généralement préféré car il permet à Nginx de charger les nouvelles configurations sans interrompre les connexions actives.

sudo systemctl reload nginx
# Ou, si le rechargement ne fonctionne pas ou pour les nouvelles installations :
sudo systemctl restart nginx

Étape 6 : Mettre à Jour les Enregistrements DNS

Assurez-vous que les enregistrements A DNS pour example1.com, www.example1.com, example2.com et www.example2.com pointent tous vers l'adresse IP de votre serveur Nginx. Sans entrées DNS correctes, votre navigateur ne saura pas où trouver vos sites web.

Une fois que la propagation DNS est terminée (ce qui peut prendre de quelques minutes à plusieurs heures), vous devriez pouvoir visiter http://example1.com et http://example2.com dans votre navigateur web et voir les pages index.html respectives.

Scénarios Avancés et Meilleures Pratiques

Hébergement de Sous-domaines

Héberger des sous-domaines (par exemple, blog.example.com, shop.example.com) fonctionne exactement comme héberger des domaines séparés. Il suffit de définir un nouveau bloc de serveur avec le sous-domaine comme server_name.

Exemple pour blog.example.com :

# /etc/nginx/sites-available/blog.example.com.conf
server {
    listen 80;
    listen [::]:80;

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

    server_name blog.example.com;

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

N'oubliez pas de créer le répertoire (/var/www/blog.example.com/html), de créer un index.html, de créer le lien symbolique et de recharger Nginx.

Le Bloc de Serveur par Défaut

Il est de bonne pratique d'avoir un bloc de serveur par défaut qui intercepte les requêtes pour des noms de domaine qui ne correspondent à aucune autre directive server_name sur votre serveur. Cela empêche les requêtes inconnues d'être servies par le "premier" hôte virtuel que Nginx trouve, ou vous permet de servir une page "site introuvable" générique.

Typiquement, le premier bloc server dans votre nginx.conf ou sites-enabled est implicitement le défaut. Vous pouvez en définir un explicitement en utilisant default_server :

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;
    # Le trait de soulignement `_` est un nom de domaine inexistant qui ne correspondra jamais à une requête réelle.
    # Vous pouvez également utiliser localhost.

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

    location / {
        return 444; # Retourne une erreur 444 spécifique à Nginx (aucune réponse) pour les hôtes inconnus
        # Ou, servir une page de destination générique :
        # try_files $uri $uri/ =404;
    }
}

Avertissement : Si vous définissez un bloc default_server, assurez-vous qu'un seul bloc server sur un port listen donné possède le drapeau default_server, sinon Nginx enregistrera un avertissement.

Sécuriser les Hôtes Virtuels avec HTTPS (SSL/TLS)

Pour les sites web de production, l'activation du HTTPS est essentielle. Cela implique d'obtenir un certificat SSL/TLS (par exemple, via Let's Encrypt en utilisant Certbot) et de configurer Nginx pour écouter sur le port 443 avec le certificat.

Un bloc de serveur HTTPS typique ressemble à ceci (après l'obtention des certificats) :

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name example1.com www.example1.com;

    root /var/www/example1.com/html;
    index index.html;

    ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;

    # Inclure d'autres configurations SSL (chiffrements, protocoles, etc.)
    include /etc/nginx/snippets/ssl-params.conf;
    include /etc/nginx/snippets/force-ssl.conf; # Optionnel : redirige HTTP vers HTTPS

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

# Optionnel : Redirection HTTP vers HTTPS pour ce domaine
server {
    listen 80;
    listen [::]:80;
    server_name example1.com www.example1.com;
    return 301 https://$host$request_uri;
}

Il est courant d'avoir un bloc de serveur HTTP séparé dont le seul but est de rediriger tout le trafic vers son homologue HTTPS.

Journalisation pour Chaque Site

Comme montré dans les exemples, dédier des fichiers access_log et error_log séparés pour chaque hôte virtuel est une bonne pratique. Cela facilite grandement le débogage des problèmes et l'analyse du trafic pour les sites web individuels sans avoir à parcourir des journaux combinés.

Structure des Fichiers de Configuration

Pour les déploiements plus importants, envisagez d'organiser vos fichiers de configuration Nginx comme suit :

  • nginx.conf : Configuration principale, inclut conf.d/*.conf et sites-enabled/*.
  • conf.d/ : Paramètres généraux au niveau du serveur (par exemple, Gzip, mise en cache).
  • snippets/ : Morceaux de configuration Nginx réutilisables (par exemple, paramètres SSL, blocs location courants).
  • sites-available/ : Blocs server individuels pour chaque site web.
  • sites-enabled/ : Liens symboliques vers les configurations actives dans sites-available/.

Dépannage des Problèmes Courants

  • Erreur 403 Forbidden (Accès Refusé) : Cela signifie généralement que Nginx n'a pas les droits de lecture sur les fichiers ou répertoires de votre site web. Vérifiez les permissions des fichiers et des répertoires (par exemple, sudo chmod -R 755 /var/www/votre-domaine.com/html et assurez-vous que l'utilisateur Nginx, généralement www-data ou nginx, peut les lire).
  • Erreur 404 Not Found (Non trouvé) : Vérifiez que la directive root dans votre bloc de serveur pointe vers le répertoire correct et que votre fichier index.html existe à cet emplacement. Assurez-vous également que try_files est correctement configuré.
  • Le Mauvais Site se Charge : Cela indique souvent un problème avec la directive server_name. Assurez-vous que le server_name correspond exactement au nom de domaine que vous essayez d'accéder (y compris www. ou les sous-domaines). Vérifiez également vos enregistrements DNS.
  • Nginx n'arrive pas à démarrer/recharger : Utilisez toujours sudo nginx -t pour tester votre configuration avant d'essayer de recharger ou de redémarrer Nginx. Les messages d'erreur indiqueront la ligne et le fichier où l'erreur de syntaxe s'est produite.
  • Problèmes DNS : Si vous pouvez accéder à votre site par adresse IP mais pas par nom de domaine, c'est presque certainement un problème DNS. Utilisez dig ou nslookup pour vérifier que les enregistrements A de votre domaine pointent vers la bonne adresse IP du serveur.

Conclusion

Les hôtes virtuels Nginx (blocs de serveur) offrent un moyen puissant et flexible d'héberger plusieurs sites web sur un seul serveur. En configurant correctement les blocs server avec les directives listen, server_name, root et location appropriées, vous pouvez gérer efficacement des propriétés web diverses. Cette approche non seulement conserve les ressources, mais centralise également l'administration du serveur.

Avec les connaissances fondamentales et les étapes pratiques décrites dans ce guide, vous êtes maintenant équipé pour configurer et gérer plusieurs domaines sur votre serveur Nginx. N'oubliez pas de toujours tester vos configurations, de sécuriser vos sites avec HTTPS et de suivre les meilleures pratiques en matière de journalisation et de structure de répertoire pour un environnement web robuste et maintenable. À partir de là, vous pouvez explorer davantage les capacités de Nginx telles que le proxy inverse, l'équilibrage de charge et la mise en cache pour améliorer les performances et la fiabilité de votre serveur web.