2008년 10월 6일 월요일

DNS 캐시 디버깅하기

웹 개발이나 서버 관리를 하다 보면 도메인 및 많은 수의 virtual host들을 관리해야 하는 경우가 많은데, 이때 네임서버 설정을 변경해도 바로 반영이 안 되어서 한참 동안 접속이 되는 걸 기다리느라 시간을 허비할 때가 많다. DNS 문제는 인터넷의 발전을 가로막는 장벽이라는 이야기가 있을 정도로 그 갱신 주기와 관리에 관련된 주체들이 많이 얽혀있어 처음 이런 문제를 접하는 사람들의 경우 해결하기가 쉽지 않고, 캐시 갱신으로 인해 갑자기 해결되어도 왜 그런지 이해하지 못하는 경우가 태반이다.

그래서 이 글에서는 DNS 설정을 바꿨을 때 어떻게 하면 빨리 대처할 수 있는지 살펴보기로 한다.

1. 네임서버 자체의 TTL 설정 확인
DNS 관리할 때 사용되는 용어 중 TTL(Time-to-live)이란 것이 있는데, 이것은 네임서버가 해당 도메인에 대한 정보를 얼마나 긴 시간 동안 캐시(임시 보관)하고 있을 것인지 결정한다. 이 값이 길수록 캐시 기간이 길어지므로 새로운 정보로 변경했을 때 그 정보가 적용되기까지 시간이 오래 걸린다. 따라서 테스트용 서버와 같이 자주 변경이 이루어지는 경우 이 값을 비교적 작게 유지하는 것이 좋다.

2. ISP가 제공하는 DNS 서버
회사나 큰 기관에서는 자체 DNS 서버를 이용하기도 하고, 개인사용자들은 KT, 하나로통신, LG파워콤 등 자기가 가입한 인터넷 회선 사업자의 DNS 서버를 이용할 것이다. 네임서버 정보를 수정했다고 해도 이들 서버에 적용되기까지 또 시간이 걸린다. 이것은 TTL 정보뿐만 아니라 각 DNS 서버의 운영 정책 등과도 관련이 있기 때문에 정확히 얼마만큼의 시간이 걸린다고 예측하기는 어려우며 DNS 서버마다 갱신 주기가 달라 어떤 곳에서는 새로 바뀐 주소로 접속이 되고 어떤 곳에서는 예전 주소로 접속되고 이런 현상이 발생하기도 한다.

내가 추천하는 한 가지 방법은 OpenDNS를 이용하는 것인데, 이곳은 캐시 갱신이 비교적 빠른 편이고 갱신이 안 되어 접속에 문제가 생겼을 때 캐시 상태를 확인할 수 있는 페이지로 보내주므로 현재 어떤 상황인지 비교적 투명하게 알 수 있다는 장점이 있다. DNS 서버는 ISP가 제공하지 않는 것을 사용하더라도 보통 별다른 제약이 없기 때문에 이 방법을 가장 추천한다.

3. 자기 컴퓨터의 DNS 캐시
DNS 서버에서도 캐시가 이뤄지지만 각자 사용하는 로컬 컴퓨터의 운영체제에서도 자체적으로 캐시가 이루어진다.

 운영체제 로컬 캐시 갱신 명령 수동 mapping 파일
 MS Windows ipconfig /flushdns {SystemDir}\drivers\etc\hosts
 Linux /etc/init.d/nscd restart /etc/hosts
 MacOS X (10.4 이전) lookupd -flushdns /etc/hosts
 MacOS X (10.5 이후) dnscacheutil -flushdns  /etc/hosts

여기서 주목할 것은 etc/hosts 파일인데(심지어 윈도우도 거의 같은 디렉토리/파일명에 똑같은 포맷을 가지고 있다), 이 파일에 "IP주소 도메인" 형태로 한줄씩 수동 mapping을 추가할 수 있다. 이렇게 하면 실제 인터넷 상의 DNS 서버를 이용하지 않고 해당 IP 주소로 자기 PC 레벨에서 무조건 연결시켜주므로 DNS 서버가 갱신되지 않을 때 재빨리 테스트해보기 위한 용도로 적합하다.

거의 모든 운영체제에서 제공하고 있는 네임서버 테스트 용도의 nslookup 명령 결과에 영향을 주는 부분은 여기까지다.

※ Linux의 경우 배포판마다 캐시 갱신 명령이 다를 수 있음.

4. 웹브라우저 자체의 DNS 캐시
그러나 위의 etc/hosts 파일을 고쳐도 적용되지 않는 경우가 있을 수 있는데, 이것은 웹브라우저 자체가 가지고 있는 캐시 때문이다. -_-; 보통은 웹브라우저를 재시작해도 적용되지만 Firefox처럼 세션을 저장했다가 다시 불러오는 경우 바로 갱신되지 않을 때가 있다.
이럴 땐 웹브라우저의 설정을 직접 건드려주는 방법이 있다.

  • Firefox : about:config에서 network.dnsCacheEntries (캐시 항목 개수), network.dnsCacheExpiration (캐시 기간, 단위: 초) 두 항목을 변경하거나 새로 추가한다. entry 개수가 0이 되면 캐시를 전혀 하지 않지만 복잡한 웹사이트 로딩시 속도가 떨어질 수 있다.
  • Internet Explorer : MSDN 참조

이처럼 살펴본 바와 같이, DNS Cache 문제는 여러 단계에서 영향받을 수 있기 때문에 꼼꼼히 확인해봐야 한다.