Por que 14 caracteres têm o tamanho máximo da diretiva nginx server_name?

13

Eu tenho o seguinte host virtual

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

Ao executar nginx -s reload, recebo o seguinte erro:

nginx: [emerg] não pôde criar o server_names_hash, você deve aumentar server_names_hash_bucket_size: 32

O mesmo acontece com qualquer nome_do_servidor que possui 15 ou mais caracteres.

Se eu definir o server_name como ab.example.com(ou qualquer nome com menos de 15 caracteres), o problema deixará de se manifestar.

Para corrigir isso, adicionei o seguinte a /etc/nginx/nginx.conf(não estava definido antes):

server_names_hash_bucket_size 64;

Configurá-lo para 33 também funcionou, mas não para 32.

Por que o comprimento máximo padrão de 14 caracteres para server_name?

Esse limite é imposto pelas configurações padrão do nginx ou pelo sistema em que ele é executado?

Como um server_name de 15 afeta o tamanho máximo do bucket de hash? (existem apenas 4 hosts virtuais definidos no sistema)

Virgiliu
fonte
Qual é o conteúdo 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

Respostas:

11

Este erro ocorre quando o tamanhoserver_name é muito grande para caber no hash bucket .

O padrão para server_names_hash_bucket_sizeé escolhido dependendo do tamanho da linha de cache da CPU do servidor. Em particular, ele deve ser o menor possível, para reduzir as falhas no cache da CPU , pois server_nameé necessário procurar s em todas as solicitações.

Quanto ao motivo de você estar limitado a 14 caracteres em vez dos 31 esperados, suspeito de uma das duas possibilidades:

  • Seu arquivo de configuração está na codificação UTF-16 (ou alguma outra codificação) em vez de UTF-8, que faz com que nulos apareçam antes ou depois de cada caractere nos dados brutos e dobrando seu tamanho. Isso pode acontecer se você editar o arquivo no Windows. Se for esse o caso, use algo parecido iconvpara corrigi-lo.
  • Você encontrou um bug desconhecido no nginx.
Michael Hampton
fonte
Vim diz que fileencoding = utf-8. Fiz uma conversão usando o iconv para garantir que a codificação seja UTF8, mas nada mudou no comportamento do nginx. Talvez meu VPS tenha uma CPU com um tamanho de linha de cache muito pequeno. Existe alguma maneira de verificá-lo e qual seria um valor razoável para ele?
Virgiliu
O valor razoável é a menor potência de duas com a qual o nginx será iniciado com êxito. Se você tem um VPS, ele pode estar fazendo praticamente qualquer coisa ...
Michael Hampton
6

O comprimento padrão deve ser determinado automaticamente durante o início, dependendo dos nomes dos servidores usados, mas isso também deve ser atualizado durante uma reloadoperação. Veja se funciona sem definir manualmente o tamanho do balde, mas reiniciando em vez de recarregar.

Consulte http://nginx.org/en/docs/hash.html para saber como os tamanhos de hash são determinados e http://nginx.org/en/docs/http/server_names.html para ler sobre os hashes usados ​​para nomes de servidores.

Sven
fonte