Server names

서버 이름은 server_name 명령을 사용하여 정의되고 특정 요청에 어느 server 블록을 사용할지 결정합니다. “nginx에서 요청을 처리하는 방법”을 참조하세요. 정확한 이름, 와일드카드 이름 또는 정규식을 사용하여 정의할 수 있습니다.

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name *.example.org;
    ...
}

server {
    listen      80;
    server_name mail.*;
    ...
}

server {
    listen      80;
    server_name ~^(?<user>.+)\.example\.net$;
    ...
}

이름으로 가상 서버를 검색할 때 이름이 2개 이상의 지정된 변수와 일치할 경우(와일드카드 이름과 정규식이 모두 일치하는 경우) 다음과 같은 순서대로 처음 일치하는 변수가 선택됩니다.

  1. 정확한 이름
  2. *로 시작하는 가장 긴 와일드카드 이름(예: “*.example.org”)
  3. *로 시작하는 가장 긴 와일드카드 이름(예: “mail.*”)
  4. 처음 일치하는 정규식(구성 파일에 나열된 순서)

와일드카드 이름

와일드카드 이름에는 이름의 시작이나 끝에, 점 테두리에만 별표를 포함할 수 있습니다. “www.*.example.org” 및 “w*.example.org” 이름은 유효하지 않습니다. 그러나 이런 이름은 정규식을 사용하여 지정할 수 있습니다(예: “~^www\..+\.example\.org$”, “~^w.*\.example\.org$”). *는 여러 이름 부분과 일치할 수 있습니다. “*.example.org” 이름은 www.example.org뿐만 아니라 www.sub.example.org와도 일치합니다.

“.example.org” 형식의 특수한 와일드카드 이름은 정확한 이름인 “example.org”와 와일드카드 이름인 “*.example.org”와 모두 일치할 수 있습니다.

정규식 이름

nginx에서 사용하는 정규식은 Perl 프로그래밍 언어(PCRE)에서 사용하는 정규식과 호환됩니다. 정규식을 사용하려면 서버 이름이 틸데 문자로 시작해야 합니다.

server_name ~^www\d+\.example\.net$;

그렇지 않을 경우, 정확한 이름으로 처리됩니다. 정규식에 *가 포함되어 있을 경우 (아마 유효하지 않은) 와일드카드 이름으로 처리됩니다. “^” 및 “$” 앵커를 설정하는 것을 잊지 마세요. 구문적으로는 필수가 아니지만, 논리적으로는 필수입니다. 도메인 이름 점은 역슬래시로 이스케이프해야 합니다. “{” 및 “}” 문자를 포함한 정규식은 인용 부호 안에 넣어야 합니다.

server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";

그렇지 않으면 nginx가 시작되지 않고 오류 메시지가 표시됩니다.

directive "server_name" is not terminated by ";" in ...

이름이 지정된 정규식 캡처는 나중에 변수로 사용할 수 있습니다.

server {
    server_name    ~^(www\.)?(?<domain>.+)$;

    location / {
        root    /sites/$domain;
    }
}

PCRE 라이브러리는 다음의 구문을 사용하여 이름이 지정된 캡처를 지원합니다.

?<name>	        Perl 5.10 compatible syntax, supported since PCRE-7.0
?'name'	        Perl 5.10 compatible syntax, supported since PCRE-7.0
?P<name>	Python compatible syntax, supported since PCRE-4.0

nginx가 시작되지 않고 오류 메시지가 표시될 경우:

pcre_compile() failed: unrecognized character after (?< in ...)

즉, PCRE 라이브러리가 최신이 아니므로 대신 “?P<name>” 구문을 시도해야 합니다. 이 캡처는 디지털 형식으로도 사용할 수 있습니다.

server {
    server_name    ~^(www\.)?(.+)$;

    location / {
        root    /sites/$2;
    }
}

그러나 디지털 참조는 쉽게 덮어쓸 수 있으므로 (위와 같은) 간단한 사례로만 제한해야 합니다.

기타 이름

특수하게 처리되는 서버 이름이 몇 가지 있습니다.

server 블록에서 기본값 외에 “Host” 헤더 필드 없이 요청을 처리해야 할 경우, 빈 이름을 지정해야 합니다.

server {
    listen      80;
    server_name example.org www.example.org "";
    ...
}

server 블록에 server_name이 지정되어 있지 않을 경우, nginx는 빈 이름을 서버 이름으로 사용합니다.

이 경우, 0.8.48 이하의 nginx 버전은 장비의 호스트 이름을 서버 이름으로 사용합니다.

서버 이름을 “$hostname”으로 정의할 경우(0.9.4), 장비의 호스트 이름을 사용합니다.

서버 이름 대신 IP 주소를 사용하여 요청을 보낼 경우, “Host” 요청 헤더 필드에는 IP 주소가 포함되고 요청은 IP 주소를 서버 이름으로 사용하여 처리합니다.

server {
    listen      80;
    server_name example.org
                www.example.org
                ""
                192.168.1.1
                ;
    ...
}

캐치올 서버 예시에서는 “_”라는 낯선 이름을 볼 수 있습니다.

server {
    listen      80 default_server;
    server_name _;
    return      444;
}

특별한 이름은 아니고, 실제 이름과 전혀 접점이 없는 여러 가지 잘못된 도메인 이름 중 하나일 뿐입니다. “–”, “!@#”와 같은 다른 유효하지 않은 이름을 사용할 수 있습니다.

nginx는 0.6.25버전까지는 특수한 이름인 “*”를 사용했는데, 이는 캐치올 이름으로 잘못 해석되었습니다. 이 이름은 캐치올이나 와일드카드 서버 이름으로 작동하지 않습니다. 지금은 server_name_in_redirect 명령이 제공하는 기능을 제공했습니다. 특수한 이름인 “*”는 사용 중단되었으며, server_name_in_redirect 명령을 사용해야 합니다. 참고로 erver_name 명령을 사용해서 캐치올 이름이나 기본 서버를 지정할 수 없습니다. 이는 server_name 명령이 아니라 listen 명령의 속성입니다. “nginx에서 요청을 처리하는 방법”을 참조하세요. 포트 *:80과 *:8080을 수신하는 서버를 정의할 수 있으며, 한 개의 서버는 포트 *:8080에 대한 기본 서버로 삼고, 나머지 하나는 포트 *:80에 대한 기본 서버로 삼습니다.

server {
    listen      80;
    listen      8080 default_server;
    server_name example.net;
    ...
}

server {
    listen      80 default_server;
    listen      8080;
    server_name example.org;
    ...
}

 국제화된 이름

국제화된 도메인 이름(IDNs)은 server_name 명령에서 ASCII(Punycode) 표현을 사용하여 지정해야 합니다.

server {
    listen       80;
    server_name  xn--e1afmkfd.xn--80akhbyknj4f;  # пример.испытание
    ...
}

가상 서버 선택

먼저 연결은 기본 서버 컨텍스트에서 생성합니다. 서버 이름은 다음의 요청 처리 단계에서 결정되고, 각각 다음과 같은 서버 구성 선택에 포함됩니다.

  • SNI에 따라 사전에 SSL 핸드셰이크를 하는 도중
  • 요청 행을 처리한 이후
  • Host 헤더 필드를 처리한 이후
  • 요청 행을 처리하거나 Host 헤더 필드에서 서버 이름을 결정하지 못할 경우, nginx는 빈 이름을 서버 이름으로 사용합니다.

이 각각의 단계에서 서로 다른 서버 구성을 적용할 수 있습니다. 그러므로 일부 명령은 주의해서 지정해야 합니다.

  • ssl_protocols 명령의 경우, 프로토콜 목록을 OpenSSL 라이브러리에서 설정한 다음 서버 구성을 SNI를 통해 요청한 이름에 따라 지정할 수 있으므로 프로토콜은 기본 서버에 대해서만 지정해야 합니다.
  • client_header_buffer_size 및 merge_slashes 명령은 요청 행을 읽기 전에 실행되므로, 이러한 명령은 기본 서버 구성이나 SNI에서 선택한 서버 구성을 사용해야 합니다.
  • 요청 헤더 필드 처리에 사용하는 ignore_invalid_headerslarge_client_header_buffers, underscores_in_headers 명령의 경우, 요청 행이나 Host 헤더 필드에 따라 서버 구성을 업데이트하느냐에 따라 달라집니다.
  • 현재 요청을 실행하는 서버에서 error_page 명령으로 오류 응답이 처리됩니다.

최적화

정확한 이름, *로 시작하는 와일드카드 이름, *로 끝나는 와일드카드 이름은 리스닝 포트에 바인딩된 세 개의 해시 테이블에 저장됩니다. 해시 테이블의 용량은 구성 단계에서 최적화되므로 CPU 캐시 미스를 최소화하여 이름을 발견할 수 있습니다. 해시 테이블 설정에 대한 자세한 내용은 다른 문서에 나와 있습니다.

정확한 이름 해시 테이블을 먼저 검색합니다. 이름을 발견하지 못할 경우, *로 시작하는 와일드카드 이름이 있는 해시 테이블을 검색합니다. 여기에서 이름을 발견하지 못할 경우, *로 끝나는 와일드카드 이름이 있는 해시 테이블을 검색합니다.

와일드카드 이름 해시 테이블을 검색할 때는 도메인 부분에서 이름을 검색하므로 정확한 이름 해시 테이블 검색 속도보다 느립니다. 특수한 와일드카드 형식 “.example.org”는 정확한 이름 해시 테이블이 아니라 와일드카드 이름 해시 테이블에 저장됩니다.

정규식은 순차적으로 테스트되므로, 가장 느리고 확장이 불가능합니다.

이와 같은 이유로 되도록이면 정확한 이름을 사용하는 것이 좋습니다. 예를 들어 서버에서 가장 자주 요청하는 이름이 example.org와 www.example.org일 경우, 정확한 이름을 사용하면 단순화된 형식보다 더욱 명확하게, 효율적으로 정의할 수 있습니다.

server {
    listen       80;
    server_name  example.org  www.example.org  *.example.org;
    ...
}

다수의 서버 이름을 정의하거나 특이하게 긴 서버 이름을 정의할 경우

server {
    listen       80;
    server_name  .example.org;
    ...
}

server_names_hash_max_size 및 server_names_hash_bucket_size 명령을 http 레벨에서 조정해야 할 수도 있습니다. server_names_hash_bucket_size 명령의 기본값은 CPU 캐시 행 크기에 따라 32, 64와 같거나 다른 값이 될 수 있습니다. 기본값이 32이고 서버 이름을 “too.long.server.name.example.org”로 정의한 경우, nginx는 시작되지 않고 오류 메시지를 표시합니다.

could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32

이 경우, 명령 값을 다음 2배수로 높여야 합니다.

http {
    server_names_hash_bucket_size  64;
    ...

다수의 서버 이름을 정의하는 경우 다른 오류 메시지가 나타납니다.

could not build the server_names_hash,
you should increase either server_names_hash_max_size: 512
or server_names_hash_bucket_size: 32

이와 같은 경우에는 먼저 server_names_hash_max_size를 서버 이름 개수에 가까운 숫자로 설정합니다. 이 방법이 효과가 없거나 nginx의 시작 시간이 지나치게 길어진다면 server_names_hash_bucket_size를 늘리세요.

서버가 리스닝 포트에 지정된 유일한 서버일 경우, nginx가 서버 이름을 테스트하지 않습니다(리스닝 포트에 대한 해시 테이블도 구축하지 않습니다). 그러나 한 가지 예외가 있습니다. 서버 이름이 캡처를 포함한 정규식일 경우, nginx가 정규식을 실행하여 캡처를 가져와야 합니다.

호환성

  • 특수한 서버 이름인 “$hostname”은 0.9.4버전부터 지원되었습니다.
  • 기본 서버 이름 값은 0.8.48버전부터 빈 이름인 “”입니다.
  • 이름이 지정된 정규식 서버 이름 캡처는 0.8.25버전부터 지원되었습니다.
  • 정규식 서버 이름 캡처는 0.7.40버전부터 지원되었습니다.
  • 빈 서버 이름 “”은 0.7.12버전부터 지원되었습니다.
  • 와일드카드 서버 이름이나 정규식은 0.6.25버전부터 첫 번째 서버 이름으로 사용하도록 지원되었습니다.
  • 정규식 서버 이름은 0.6.7버전부터 지원되었습니다.
  • 와일드카드 형식 example.*은 0.6.0버전부터 지원되었습니다.
  • 특수한 형식 .example.org는 0.3.18버전부터 지원되었습니다.
  • 와일드카드 형식 *.example.org는 0.1.13버전부터 지원되었습니다.
Comments are closed.