NGINX Plus

UDP Health Check

이 장에서는 Load Balancing된 Upstream 서버 그룹에서 UDP 서버에 대한 다양한 유형의 NGINX Plus Health Check을 구성하는 방법을 설명합니다.

목차

1. 전제 조건
2. Passive UDP Health Check
3. Active UDP Health Check
3-1. UDP Health Check 미세 조정
3-2. “match { }” 구성 블록
3-2-1. NTP 테스트 예제
3-2-2. DNS 테스트 예제

1. 전제 조건

  • 예를 들어 stream { } 컨텍스트에서 UDP 네트워크 트래픽(DNS, RADIUS, syslog)을 처리하는 서버의 upstream 그룹을 구성했습니다.
stream {
    #...
    upstream dns_upstream {
        server 192.168.136.130:53;
        server 192.168.136.131:53;
        server 192.168.136.132:53;
    }
    #...
}
  • Upstream server 그룹에 UDP 데이터그램을 전달하는 서버를 구성했습니다.
stream {
    #...
    server {
        listen          53 udp;
        proxy_pass      dns_upstream;
        proxy_timeout   1s;
        proxy_responses 1;
        error_log       logs/dns.log;
    }
    #...
}

2. Passive UDP Health Check

서버가 오류로 응답하거나 시간 초과된 경우 NGINX Open Source 또는 NGINX Plus 는 서버를 사용할 수 없는 것으로 표시하고 일정 시간 동안 해당 서버로 UDP 데이터그램 전송을 중지할 수 있습니다.

특정 기간 동안 연속적으로 실패한 연결 시도 횟수는 upstream servermax_fails 매개 변수를 사용하여 설정합니다(기본값은 1).

기간은 fail_timeout 매개변수로 설정합니다(기본값은 10초). 또한 이 매개변수는 서버를 사용할 수 없는 상태로 표시한 후 NGINX가 서버를 사용할 수 없는 것으로 간주하는 시간도 설정합니다.

따라서 10초 동안 한 번 이상 연결 시도가 실패하거나 시간이 초과되면 NGINX는 서버를 10초 동안 사용할 수 없는 것으로 표시합니다. 다음 예제에서는 이러한 매개 변수를 60초 내에 2회 실패로 설정하는 방법을 보여줍니다.

upstream dns_upstream {
    server 192.168.136.130:53 fail_timeout=60s;
    server 192.168.136.131:53 fail_timeout=60s;
}

3. Active UDP Health Check

Active Health Check를 사용하면 더 광범위한 장애 유형을 테스트할 수 있으며 NGINX Plus 에서만 사용할 수 있습니다. 예를 들어, Passive Health Check에서와 같이 DNS 클라이언트의 실제 TCP 요청이 실패할 때까지 기다렸다가 DNS 서버를 다운 상태로 표시하는 대신, NGINX Plus 는 각 Upstream 서버에 특별한 Health Check 요청을 보내고 특정 조건을 충족하는 응답이 있는지 확인합니다. 서버에 연결할 수 없으면 Health Check이 실패하고 서버가 정상적이지 않은 것으로 간주됩니다. NGINX Plus 는 건강하지 않은 서버에 대한 클라이언트 연결을 Proxy하지 않습니다. 둘 이상의 Health Check가 정의되어 있는 경우, 어떤 검사라도 실패하면 해당 Upstream 서버가 정상적이지 않은 것으로 간주합니다.

Active Health Check를 사용하려면:

1. Upstream 그룹에서 zone 지시문을 사용하여 공유 메모리 Zone을 지정합니다. 이 Zone은 NGINX Plus Worker Process가 카운터 및 연결에 대한 상태 정보를 공유하는 특수 Zone입니다. zone 지시문에서 Zone 이름(예제에서는 dns_zone)과 Zone 크기(예제에서는 64k)를 지정합니다.

stream {
    #...
    upstream dns_upstream {
        zone   dns_zone 64k;
        server 192.168.136.130:53;
        server 192.168.136.131:53;
        server 192.168.136.132:53;
    }
    #...
}

2. proxy_pass를 통해 트래픽을 Upstream 그룹으로 전달하는 server 블록에서 udp 매개변수를 health_check 지시문에 지정합니다.

stream {
    #...
    server {
         listen       53 udp;
         proxy_pass   dns_upstream;
         health_check udp;
    }
    #...
}

기본 UDP Health Check은 NGINX Plus 가 Upstream 서버에 “nginx health check” 문자열을 전송하고 응답으로 ICMP “대상에 연결할 수 없음” 메시지가 없을 것으로 가정합니다. match { } 블록에서 자체 Health Check 테스트를 구성할 수 있습니다. 자세한 내용은 “match { }” 구성 블록을 참조하세요.

3-1. UDP Health Check 미세 조정

health_check 지시문에 다음 매개변수를 지정하여 Health Check를 세밀하게 조정할 수 있습니다.

  • interval – NGINX Plus 가 Health Check 요청을 보내는 빈도(초)(기본값은 5초)
  • passes – 서버가 정상으로 간주되기 위해 응답해야 하는 연속 Health Check 횟수(기본값은 1)
  • fails – 서버가 정상적이지 않은 것으로 간주되기 위해 서버가 응답하지 않아야 하는 연속 Health Check 횟수(기본값은 1).
server {
    listen       53 udp;
    proxy_pass   dns_upstream;
    health_check interval=20 passes=2 fails=2 udp;
}

이 예에서는 UDP Health Check 사이의 시간을 20초로 늘리고, 2번 연속 Health Check에 실패하면 서버가 정상적이지 않은 것으로 간주하며, 서버가 다시 정상으로 간주되려면 2번 연속 검사를 통과해야 합니다.

3-2. “match { }” 구성 블록

여러 테스트를 구성하여 Health Check에 대한 서버 응답을 확인할 수 있습니다. 이러한 테스트는 match { } 구성 블록 내에 정의되어 있습니다.

1. 최상위 stream { } 컨텍스트에서 match { } 블록을 지정하고 그 이름(예: udp_test)을 설정합니다.

stream {
    #...
    match  udp_test {
        #...
    }
}

2. match 매개 변수를 포함하여 health_check 지시문의 블록을 참조하여 match { } 블록의 이름을 지정합니다.

stream {
    #...
    server {
        listen       53 udp;
        proxy_pass   dns_upstream;
        health_check match=udp_test udp;
    }
    #...
}

3. match { } 블록에서 Health Check이 성공하는 조건 또는 테스트를 지정합니다. 이는 send 및 expect 매개변수를 사용하여 수행됩니다.

send – 서버로 전송할 텍스트 문자열 또는 16진수 Literal(“/x” 뒤에 두 개의 16진수 숫자)입니다.

expect – 서버에서 반환되는 데이터가 반드시 일치해야 하는 Literal 문자열 또는 정규식입니다.

이러한 매개변수는 다양한 조합으로 사용할 수 있지만 한 번에 하나의 sendexpect 매개변수만 지정할 수 있습니다.

3-2-1. NTP 테스트 예제

NTP에 대한 Health Check을 미세 조정하려면 다음 텍스트 문자열로 sendexpect 매개 변수를 모두 지정해야 합니다.

match ntp {
    send \xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;
    expect ~* \x24;
}

3-2-2. DNS 테스트 예제

DNS에 대한 Health Check를 미세 조정하려면 다음 텍스트 문자열을 사용하여 sendexpect 매개 변수를 모두 지정해야 합니다.

match dns {
    send \x00\x2a\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03\x73\x74\x6c\x04\x75\x6d\x73\x6c\x03\x65\x64\x75\x00\x00\x01\x00\x01;
    expect ~* "health.is.good";
}