Dlaczego maksymalna długość 14 znaków w dyrektywie nazwa_serwera nginx?

13

Mam następujący wirtualny host

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

Podczas działania nginx -s reloadpojawia się następujący błąd:

nginx: [emerg] nie mógł zbudować server_names_hash, powinieneś zwiększyć server_names_hash_bucket_size: 32

To samo dzieje się z dowolną nazwą serwera, która ma 15 lub więcej znaków.

Jeśli ustawię nazwę serwera na ab.example.com(lub dowolną nazwę poniżej 15 znaków), problem przestanie się pojawiać.

Aby to naprawić, dodałem następujące elementy /etc/nginx/nginx.conf(nie było to wcześniej zdefiniowane):

server_names_hash_bucket_size 64;

Ustawienie na 33 również działało, ale nie 32.

Dlaczego domyślna maksymalna długość to 14 znaków dla nazwa_serwera?

Czy ten limit jest narzucony przez domyślne ustawienia nginx czy przez system, na którym działa?

Jak nazwa_serwera 15 wpływa na maksymalny rozmiar segmentu mieszania? (w systemie są zdefiniowane tylko 4 wirtualne hosty)

Virgiliu
źródło
Jaka jest zawartość 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

Odpowiedzi:

11

Ten błąd występuje, gdy wartość server_namejest zbyt duża, aby zmieścić się w segmencie mieszania .

Domyślna wartość server_names_hash_bucket_sizejest wybierana w zależności od rozmiaru linii pamięci podręcznej procesora na serwerze. W szczególności ma on być tak mały, jak to możliwe, aby zmniejszyć liczbę braków pamięci podręcznej procesora , ponieważ server_namenależy sprawdzać s na każde żądanie.

Jeśli chodzi o to, dlaczego jesteś ograniczony do 14 znaków zamiast oczekiwanych 31, podejrzewam jedną z dwóch możliwości:

  • Twój plik konfiguracyjny ma kodowanie UTF-16 (lub inne kodowanie) zamiast UTF-8, co powoduje, że wartości zerowe pojawiają się przed lub po każdym znaku w surowych danych i podwajają jego rozmiar. Może się to zdarzyć, jeśli edytujesz plik w systemie Windows. W takim przypadku użyj czegoś takiego, iconvaby to naprawić.
  • W nginx napotkałeś nieznany błąd.
Michael Hampton
źródło
Vim mówi, że fileencoding = utf-8. Zrobiłem konwersję przy użyciu iconv, aby upewnić się, że kodowanie to UTF8, ale nic się nie zmieniło w zachowaniu nginx. Może mój VPS ma procesor o bardzo małym rozmiarze linii pamięci podręcznej, czy jest jakiś sposób, żeby to sprawdzić i jaka byłaby dla niego rozsądna wartość?
Virgiliu,
Rozsądną wartością jest najmniejsza z dwóch potęg, z którą nginx z powodzeniem uruchomi się. Jeśli masz VPS, może to robić prawie wszystko ...
Michael Hampton
6

Domyślna długość powinna być automatycznie ustalana podczas uruchamiania, w zależności od używanych nazw serwerów, ale należy ją również aktualizować podczas reloadoperacji. Sprawdź, czy działa bez ręcznego ustawiania rozmiaru segmentu, ale z restartem zamiast przeładowania.

Zobacz http://nginx.org/en/docs/hash.html, aby dowiedzieć się, jak określa się rozmiary skrótów, i http://nginx.org/en/docs/http/server_names.html, aby przeczytać o skrótach używanych dla nazw serwerów.

Sven
źródło