Pourquoi la longueur maximale de 14 caractères pour la directive nginx nom_serveur?

13

J'ai l'hôte virtuel suivant

server
{
  server_name abc.example.com;
  root /var/www/test/;
  index index.html;
}

Lors de l'exécution, nginx -s reloadj'obtiens l'erreur suivante:

nginx: [Emerg] n'a pas pu construire le server_names_hash, vous devez augmenter server_names_hash_bucket_size: 32

Il en va de même pour tout nom_serveur comportant 15 caractères ou plus.

Si je mets le nom_serveur ab.example.com(ou tout nom de moins de 15 caractères), le problème cesse de se manifester.

Pour résoudre ce problème, j'ai ajouté ce qui suit /etc/nginx/nginx.conf(il n'a pas été défini auparavant):

server_names_hash_bucket_size 64;

La définition de 33 a également fonctionné, mais pas 32.

Pourquoi la longueur maximale par défaut est-elle de 14 caractères pour nom_serveur?

Cette limite est-elle imposée par les paramètres par défaut de nginx ou par le système sur lequel il fonctionne?

Comment un nom_serveur de 15 affecte-t-il la taille maximale du compartiment de hachage? (il n'y a que 4 hôtes virtuels définis sur le système)

Virgiliu
la source
Quel est le contenu de grep "" /sys/devices/system/cpu/cpu?/cache/index?/coherency_line_size?
Xavier Lucas
@XavierLucas:/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size:64 /sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size:64 /sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size:64
Virgiliu

Réponses:

11

Cette erreur se produit lorsque le server_nameest trop grand pour tenir dans le compartiment de hachage .

La valeur par défaut pour server_names_hash_bucket_sizeest choisie en fonction de la taille de la ligne de cache du processeur du serveur. En particulier, il est censé être aussi petit que possible, pour réduire les erreurs de cache du processeur , car server_names doit être recherché à chaque demande.

Quant à savoir pourquoi vous êtes limité à 14 caractères au lieu des 31 attendus, je soupçonne l'une des deux possibilités:

  • Votre fichier de configuration est en encodage UTF-16 (ou un autre encodage) au lieu d'UTF-8, ce qui fait apparaître des valeurs nulles avant ou après chaque caractère dans les données brutes, et en doublant sa taille. Cela peut se produire si vous modifiez le fichier sous Windows. Si tel est le cas, utilisez quelque chose comme iconvpour le réparer.
  • Vous avez rencontré un bogue inconnu dans nginx.
Michael Hampton
la source
Vim dit que fileencoding = utf-8. J'ai fait une conversion en utilisant iconv pour m'assurer que l'encodage est UTF8 mais rien n'a changé dans le comportement de nginx. Peut-être que mon VPS a un processeur avec une très petite taille de ligne de cache, y a-t-il un moyen de le vérifier et quelle serait une valeur raisonnable pour cela?
Virgiliu
La valeur raisonnable est la plus petite puissance de deux avec laquelle nginx démarrera avec succès. Si vous avez un VPS, cela pourrait faire à peu près n'importe quoi ...
Michael Hampton
6

La longueur par défaut doit être déterminée automatiquement au démarrage, en fonction des noms de serveur utilisés, mais elle doit également être mise à jour lors d'une reloadopération. Vérifiez si cela fonctionne sans définir manuellement la taille du compartiment mais avec un redémarrage au lieu d'un rechargement.

Voir http://nginx.org/en/docs/hash.html pour savoir comment les tailles de hachage sont déterminées et http://nginx.org/en/docs/http/server_names.html pour en savoir plus sur les hachages utilisés pour les noms de serveur.

Sven
la source