Java 애플리케이션의 UnknownHostException 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 4월 26일

Java 애플리케이션의 UnknownHostException 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

UnknownHostException은 Java 애플리케이션의 일반적인 오류 메시지입니다. 이 오류는 일반적으로 DNS 확인 오류가 있음을 나타냅니다. 그러나 일반적인 메시지이므로 문제의 근본 원인이 설명되지는 않습니다. DNS 문제에 더해 이 오류의 근본 원인은 다음과 같습니다.

  • Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스의 네트워크 중단
  • DNS 확인에 영향을 미치는 소프트웨어 문제
  • 드라이버 문제

Java 애플리케이션에서 유효한 DNS 응답을 받지 못하는 경우 UnknownHostException 오류가 발생할 수 있습니다. 가능한 원인은 다음과 같습니다.

  • 애플리케이션에서 구성된 DNS 확인자에 연결할 수 없어 제한 시간이 초과됨
  • 애플리케이션에서 NXDOMAIN 응답을 수신함
  • 애플리케이션에서 SERBFAIL 응답 또는 다른 유형의 DNS 오류를 수신함
  • 애플리케이션에서 DNS 응답이 포함되지 않은 NOERROR 응답을 수신함

해결 방법

참고: AWS 명령줄 인터페이스(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

오류의 근본 원인 결정

UnknownHostException 오류 문제 해결을 시작하려면 먼저 근본 원인을 결정해야 합니다. 근본 원인을 결정하려면 다음 단계를 수행하세요.

1.    Windows 원격 데스크톱 프로토콜(RDP) 또는 Secure Shell(SSH) 프로토콜을 사용하여 Java 애플리케이션을 호스팅하는 서버에 연결합니다.

2.    오류를 일으킨 DNS 이름에 대해 dig 명령(Linux) 또는 nslookup 명령(Windows)을 실행합니다. 출력을 검토합니다.

예를 들어 출력의 상태는 NOERROR여야 하고 Answer 섹션에 유효한 DNS 응답이 있어야 합니다.

$ dig www.example.com

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9216
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 5

;; ANSWER SECTION:
www.example.com.    75347    IN    A    93.184.216.34

예기치 않은 출력은 다음 예제와 유사할 수 있습니다. 이 경우 출력의 상태는 SERBFAIL입니다.

$ dig servfail.example.com

;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 57632
;; flags: qr rd ra;
    QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

이 예제에서는 서버 또는 DNS 확인자에서 네트워킹 문제가 있습니다. 애플리케이션이 연결하지 못해 제한 시간이 초과됩니다.

$ dig timeout.example.com

;; global options: +cmd
;; connection timed out; no servers could be reached

또는 유효한 NOERROR 응답을 수신할 수 있습니다. 그러나 응답에 유효한 Answer 섹션이 없으면 UnknownHostException 오류가 발생합니다. 이 시나리오는 일반적으로 지리적 위치 라우팅 정책이 있지만 레코드에 서버의 지리적 위치에 대한 DNS 응답이 없는 경우에 발생합니다.

$ dig noanswer.example.com

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49948
;; flags: qr rd ra; QUERY: 1,
    ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; AUTHORITY SECTION:
example.com.   
    300    IN    SOA    ns1.example.com. ns2.example.com. 1 7200 900 1209600 86400

애플리케이션 수준 문제 해결

dig 또는 nslookup 명령에서 유효한 응답을 받았지만 Java 애플리케이션에서 UnknownHostException 오류가 계속 발생하는 경우 애플리케이션 수준 문제일 수 있습니다. 애플리케이션 수준 문제를 해결하려면 다음 방법을 시도해 보세요.

  • 애플리케이션을 다시 시작합니다.
  • Java 애플리케이션에 잘못된 DNS 캐시가 없는지 확인합니다. 가능하면 DNS TTL을 준수하도록 애플리케이션을 구성합니다. 고정 TTL을 사용하려면 60초 이하를 지정합니다. 자세한 내용은 DNS 이름 조회에 대한 JVM TTL 설정을 참조하세요.

네트워크 중단 확인

Java 애플리케이션에 Amazon EC2 인스턴스를 사용하는 경우 드물지만 네트워크 중단이 발생할 수 있습니다. dig 또는 nslookup 응답에서 DNS 확인자 또는 서버에 반복적으로 연결할 수 없다는 것을 확인할 수 있습니다. 이 경우 AWS 리전에 활성 네트워크 중단이 발생하는지 확인합니다.

Route 53 확인자 엔드포인트를 통해 Route 53 프라이빗 호스팅 영역에 연결하는 온프레미스 서버를 사용하는 경우 VPC에 있는 엔드포인트의 구성을 확인합니다. 보안 그룹, 네트워크 액세스 제어 목록(ACL) 및 라우팅 테이블에 대한 설정을 검토합니다.

DNS 구성 확인

UnknownHostException 오류가 간헐적으로 발생하는 경우 Amazon EC2 DNS 한도가 요인일 수 있습니다. 이 한도는 각 네트워크 인터페이스에서 초당 1,024개 패킷이며 이 한도를 늘릴 수는 없습니다. Amazon에서 제공하는 DNS 서버에서 지원하는 초당 DNS 쿼리 수는 쿼리 유형, 응답 크기 및 프로토콜 유형에 따라 다릅니다. 자세한 내용은 Amazon에서 제공한 DNS 서버에 대한 내 DNS 쿼리가 VPC DNS 조절로 인해 실패하는지 확인하려면 어떻게 해야 합니까?를 참조하세요.

dig 또는 nslookup 명령에서 NXDOMAIN 또는 NOERROR(Answer 섹션 없이) 응답이 반환되는 경우 DNS 호스팅 영역을 검토하여 DNS 레코드가 올바르게 구성되었는지 확인합니다. Route 53 프라이빗 호스팅 영역을 사용하는 경우 필요한 VPC에 연결되어 있는지 확인합니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?