Problème : Erreur de hachage des noms de serveur Nginx
L'erreur "[emerg] could not build the server_names_hash" dans Nginx se produit lorsque le serveur ne peut pas allouer suffisamment de mémoire pour la table de hachage qui stocke les noms de serveur. Ce problème survient généralement lorsqu'il y a trop de noms de serveur ou des noms de serveur très longs dans la configuration Nginx.
Résolution du problème de hachage des noms de serveur Nginx
Augmentation de server_names_hash_bucket_size
Pour résoudre l'erreur de hachage des noms de serveur dans Nginx, vous devez augmenter la valeur de server_names_hash_bucket_size. Voici comment procéder :
-
Ouvrez votre fichier de configuration Nginx :
sudo nano /etc/nginx/nginx.conf
-
Trouvez le bloc http et ajoutez ou modifiez cette ligne :
server_names_hash_bucket_size 64;
-
Si l'erreur persiste, essayez d'augmenter la valeur à 128 ou à la puissance de deux suivante.
-
Sauvegardez le fichier et quittez l'éditeur de texte.
-
Testez la nouvelle configuration :
sudo nginx -t
-
Si le test réussit, redémarrez Nginx :
sudo systemctl restart nginx
La valeur de départ suggérée pour server_names_hash_bucket_size est 64. Vous devrez peut-être l'ajuster en fonction de votre configuration. Si vous avez de nombreux noms de serveur ou des noms de domaine longs, vous devrez peut-être l'augmenter davantage.
Après avoir apporté des modifications, testez toujours votre configuration avant de redémarrer Nginx. Cela permet d'éviter les temps d'arrêt causés par des erreurs de configuration.
Conseil: Optimiser server_names_hash_max_size
Si l'augmentation de server_names_hash_bucket_size ne résout pas le problème, vous devrez peut-être également ajuster server_names_hash_max_size. Ajoutez cette ligne à votre bloc http :
server_names_hash_max_size 512;
Cette valeur doit être augmentée si vous avez un grand nombre de noms de serveur. Commencez par 512 et augmentez selon les besoins.
Solutions alternatives pour les problèmes de noms de serveur Nginx
Optimisation des configurations de blocs serveur
Pour améliorer vos configurations de blocs serveur Nginx, essayez ces conseils :
-
Regroupez les noms de serveur similaires : Combinez les blocs serveur avec des configurations similaires pour réduire le nombre de blocs distincts.
-
Utilisez des blocs location : Utilisez des blocs location pour gérer des modèles d'URL spécifiques, réduisant ainsi le besoin de multiples blocs serveur.
-
Supprimez les noms de serveur inutilisés : Supprimez tous les noms de serveur que vous n'utilisez plus pour minimiser la taille de la table de hachage.
-
Utilisez des noms de serveur plus courts : Dans la mesure du possible, utilisez des noms de domaine plus courts pour réduire la longueur globale des noms de serveur.
-
Implémentez des alias de noms de serveur : Utilisez des directives server_name avec plusieurs noms de domaine pour gérer les variations d'un même site.
Conseil: Utiliser des expressions régulières pour les noms de serveur
Utilisez des expressions régulières dans votre directive server_name pour faire correspondre plusieurs domaines avec une seule règle. Par exemple :
server_name ~^(www\.)?example\.(com|org|net)$;
Cela correspond à example.com, www.example.com, example.org, www.example.org, example.net et www.example.net.
Utilisation de noms de serveur génériques
Les noms de serveur génériques dans Nginx vous permettent de faire correspondre plusieurs sous-domaines avec un seul bloc serveur. Cela peut aider à réduire le nombre de blocs serveur et à simplifier votre configuration.
Pour implémenter des noms de serveur génériques dans Nginx :
-
Ouvrez votre fichier de configuration Nginx :
sudo nano /etc/nginx/nginx.conf
-
Ajoutez un bloc serveur avec un nom de serveur générique :
server { listen 80; server_name *.example.com; # Autres directives de configuration }
-
Vous pouvez également utiliser des modèles génériques plus spécifiques :
server_name www.*.example.com; server_name *.example.*;
-
Sauvegardez le fichier et quittez l'éditeur de texte.
-
Testez la nouvelle configuration :
sudo nginx -t
-
Si le test réussit, redémarrez Nginx :
sudo systemctl restart nginx