왜 nginx server_name 지시문의 최대 길이가 14 자입니까?


13

다음 가상 호스트가 있습니다

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

실행 nginx -s reload하면 다음 오류가 발생합니다.

nginx : [emerg]가 server_names_hash를 빌드 할 수 없습니다. server_names_hash_bucket_size를 늘려야합니다. 32

15 자 이상의 문자를 가진 server_name에 대해서도 마찬가지입니다.

server_name ab.example.com(또는 15 자 미만의 이름)을 설정하면 문제가 중지됩니다.

이 문제를 해결하기 위해 다음을 추가했습니다 /etc/nginx/nginx.conf(이전에 정의되지 않았습니다).

server_names_hash_bucket_size 64;

33으로 설정해도 32는 작동하지 않았습니다.

server_name의 기본 최대 길이가 14자인 이유는 무엇입니까?

이 제한은 nginx의 기본 설정 또는 실행되는 시스템에 의해 부과됩니까?

server_name 15는 최대 해시 버킷 크기에 어떤 영향을 줍니까? (시스템에는 4 개의 가상 호스트 만 정의되어 있습니다)


내용은 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

답변:


11

(가) 할 때이 오류가 발생합니다 server_name입니다 해시 버킷에 맞게 너무 커서 .

server_names_hash_bucket_size서버의 CPU 캐시 라인 크기에 따라 기본값 이 선택됩니다. 특히 가능한 한 작게 될 운명이야 CPU의 캐시 미스를 줄일server_name의 모든 요청에 고개를해야합니다.

예상 한 31 대신 14 자로 제한되는 이유는 두 가지 가능성 중 하나입니다.

  • 구성 파일은 UTF-8 대신 UTF-16 인코딩 (또는 다른 인코딩)으로되어있어 원시 데이터의 모든 문자 앞뒤에 널이 나타나고 크기가 두 배가됩니다. Windows에서 파일을 편집하면 이런 일이 발생할 수 있습니다. 이 경우 iconv문제를 해결하는 것과 같은 것을 사용하십시오.
  • nginx에서 알 수없는 버그가 발생했습니다.

Vim은 fileencoding = utf-8이라고 말합니다. iconv를 사용하여 인코딩이 UTF8인지 확인하기 위해 변환했지만 nginx 동작에서 아무것도 변경되지 않았습니다. 어쩌면 내 VPS에 캐시 라인 크기가 매우 작은 CPU가있을 수 있습니다. 확인할 수있는 방법이 있으며 합리적인 가치는 무엇입니까?
Virgiliu

합리적인 가치는 nginx가 성공적으로 시작하는 2의 최소 제곱입니다. VPS를 가지고 있다면 무엇이든 할 수 있습니다.
Michael Hampton

6

기본 길이는 사용중인 서버 이름에 따라 시작하는 동안 자동으로 결정되어야하지만 reload작업 중에도 업데이트되어야 합니다. 버킷 크기를 수동으로 설정하지 않고 재로드 대신 다시 시작하여 작동하는지 확인하십시오.

참조 http://nginx.org/en/docs/hash.html를 해시 크기를 결정하고 방법을 배우고 http://nginx.org/en/docs/http/server_names.html를 서버 이름에 사용되는 해시에 대해 읽을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.