Por que 14 caracteres têm o comprimento máximo para a 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] could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32

O mesmo acontece com qualquer server_name que tenha 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 foi definido antes):

server_names_hash_bucket_size 64;

A configuração para 33 também funcionou, mas não 32.

Por que o tamanho máximo padrão é 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 intervalo de hash? (existem apenas 4 hosts virtuais definidos no sistema)

    
por Virgiliu 06.01.2015 / 00:29

2 respostas

11

Este erro ocorre quando o server_name é grande demais para caber no hash .

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 os erros de cache da CPU , já que server_name s deve ser olhei para cima em todos os pedidos.

Por que você está limitado a 14 caracteres em vez dos 31 esperados, suspeito de uma das duas possibilidades:

  • Seu arquivo de configuração está em codificação UTF-16 (ou alguma outra codificação) em vez de UTF-8, o que faz com que os valores nulos apareçam antes ou depois de cada caractere nos dados brutos e dupliquem seu tamanho. Isso pode acontecer se você editar o arquivo no Windows. Se esse for o caso, use algo como iconv para corrigi-lo.
  • Você encontrou um bug desconhecido no nginx.
por 06.01.2015 / 00:43
6

O comprimento padrão deve ser determinado automaticamente durante o início, dependendo dos nomes de servidor usados, mas isso também deve ser atualizado durante uma operação reload . Veja se funciona sem definir manualmente o tamanho do intervalo, mas com um reinício em vez de um recarregamento.

Consulte o link para saber como os tamanhos de hash são determinados e link para ler sobre hashes usados para nomes de servidores.

    
por 06.01.2015 / 00:37