- Upstream Domain Resolve 참고 자료 : https://www.nginx.com/resources/wiki/modules/domain_resolve/
- ngx_upstream_jdomain 깃허브 : https://github.com/nicholaschiasson/ngx_upstream_jdomain
ngx_upstream_jdomain 모듈이란
- ngx_upstream_jdomain 모듈은 nginx 업스트림 도메인 네임을 비동기적으로 확인하는 업스트림 모듈
- 업스트림 블록에서 도메인 이름을 사용할 수 있으며 도메인 이름이 동적으로 확인 → 업스트림이 DNS 항목 업데이트에 탄력적으로 대응 가능
- ngx_upstream_jdomain 모듈은 일정 간격으로 DNS 확인을 자동으로 수행하지 않음 → 주어진 업스트림에 대한 요청에 따라 DNS 확인
- nginx가 jdomain 업스트림에 바인딩된 연결을 제공하고 구성된 간격(interval)이 경과한 경우 모듈은 DNS 조회를 수행함
- ngx_upstream_jdomain 모듈은 다른 업스트림 범위(upstream scope) 지시어와 호환
- 여러 jdomain 지시어(multiple jdomain directives)
- 여러 서버 지시어(multiple server directives)
- keepalive
- 로드 밸런싱 지시어(load balancing directives)
- 등등(etc.)
- 업스트림 블록에 다른 로드 밸런싱 방법을 지정하지 않는 한 ngx_upstream_jdomain 모듈은 nginx 코어에 내장된 기본 라운드 로빈 로드 밸런싱 알고리즘을 사용
- 버퍼에는 백엔드 도메인 이름(backend domain name)의 최신 IP가 구성되어 있으며, 로드 밸런싱 알고리즘(최소_conn, 해시 등) 또는 명시적으로 정의되지 않은 경우 내장된 라운드 로빈과 통합함
- 매 간격(기본값은 1초)마다 도메인 이름을 확인(질의)
- 도메인 네임을 확인하지 못하면 버퍼는 마지막으로 성공적으로 확인된 IP를 유지하거나 사용자가 지정한 백업 서버 IP를 사용
※ 대체 로드 밸런싱 알고리즘(alternate load balancing algorithm)을 지정하는 경우 업스트림 블록의 jdomain 지시어 앞에 지정 필요
- 앞에 지정하지 않는 경우 런타임 중에 nginx가 충돌 발생
- 많은 로드 밸런싱 모듈이 내장된 라운드 로빈을 명시적으로 확장
- jdomain 지시어 이후에 대체 로드 벨런싱 알고리즘을 지정하면, jdomain 초기화 핸들러를 방해 → jdomain은 로드 밸런서 모듈
- 단, 모든 로드 밸런서 모듈에 해당하는 것은 아니지만, 안전을 위해 jdomain을 뒤에 배치하는 것이 좋음(jdomain 앞에 대체 로드 밸런싱 알고리즘 취이 필요)
※ ngx_upstream_jdomain 모듈의 비차단 특성(non blocking nature)과 들어오는 요청에 의해 DNS resolve 트리거
- resolve를 요청하는 트리거는 실제로는 DNS 조회가 발생하기 전에 확인되어 캐시된 업스트림으로 전달
- 시나리오에 따라 업스트림의 상태를 변경할 때 일회성 장애가 발생할 수 있음
- 업스트림의 원활한 전환을 보장하기 위해 염두에 두어야 함
ngx_upstream_jdomain 시놉시스(Synopsis)
1. ngx_upstream_jdomain 문법
jdomain <domain-name> [port=80] [max_ips=4] [interval=1] [strict]
2. nginx_upstream_jdomain 위치
- Context: upstream
3. nginx_upstream_jdomain 속성 설명
속성 | 설명 |
port | - 백엔드의 listen 포트 - Default: 80 |
max_ips | - IP 버퍼 크기(IP buffer size) - 캐시할 최대 확인된 IP 수 - Default: 4 |
interval | - 도메인 이름 resolve 걸리는 시간(초) - Default: 1 |
ipver | - 정의된 경우 패밀리 IPv4 또는 IPv6 주소만 사용 - Default: 0 |
strict | - DNS resolve이 성공하고 주소를 반환해야 함 - 그렇지 않으면 기본 서버와 피어(server and peers)를 다운으로 표시하고 업스트림 블록에 다른 서버가 있는 경우 강제로 사용 - 확인 실패 경우 1. timeout 2. DNS server failure 3. connection refusals 4. response with no addresses |
ngx_upstream_jdomain 모듈 설치(Installation)
- https://github.com/nicholaschiasson/ngx_upstream_jdomain 리포지토리를 정적 또는 동적 모듈로 사용하여 nginx를 빌드
$ ./configure --add-module=/path/to/this/directory $ make $ make install
ngx_upstream_jdomain 사용 예시
resolver 8.8.8.8; # Your Local DNS Server
# Basic upstream using domain name defaulting to port 80.
upstream backend_01 {
jdomain example.com;
}
# Basic upstream specifying different port.
upstream backend_02 {
jdomain example.com port=8080;
}
# Upstream with a backup server to use in case of host not found or format
# errors on DNS resolution.
upstream backend_03 {
server 127.0.0.2 backup;
jdomain example.com;
}
# Upstream which will use backup for any and all DNS resolution errors.
upstream backend_04 {
server 127.0.0.2 backup;
jdomain example.com strict;
}
# Upstream which will use backup for any and keepalive.
upstream backend_05 {
server 127.0.0.2:55555 backup;
jdomain example.com;
keepalive 8;
}
server {
listen 127.0.0.2:80;
return 502 'An error.';
}
'Nginx > Nginx 모듈 학습' 카테고리의 다른 글
ngx_http_split_clients_module 모듈 (0) | 2023.09.22 |
---|---|
ngx_http_sub_module 모듈 (0) | 2023.09.22 |
ngx_http_image_filter_module 모듈 (0) | 2023.09.21 |
ngx_http_gzip_static_module 모듈 (1) | 2023.09.21 |
ngx_http_gunzip_module 모듈 (0) | 2023.09.21 |