ngx_stream_upstream_hc_module
ngx_stream_upstream_hc_module 모듈(1.9.0)을 사용하면 그룹 내 서버에 대해 정기적 상태 검사를 활성화할 수 있습니다. 서버 그룹은 공유 메모리에 있어야 합니다.
상태 검사가 실패하면 서버는 정상이 아닌 것으로 간주됩니다. 동일한 서버 그룹에 여러 상태 검사가 정의된 경우, 검사가 한 번이라도 실패하면 해당 서버가 정상이 아닌 것으로 간주됩니다. 클라이언트 연결은 비정상 서버와 “checking” 상태의 서버에는 전달되지 않습니다.
이 모듈은 상업용 구독에서 제공합니다.
예제 구성
upstream tcp {
zone upstream_tcp 64k;
server backend1.example.com:12345 weight=5;
server backend2.example.com:12345 fail_timeout=5s slow_start=30s;
server 192.0.2.1:12345 max_fails=3;
server backup1.example.com:12345 backup;
server backup2.example.com:12345 backup;
}
server {
listen 12346;
proxy_pass tcp;
health_check;
}
이 구성에서는 nginx가 tcp 그룹의 각 서버로 TCP 연결을 설정할 수 있는지 5초마다 검사합니다. 서버 연결을 설정할 수 없는 경우 상태 검사가 실패하고, 서버는 비정상으로 간주됩니다.
UDP 프로토콜에 대해 상태 검사를 구성할 수 있습니다.
upstream dns_upstream {
zone dns_zone 64k;
server dns1.example.com:53;
server dns2.example.com:53;
server dns3.example.com:53;
}
server {
listen 53 udp;
proxy_pass dns_upstream;
health_check udp;
}
이 경우, 전송된 “nginx health check” 문자열에 대한 응답에 ICMP “Destination Unreachable” 메시지가 없어야 합니다.
상태 검사는 서버에서 얻은 데이터를 테스트하도록 구성할 수도 있습니다. 테스트는 match 명령을 사용하여 별도로 구성하며, health_check 명령의 match 매개변수에서 참조됩니다.
Directives
Syntax: health_check [parameters];
Default: —
Context: server
그룹 내 서버의 정기적 상태 검사를 활성화합니다.
지원되는 선택적 매개변수는 다음과 같습니다.
interval
=time
2개의 연속적 상태 검사 간격을 설정합니다. 기본값은 5초입니다.
jitter
=time
각 상태 검사를 무작위로 지연하는 시간제한을 설정합니다. 기본값은 지연이 없는 상태입니다.
fails
=number
특정 서버의 상태 검사가 연속적으로 실패할 수 있는 횟수를 설정합니다. 이 값이 초과되면 해당 서버는 비정상으로 간주됩니다. 기본값은 1입니다.
passes
=number
특정 서버의 상태 검사가 연속적으로 통과되는 횟수를 설정합니다. 이 값을 넘으면 해당 서버는 정상으로 간주됩니다. 기본값은 1입니다.
mandatory
[persistent
]
첫 상태 검사가 완료되기 전까지 서버의 최초 “checking” 상태를 설정합니다(1.11.7). 클라이언트 연결은 “checking” 상태의 서버에는 전달되지 않습니다. 매개변수를 지정하지 않으면 서버는 처음에 정상으로 간주됩니다.
persistent 매개변수(1.21.1)는 서버가 다시 로드되기 전에 정상으로 간주된 경우 서버의 최초 “up” 상태를 설정합니다.
match=name
match 블록을 지정하여, 상태 검사를 통과하기 위해 성공적인 연결이 통과해야 할 테스트를 구성합니다. 기본적으로 TCP에서는 서버에 TCP 연결을 설정할 수 있는지만 검사합니다. UDP의 경우, 전송된 문자열 “nginx health check”에 대한 응답에 ICMP “Destination Unreachable” 메시지가 없어야 합니다.
1.11.7버전 이전에는 기본적으로 send 및 expect 매개변수가 있는 match 블록에 UDP 상태 검사가 필요했습니다.
port=number
상태 검사를 위해 서버에 연결할 때 사용할 포트를 정의합니다(1.9.7). 기본적으로 서버 포트와 동일합니다.
udp
기본 TCP 프로토콜 대신 UDP 프로토콜을 상태 검사에 사용하도록 지정합니다(1.9.13).
Syntax: health_check_timeout timeout;
Default: health_check_timeout 5s;
Context: stream, server
상태 검사에 대한 proxy_timeout 값을 재정의합니다.
Syntax: match name { ... }
Default: —
Context: stream
상태 검사에 대한 서버 응답을 확인하기 위해 사용하는 이름이 지정된 테스트 세트를 정의합니다.
다음의 매개변수를 구성할 수 있습니다.
send
string
;
string를 서버로 보냅니다.
expect
string
| ~
regex
;
서버에서 얻은 데이터가 일치해야 하는 리터럴 문자열(1.9.12) 또는 정규식. 정규식은 앞에 “~*” 수정자(대소문자를 구분하지 않는 매칭), 또는 “~” 수정자(대소문자를 구분하는 매칭)를 붙여서 지정합니다.
send 및 expect 매개변수에는 접두사 “\x”를 포함한 16진수 리터럴과 16진수 2개가 연결됩니다(예: “\x80”)(1.9.12).
상태 검사가 통과되는 경우는 다음과 같습니다.
- TCP 연결이 성공적으로 설정된 경우
- send 매개변수(지정한 경우)에서 string을 전송한 경우
- 서버에서 얻은 데이터가 expect 매개변수(지정한 경우)의 문자열 또는 정규식과 일치하는 경우
- 경과 시간이 health_check_timeout 명령에서 지정한 값을 초과하지 않는 경우
예:
upstream backend {
zone upstream_backend 10m;
server 127.0.0.1:12345;
}
match http {
send "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n";
expect ~ "200 OK";
}
server {
listen 12346;
proxy_pass backend;
health_check match=http;
}
서버에서 얻은 데이터의 첫 번째 proxy_buffer_size 바이트만 검사합니다.