idea·blog

SERVER ERROR CLINIC

ENOTFOUND (주소를 찾을 수 없음)

도메인 이름을 IP로 바꾸지 못했습니다. 연결을 시도하기도 전에 끝난 것이라 서버 문제가 아닌 경우가 많습니다.

이 도구는 여러분의 서버에 접속하지 않습니다. 답한 내용만으로 확인할 순서를 정해주는 도구이며, 실제 로그를 대신하지 않습니다.

  1. 브라우저요청을 보낸 곳
  2. 인터넷이름 찾기·연결
  3. 프록시Nginx·Caddy
  4. 여기가 의심됩니다
  5. DB·외부 API앱이 부르는 곳

어느 로그를 볼까 서버 로그보다 부르는 쪽의 주소값을 먼저 봅니다. 환경변수가 비어 있어 이상한 이름을 찾고 있는 경우가 가장 많습니다.

원인 후보 3

그 주소의 이름이 IP로 바뀌나요?

이름을 못 찾으면 연결은 시도조차 되지 않습니다. 여기부터 확인합니다.

서버에서 이 명령을 쳐보고, 아래에서 결과를 골라 주세요.

getent hosts api.example.com || dig +short api.example.com

가장 먼저 확인할 것

주소 설정값이 비어 있다

환경변수가 없어서 undefined 같은 값이 그대로 주소 자리에 들어갔습니다. 오류 메시지에 이상한 이름이 보인다면 거의 확실합니다.

다른 후보가 하나씩 제외되면서 남은 원인입니다.

앱이 실제로 받은 주소값을 눈으로 확인합니다.

systemctl show <서비스이름> -p Environment

그다음 오류 메시지에 찍힌 이름을 그대로 읽어봅니다. undefined나 빈 문자열이 섞여 있으면 설정 누락입니다.

아니라면 다음

안에서만 통하는 이름이다

컨테이너 이름이나 사내 주소는 그 네트워크 안에서만 해석됩니다. 밖에서 부르면 찾을 수 없습니다.

같은 네트워크 안에서는 해석되는지 확인합니다.

docker compose exec <서비스> getent hosts api.example.com

그다음 같은 네트워크 안에서 부르거나, 밖에서 쓸 수 있는 주소로 바꿉니다. 도커 컴포즈에서는 서비스 이름이 곧 주소가 됩니다.

이름이 IP로 바뀌는 과정 보기

아니라면 다음

새 레코드가 아직 퍼지지 않았다

방금 만든 DNS 레코드가 모든 곳에 반영되기까지는 시간이 걸립니다. 되는 곳과 안 되는 곳이 갈립니다.

서로 다른 DNS 서버가 같은 답을 주는지 비교합니다.

dig +short api.example.com @1.1.1.1 && dig +short api.example.com @8.8.8.8

그다음 레코드의 TTL만큼 기다립니다. 그동안 서버끼리는 IP로 직접 부르게 해두면 급한 불은 끌 수 있습니다.

이름이 IP로 바뀌는 과정 보기

실험을 마쳤다면