왜 nginx server_name 지시문의 최대 길이가 14 자입니까? index index.html; } 실행 nginx -s reload하면 다음 오류가

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

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 개의 가상 호스트 만 정의되어 있습니다)



답변

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

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

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

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

답변

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

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


답변