Home Nginx DNS 캐싱 이슈 해결
Post
Cancel

Nginx DNS 캐싱 이슈 해결

1. 글을 작성하게 된 계기


회사에서 리버스 프록시/로드 밸런서를 사용하며 발생한 이슈와, 이를 해결한 내용을 정리하기 위해 글을 작성하게 되었습니다. 대략적인 아키텍처는 다음과 같습니다.

image








2. 문제 상황


Nginx 리버스 프록시AWS ALB를 함께 사용하는데, Nginx가 ALB의 주소를 찾지 못하는 문제가 발생했습니다. 이는 Nginx가 DNS 조회 결과를 캐싱 하며, AWS가 ALB의 주소를 주기적으로 변경하기 때문에 발생한 문제입니다.

image







2-1. Nginx DNS 캐싱

Nginx 리버스 프록시는 바라보는 대상의 IP 주소를 lookup으로 찾으며, 이 값을 캐싱합니다. 즉, 한 번 방문한 주소를 갱신해 두는 것입니다.

image







2-2. ALB 주소 변경

AWS는 여러 가용영역에 걸쳐 있으며, 고가용성을 위해 주기적으로 ALB의 주소를 변경 합니다. 즉, ALB의 IP 주소는 동적으로 계속 변경되는 것입니다.

자세한 내용은 해당 포스팅을 참조해주세요.








이를 종합해 보면 Nginx는 변경되기 전 IP 주소를 캐싱하며, ALB는 주기적으로 IP 주소를 바꾸기 때문에, Nginx가 변경 후 IP 주소를 감지하지 못해 발생한 이슈입니다.

image







3. 문제 해결


해결 방법은 간단합니다. Nginx의 conf 파일의 resolver 옵션만 적용해 주면 됩니다.

1
2
3
4
location /api {
      resolver ${NAME_SERVER_IP_ADDRESS};
      ......
}







resolver 설정은 Nginx가 도메인 이름을 IP 주소로 해석할 DNS 서버를 지정하는 데 사용하는 설정입니다. 이는 주로 동적으로 업스트림 서버(Upstream Server)의 IP 주소를 관리할 때 사용합니다. 즉, 이를 통해, 캐싱 된 주소가 아닌 현재 IP 주소를 받아오는 것입니다.

Configures name servers used to resolve names of upstream servers into addresses.







하지만 모든 IP 주소를 매번 새로 받아오면 이것 또한 문제가 될 수 있으므로, valid 설정을 통해 일정 시간 동안은 받아온 IP 주소를 캐싱해 둘 수 있습니다.

1
2
3
4
location /api {
      resolver ${NAME_SERVER_IP_ADDRESS} valid=${SECONDS};
      ......
}







4. 결론


AWS 로드 밸런서는 IP 주소를 주기적으로 변경합니다. Nginx에는 한 번 호출한 DNS 값을 캐싱하고 있으므로, 로드 밸런서 IP 주소가 변경되면 이를 감지하지 못하며 API를 호출하지 못할 수 있습니다. 이를 해결하기 위해서는 resolver 설정을 통해 아이피 주소를 주기적으로 lookup 해야 합니다.

  1. Nginx 리버스 프록시는 DNS looup을 통해 IP 주소를 캐싱한다.
  2. AWS ALB는 주기적으로 IP 주소를 바꾼다.
  3. Nginx가 바뀐 AWS ALB IP 주소를 인지하지 못해 오류가 발생한다.

This post is licensed under CC BY 4.0 by the author.