Warum ist die maximale Länge für die Anweisung nginx server_name 14 Zeichen?

13

Ich habe den folgenden virtuellen Host

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

Beim Laufen nginx -s reloadbekomme ich folgende Fehlermeldung:

nginx: [emerg] konnte den server_names_hash nicht erstellen. Sie sollten den server_names_hash_bucket_size: 32 erhöhen

Gleiches gilt für jeden Servernamen mit 15 oder mehr Zeichen.

Wenn ich den Servernamen auf ab.example.com(oder einen beliebigen Namen unter 15 Zeichen) setze, tritt das Problem nicht mehr auf.

Um dies zu beheben, habe ich Folgendes hinzugefügt /etc/nginx/nginx.conf(es wurde vorher nicht definiert):

server_names_hash_bucket_size 64;

Die Einstellung auf 33 hat auch funktioniert, aber nicht auf 32.

Warum beträgt die Standardlänge für Servername maximal 14 Zeichen?

Wird dieses Limit durch die Standardeinstellungen von nginx oder durch das System vorgegeben, auf dem es ausgeführt wird?

Wie wirkt sich ein Servername von 15 auf die maximale Hash-Bucket-Größe aus? (Auf dem System sind nur 4 virtuelle Hosts definiert.)

Virgiliu
quelle
Was ist der Inhalt von 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

Antworten:

11

Dieser Fehler tritt auf, wenn das server_nameist zu groß in den Hash - Behältern zu passen .

Der Standardwert für server_names_hash_bucket_sizewird in Abhängigkeit von der CPU-Cache-Zeilengröße des Servers ausgewählt. Insbesondere soll es so klein wie möglich sein, um CPU-Cache-Ausfälle zu reduzieren , da server_names bei jeder Anfrage nachgeschlagen werden muss.

Ich vermute eine von zwei Möglichkeiten, warum Sie auf 14 statt der erwarteten 31 Zeichen beschränkt sind:

  • Ihre Konfigurationsdatei hat UTF-16-Codierung (oder eine andere Codierung) anstelle von UTF-8, wodurch vor oder nach jedem Zeichen in den Rohdaten Nullen angezeigt werden und die Größe verdoppelt wird. Dies kann passieren, wenn Sie die Datei unter Windows bearbeiten. Wenn dies der Fall ist, verwenden Sie etwas iconv, um es zu beheben.
  • In Nginx ist ein unbekannter Fehler aufgetreten.
Michael Hampton
quelle
Vim sagt, dass fileencoding = utf-8 ist. Ich habe eine Konvertierung mit iconv durchgeführt, um sicherzustellen, dass die Codierung UTF8 ist, aber nichts am Verhalten von nginx geändert wurde. Vielleicht hat mein VPS eine CPU mit einer sehr kleinen Cache-Zeilengröße. Kann ich das irgendwie überprüfen und was wäre ein vernünftiger Wert dafür?
Virgiliu
Der angemessene Wert ist die kleinste Zweierpotenz, mit der Nginx erfolgreich gestartet wird. Wenn Sie ein VPS haben, könnte es fast alles tun ...
Michael Hampton
6

Die Standardlänge sollte beim Start automatisch festgelegt werden, abhängig von den verwendeten Servernamen, dies sollte jedoch auch während eines reloadVorgangs aktualisiert werden. Überprüfen Sie, ob dies funktioniert, ohne die Bucket-Größe manuell festzulegen, jedoch mit einem Neustart anstelle eines erneuten Ladens.

Unter http://nginx.org/en/docs/hash.html erfahren Sie, wie Hash-Größen ermittelt werden, und unter http://nginx.org/en/docs/http/server_names.html, wie Hashes für Servernamen verwendet werden.

Sven
quelle