Perché 14 caratteri è la lunghezza massima per la direttiva ngin server_name?


13

Ho il seguente host virtuale

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

Durante l'esecuzione nginx -s reloadottengo il seguente errore:

nginx: [emerg] non è stato possibile creare server_names_hash, è necessario aumentare server_names_hash_bucket_size: 32

Lo stesso accade per qualsiasi nome_server che ha 15 o più caratteri.

Se imposto server_name su ab.example.com(o qualsiasi nome con meno di 15 caratteri) il problema smette di manifestarsi.

Per risolvere questo problema, ho aggiunto quanto segue /etc/nginx/nginx.conf(non era stato definito prima):

server_names_hash_bucket_size 64;

Anche l'impostazione su 33 ha funzionato, ma non 32.

Perché la lunghezza massima predefinita è di 14 caratteri per nome_server?

Questo limite è imposto dalle impostazioni predefinite di nginx o dal sistema su cui gira?

In che modo un nome_server di 15 influisce sulla dimensione massima del bucket hash? (ci sono solo 4 host virtuali definiti sul sistema)


Qual è il contenuto di 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,

Risposte:


11

Questo errore si verifica quando server_nameè troppo grande per rientrare nel bucket hash .

L'impostazione predefinita per server_names_hash_bucket_sizeviene scelta in base alla dimensione della riga della cache della CPU del server. In particolare, è pensato per essere il più piccolo possibile, per ridurre gli errori della cache della CPU , come server_nameè necessario cercare su ogni richiesta.

Per quanto riguarda il motivo per cui sei limitato a 14 caratteri invece dei 31 previsti, sospetto una delle due possibilità:

  • Il tuo file di configurazione è in codifica UTF-16 (o in qualche altra codifica) invece di UTF-8, il che fa apparire i null prima o dopo ogni carattere nei dati grezzi e raddoppiando le sue dimensioni. Ciò potrebbe accadere se si modifica il file su Windows. In questo caso, utilizzare qualcosa di simile iconvper risolverlo.
  • Hai riscontrato un bug sconosciuto in nginx.

Vim afferma che fileencoding = utf-8. Ho fatto una conversione usando iconv per assicurarmi che la codifica fosse UTF8 ma nulla è cambiato nel comportamento di nginx. Forse il mio VPS ha una CPU con una dimensione della linea della cache molto piccola, c'è un modo per controllarlo e quale sarebbe un valore ragionevole per esso?
Virgiliu,

Il valore ragionevole è il potere più piccolo di due con cui nginx si avvierà con successo. Se hai un VPS potrebbe fare qualsiasi cosa ...
Michael Hampton

6

La lunghezza predefinita dovrebbe essere determinata automaticamente durante l'avvio, in base ai nomi dei server utilizzati, ma anche questa dovrebbe essere aggiornata durante reloadun'operazione. Verifica se funziona senza impostare manualmente le dimensioni del bucket ma con un riavvio anziché un ricaricamento.

Consulta http://nginx.org/en/docs/hash.html per sapere come vengono determinate le dimensioni dell'hash e http://nginx.org/en/docs/http/server_names.html per leggere gli hash utilizzati per i nomi dei server.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.