¿Por qué es 14 caracteres la longitud máxima para la directiva nginx server_name?

13

Tengo el siguiente host virtual

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

Cuando ejecuto nginx -s reloadme sale el siguiente error:

nginx: [emerg] no pudo construir el server_names_hash, debería aumentar server_names_hash_bucket_size: 32

Lo mismo sucede con cualquier nombre_servidor que tenga 15 o más caracteres.

Si configuro server_name en ab.example.com(o cualquier nombre con menos de 15 caracteres) el problema deja de manifestarse.

Para solucionar esto, agregué lo siguiente a /etc/nginx/nginx.conf(no estaba definido antes):

server_names_hash_bucket_size 64;

Establecerlo en 33 también funcionó, pero no en 32.

¿Por qué la longitud máxima predeterminada es de 14 caracteres para server_name?

¿Es este límite impuesto por la configuración predeterminada de nginx o por el sistema en el que se ejecuta?

¿Cómo afecta un server_name de 15 al tamaño máximo del depósito de hash? (solo hay 4 hosts virtuales definidos en el sistema)

Virgiliu
fuente
¿Cuál es el contenido 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

Respuestas:

11

Este error ocurre cuando server_namees demasiado grande para caber en el depósito de hash .

El valor predeterminado para server_names_hash_bucket_sizese elige según el tamaño de línea de caché de la CPU del servidor. En particular, está destinado a ser lo más pequeño posible, para reducir las fallas de caché de la CPU , ya server_nameque se debe buscar s en cada solicitud.

En cuanto a por qué estás limitado a 14 caracteres en lugar de los 31 esperados, sospecho que hay una de dos posibilidades:

  • Su archivo de configuración está en codificación UTF-16 (o alguna otra codificación) en lugar de UTF-8, lo que hace que aparezcan nulos antes o después de cada carácter en los datos sin procesar, y duplica su tamaño. Esto podría suceder si edita el archivo en Windows. Si este es el caso, usar algo como iconvpara solucionarlo.
  • Te has encontrado con un error desconocido en nginx.
Michael Hampton
fuente
Vim dice que fileencoding = utf-8. Hice una conversión usando iconv para asegurarme de que la codificación sea UTF8 pero nada cambió en el comportamiento de nginx. Tal vez mi VPS tiene una CPU con un tamaño de línea de caché muy pequeño, ¿hay alguna forma de verificarlo y cuál sería un valor razonable para él?
Virgiliu
El valor razonable es la potencia más pequeña de dos con la que nginx se iniciará con éxito. Si tiene un VPS, podría estar haciendo casi cualquier cosa ...
Michael Hampton
6

La longitud predeterminada debe determinarse automáticamente durante el inicio, dependiendo de los nombres de servidor usados, pero esto también debe actualizarse durante una reloadoperación. Vea si funciona sin configurar manualmente el tamaño del depósito pero con un reinicio en lugar de una recarga.

Consulte http://nginx.org/en/docs/hash.html para saber cómo se determinan los tamaños de hash y http://nginx.org/en/docs/http/server_names.html para leer acerca de los hash utilizados para los nombres de servidores.

Sven
fuente