
블로그를 프론트엔드는 Vercel로, 백엔드는 AWS Lightsail을 통해 호스팅 중이다. 가비아에서 highjoon-dev.com 도메인을 구입해서 Vercel과 AWS에 연결했는데, DNS_PROBE_FINISHED_NXDOMAIN 이슈가 자꾸 발생해서 나를 괴롭혔다.
프론트엔드는 highjoon-dev.com, www.highjoon-dev.com 를 연결했고, 백엔드는 api.highjoon-dev.com 로 주소를 연결했다. 그런데 블로그를 들어가보면 가끔씩 DNS_PROBE_FINISHED_NXDOMAIN 오류가 발생하면서 화면이 뜨지 않았다.
Note"DNS 요청 결과, 해당 도메인 이름이 존재하지 않습니다."
NXDOMAIN은 Non-eXistent Domain의 약자로, 브라우저가 DNS 서버에 도메인 이름에 대한 질의를 보냈지만 "없는 도메인"이라는 응답을 받은 상태다.
주로 이런 이유로 발생한다.
네임서버
서로 다른 DNS 제공자 (Vercel, 가비아 등)의 네임서버가 함께 등록되어 있을 경우, 어떤 DNS 응답은 정상, 어떤 것은 실패하면서 간헐적 오류가 발생할 수 있다.
NoteDNS 레코드
- 도메인 이름을 IP 주소, 다른 도메인, 인증 정보 등으로 매핑하는 설정
- 도메인 이름이 어떤 IP 주소나 리소스를 가리킬지 정의하는 설정이다.
도메인을 등록했지만 A 레코드나 CNAME 레코드가 등록되지 않은 경우 발생할 수 있다.
A 레코드는 도메인을 IP 주소로 직접 연결하는 방식이고, CNAME 레코드는 도메인을 다른 도메인의 별칭(alias)으로 연결하는 방식이다. CNAME은 루트 도메인(@)에는 사용할 수 없다.
도메인의 네임서버는 A라는 DNS 제공자를 가리키고 있지만, 실제로 그 DNS 서버에는 해당 레코드가 등록되어 있지 않은 경우 발생할 수 있다.
호스트.highjoon-dev.com (예: www.highjoon-dev.com)을 입력한다.highjoon-dev.com 도메인의 네임서버(NS 레코드) 를 따라 권한이 있는 DNS 서버를 조회한다.76.76.21.21 또는 cname.vercel-dns.com)dig 명령어를 사용하면 DNS 레코드를 확인할 수 있다.
➜ ~ dig highjoon-dev.com
;; ANSWER SECTION:
highjoon-dev.com. 600 IN A 76.76.21.21

나는 가비아에 Vercel과 AWS의 네임서버를 모두 등록했다.
각 네임서버는 자기한테 등록된 레코드만 알고 있다. Vercel 네임서버에는 Vercel 프로젝트에 연결한 도메인 정보가 들어 있고, AWS 네임서버에는 AWS 쪽에서 설정한 레코드만 들어 있다.
두 네임서버는 서로의 레코드를 모른다.
DNS 질의는 브라우저가 DNS에 등록된 네임서버 중 하나를 무작위로 선택해 질의한다.
가비아에 2개의 네임서버를 모두 등록했으니, 어떤 요청은 Vercel의 네임서버로 보내졌고, 또 어떤 요청은 AWS의 네임서버로 보내졌다.
Vercel에 프론트엔드를 배포하면서 www.highjoon-dev.com을 Vercel 프로젝트에 연결해뒀으니, Vercel 네임서버는 www에 대한 레코드를 알고 있다.
반면 AWS 네임서버에는 www에 대한 레코드를 등록한 적이 없다. 따라서 이 네임서버로 요청 시 DNS_PROBE_FINISHED_NXDOMAIN 에러가 발생했다.
6개 중 Vercel이 2개, AWS가 4개였으니 확률적으로 실패할 때가 더 많았던 것 같다.
사용자 요청 → 네임서버 랜덤 선택 →
→ Vercel NS → www 레코드 있음 → 연결! ✅
→ AWS NS → www 레코드 없음 → NXDOMAIN ❌
여기서 하나 더 헷갈렸던 부분이 있다. "가비아에서 네임서버를 설정했는데, 왜 가비아 DNS 레코드는 참조가 안 되지?"
이건 가비아가 두 가지 역할을 동시에 하기 때문이다.
이 두 개는 독립적으로 동작한다. 네임서버 설정에 Vercel/AWS를 넣어놓았다는 건, "highjoon-dev.com에 대해 물어볼 일이 있으면 가비아 말고 Vercel이나 AWS한테 물어봐"라고 선언한 거다. 가비아는 이 선언을 세상에 전파만 했을 뿐, 정작 DNS 질의가 날아오는 곳은 Vercel이나 AWS다.
그러니 가비아 DNS 레코드 설정 페이지에서 아무리 레코드를 추가해봤자, 그건 가비아 DNS 서버에 저장되는 것이지 Vercel이나 AWS 서버에 반영되는 게 아니다. 아무도 가비아 DNS 서버에 질의를 안 보냈으니까, 거기에 뭘 넣어놓든 의미가 없었다.

가비아에서도 자기들만의 네임서버를 제공한다.
나는 Vercel과 AWS로 나뉘어 있던 네임서버를 전부 가비아로 바꿨다. 이렇게 하면 모든 DNS 질의가 가비아 하나로 가게 된다.
더 이상 랜덤으로 Vercel이나 AWS한테 질의가 갈 일이 없으니, 가비아 DNS 레코드 설정 페이지에서 "www는 Vercel로, api는 Lightsail로" 분기 처리를 할 수 있게 된다.
브라우저 → 무조건 가비아 NS에 질의 → 가비아 DNS 레코드 확인
→ www → CNAME → cname.vercel-dns.com → Vercel로 연결 ✅
→ api → A → 3.35.178.188 → Lightsail로 연결 ✅

| 호스트 | 타입 | 값 | 용도 |
|---|---|---|---|
www | CNAME | cname.vercel-dns.com. | 프론트엔드 연결 |
api | A | 3.35.178.188 | 백엔드 (Lightsail) |
@ | A | 76.76.21.21 (Vercel) | 루트 → www 리디렉션 |
www는 Vercel로 보내고, api는 Lightsail IP로 보냈다. 루트 도메인(@)은 Vercel 고정 IP로 연결해서 Vercel 쪽에서 www로 리디렉션하게 했다.

Vercel 프로젝트에 highjoon-dev.com 도메인을 추가하고, Redirect to www.highjoon-dev.com 옵션 활성화했다.
이제 루트 도메인(@)으로 접근하면 Vercel이 자동으로 www로 리디렉션 처리하게 된다.
이렇게 DNS 레코드를 다 수정했는데도 한동안 DNS_PROBE_FINISHED_NXDOMAIN 에러가 계속 떴다.
바로 DNS 캐싱과 TTL(Time To Live) 때문에 발생하는 현상이었다. DNS 레코드는 브라우저와 OS에 일정 시간 캐싱되는데, 이 캐싱 유효 시간을 TTL이라고 한다. TTL이 남아 있는 동안에는 DNS 서버에 다시 질의하지 않고 캐시된 값을 쓴다. 따라서 이전 설정(잘못된 상태)이 캐싱되어 있어서 수정 사항이 당장은 반영되지 않았던 것이다.
Note도메인의 DNS 설정(예: 네임서버, A/CNAME 레코드 등)을 변경한 뒤, 이 변경 사항이 모든 클라이언트, 브라우저, 운영체제, DNS 서버 등에 반영되기까지 걸리는 시간 또는 과정
DNS 전파는 설정을 변경하는 즉시 시작되지만, 전 세계의 DNS 서버와 클라이언트에 반영되기까지는 시간이 걸린다. TTL이 만료되어야 새 DNS 질의가 수행되고, 그때서야 최신 정보를 받아온다.
https://dnschecker.org/ 에서 DNS 전파 진행 상황을 알 수 있다.
결국 핵심은 단순했다. 하나의 도메인에는 하나의 네임서버만 쓸 것. DNS 설정이 꼬였을 때 가장 먼저 확인해야 할 건 레코드가 아니라 네임서버가 어디를 가리키고 있느냐다.