Come risolvere l'errore Nginx "[emerg] could not build the server_names_hash, you should increase server_names_hash_bucket_size"?

Pubblicato 13 ottobre 2024

Problema: Errore Hash dei Nomi Server Nginx

L'errore "[emerg] could not build the server_names_hash" in Nginx si verifica quando il server non riesce ad allocare abbastanza memoria per la tabella hash che memorizza i nomi dei server. Questo problema si presenta solitamente quando ci sono troppi nomi server o nomi server molto lunghi nella configurazione di Nginx.

Risolvere il Problema dell'Hash dei Nomi Server Nginx

Aumentare il server_names_hash_bucket_size

Per risolvere l'errore dell'hash dei nomi server in Nginx, è necessario aumentare il valore di server_names_hash_bucket_size. Ecco come fare:

  1. Apri il file di configurazione di Nginx:

    sudo nano /etc/nginx/nginx.conf
  2. Trova il blocco http e aggiungi o modifica questa riga:

    server_names_hash_bucket_size 64;
  3. Se l'errore persiste, prova ad aumentare il valore a 128 o alla successiva potenza di due.

  4. Salva il file ed esci dall'editor di testo.

  5. Testa la nuova configurazione:

    sudo nginx -t
  6. Se il test passa, riavvia Nginx:

    sudo systemctl restart nginx

Il valore iniziale consigliato per server_names_hash_bucket_size è 64. Potrebbe essere necessario regolarlo in base alla tua configurazione. Se hai molti nomi server o nomi di dominio lunghi, potrebbe essere necessario aumentarlo ulteriormente.

Dopo aver apportato modifiche, testa sempre la configurazione prima di riavviare Nginx. Questo aiuta a prevenire interruzioni causate da errori di configurazione.

Suggerimento: Ottimizza server_names_hash_max_size

Se l'aumento di server_names_hash_bucket_size non risolve il problema, potrebbe essere necessario regolare anche server_names_hash_max_size. Aggiungi questa riga al tuo blocco http:

server_names_hash_max_size 512;

Questo valore dovrebbe essere aumentato se hai un gran numero di nomi server. Inizia con 512 e aumenta secondo necessità.

Soluzioni Alternative per Problemi con i Nomi Server Nginx

Ottimizzare le configurazioni dei blocchi server

Per migliorare le configurazioni dei blocchi server di Nginx, prova questi suggerimenti:

  1. Raggruppa nomi server simili: Combina blocchi server con configurazioni simili per ridurre il numero di blocchi separati.

  2. Usa i blocchi location: Utilizza i blocchi location per gestire specifici pattern URL, riducendo la necessità di multipli blocchi server.

  3. Rimuovi i nomi server inutilizzati: Elimina i nomi server che non usi più per minimizzare la dimensione della tabella hash.

  4. Usa nomi server più corti: Quando possibile, usa nomi di dominio più brevi per ridurre la lunghezza complessiva dei nomi server.

  5. Implementa alias per i nomi server: Usa direttive server_name con più nomi di dominio per gestire variazioni dello stesso sito.

Suggerimento: Usa Espressioni Regolari per i Nomi Server

Utilizza espressioni regolari nella tua direttiva server_name per far corrispondere più domini con una singola regola. Ad esempio:

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

Questo corrisponde a example.com, www.example.com, example.org, www.example.org, example.net e www.example.net.

Usare nomi server con wildcard

I nomi server con wildcard in Nginx ti permettono di far corrispondere più sottodomini con un singolo blocco server. Questo può aiutare a ridurre il numero di blocchi server e semplificare la tua configurazione.

Per implementare nomi server con wildcard in Nginx:

  1. Apri il file di configurazione di Nginx:

    sudo nano /etc/nginx/nginx.conf
  2. Aggiungi un blocco server con un nome server wildcard:

    server {
       listen 80;
       server_name *.example.com;
       # Altre direttive di configurazione
    }
  3. Puoi anche usare pattern wildcard più specifici:

    server_name www.*.example.com;
    server_name *.example.*;
  4. Salva il file ed esci dall'editor di testo.

  5. Testa la nuova configurazione:

    sudo nginx -t
  6. Se il test passa, riavvia Nginx:

    sudo systemctl restart nginx