Wie behebt man den Nginx-Fehler "[emerg] could not build the server_names_hash, you should increase server_names_hash_bucket_size"?

Veröffentlicht 13. Oktober 2024

Problem: Nginx Server Names Hash Fehler

Der "[emerg] could not build the server_names_hash" Fehler in Nginx tritt auf, wenn der Server nicht genügend Speicher für die Hash-Tabelle zuweisen kann, die die Servernamen speichert. Dieses Problem tritt häufig auf, wenn es zu viele oder sehr lange Servernamen in der Nginx-Konfiguration gibt.

Lösung des Nginx Server Names Hash Problems

Erhöhung des server_names_hash_bucket_size

Um den Server Names Hash Fehler in Nginx zu beheben, müssen Sie den Wert von server_names_hash_bucket_size erhöhen. Hier ist die Vorgehensweise:

  1. Öffnen Sie Ihre Nginx-Konfigurationsdatei:

    sudo nano /etc/nginx/nginx.conf
  2. Suchen Sie den http-Block und fügen Sie diese Zeile hinzu oder ändern Sie sie:

    server_names_hash_bucket_size 64;
  3. Wenn der Fehler weiterhin auftritt, versuchen Sie den Wert auf 128 oder die nächste Zweierpotenz zu erhöhen.

  4. Speichern Sie die Datei und verlassen Sie den Texteditor.

  5. Testen Sie die neue Konfiguration:

    sudo nginx -t
  6. Wenn der Test erfolgreich ist, starten Sie Nginx neu:

    sudo systemctl restart nginx

Der empfohlene Startwert für server_names_hash_bucket_size ist 64. Je nach Ihrer Konfiguration müssen Sie diesen Wert möglicherweise anpassen. Bei vielen Servernamen oder langen Domainnamen kann eine weitere Erhöhung erforderlich sein.

Testen Sie nach Änderungen immer Ihre Konfiguration, bevor Sie Nginx neu starten. Dies hilft, Ausfallzeiten durch Konfigurationsfehler zu vermeiden.

Tipp: Optimieren Sie server_names_hash_max_size

Wenn die Erhöhung von server_names_hash_bucket_size das Problem nicht löst, müssen Sie möglicherweise auch server_names_hash_max_size anpassen. Fügen Sie diese Zeile zu Ihrem http-Block hinzu:

server_names_hash_max_size 512;

Dieser Wert sollte erhöht werden, wenn Sie eine große Anzahl von Servernamen haben. Beginnen Sie mit 512 und erhöhen Sie nach Bedarf.

Alternative Lösungen für Nginx Servernamen-Probleme

Optimierung der Server-Block-Konfigurationen

Um Ihre Nginx Server-Block-Konfigurationen zu verbessern, versuchen Sie Folgendes:

  1. Gruppieren Sie ähnliche Servernamen: Kombinieren Sie Server-Blöcke mit ähnlichen Konfigurationen, um die Anzahl separater Blöcke zu reduzieren.

  2. Verwenden Sie Location-Blöcke: Nutzen Sie Location-Blöcke, um spezifische URL-Muster zu verarbeiten und so die Notwendigkeit mehrerer Server-Blöcke zu reduzieren.

  3. Entfernen Sie ungenutzte Servernamen: Löschen Sie alle nicht mehr verwendeten Servernamen, um die Größe der Hash-Tabelle zu minimieren.

  4. Verwenden Sie kürzere Servernamen: Wenn möglich, nutzen Sie kürzere Domainnamen, um die Gesamtlänge der Servernamen zu reduzieren.

  5. Implementieren Sie Servernamen-Aliase: Verwenden Sie server_name-Direktiven mit mehreren Domainnamen, um Variationen derselben Website zu verarbeiten.

Tipp: Verwenden Sie reguläre Ausdrücke für Servernamen

Nutzen Sie reguläre Ausdrücke in Ihrer server_name-Direktive, um mehrere Domains mit einer einzigen Regel abzudecken. Zum Beispiel:

server_name ~^(www\.)?example\.(com|org|net)$;

Dies passt auf example.com, www.example.com, example.org, www.example.org, example.net und www.example.net.

Verwendung von Wildcard-Servernamen

Wildcard-Servernamen in Nginx ermöglichen es Ihnen, mehrere Subdomains mit einem einzigen Server-Block abzudecken. Dies kann die Anzahl der Server-Blöcke reduzieren und Ihre Konfiguration vereinfachen.

So implementieren Sie Wildcard-Servernamen in Nginx:

  1. Öffnen Sie Ihre Nginx-Konfigurationsdatei:

    sudo nano /etc/nginx/nginx.conf
  2. Fügen Sie einen Server-Block mit einem Wildcard-Servernamen hinzu:

    server {
       listen 80;
       server_name *.example.com;
       # Weitere Konfigurationsanweisungen
    }
  3. Sie können auch spezifischere Wildcard-Muster verwenden:

    server_name www.*.example.com;
    server_name *.example.*;
  4. Speichern Sie die Datei und verlassen Sie den Texteditor.

  5. Testen Sie die neue Konfiguration:

    sudo nginx -t
  6. Wenn der Test erfolgreich ist, starten Sie Nginx neu:

    sudo systemctl restart nginx