연결 문제 해결
이 페이지의 내용
이 페이지에서는 MongoDB Node.js 드라이버를 사용하여 MongoDB 배포에 연결할 때 발생할 수 있는 문제에 대한 잠재적인 해결 방법을 제공합니다.
참고
이 페이지에서는 연결 문제만 다룹니다. MongoDB 또는 드라이버에 다른 문제가 발생하는 경우 다음 리소스를 방문하세요.
Node.js 운전자 에 대한 자주 묻는 질문( FAQ )
버그 보고 , 운전자 기여, 추가 리소스 찾기에 대한 정보가 포함된 문제 & 도움말 페이지
질문, 토론 또는 일반적인 기술 지원을 위한 MongoDB Community 포럼
연결 오류
다음 오류 메시지는 드라이버가 지정된 호스트 이름 또는 포트의 서버에 연결할 수 없음을 나타냅니다. 여러 상황에서 이 오류 메시지가 발생할 수 있습니다. 이 샘플 오류 메시지에서 호스트 이름은 127.0.0.1
(이)고 포트는 27017
입니다.
Error: couldn't connect to server 127.0.0.1:27017
다음 섹션에서는 잠재적으로 문제를 해결하기 위해 취할 수 있는 조치에 대해 설명합니다.
연결 문자열 확인
연결 문자열의 호스트 이름과 포트 번호가 모두 정확한지 확인하세요. MongoDB 인스턴스의 기본 포트 값은 27017
(이)지만 다른 포트에서 통신하도록 MongoDB를 구성할 수 있습니다.
방화벽 구성
MongoDB 배포 서버가 수신하는 포트가 동일한 네트워크의 방화벽에 의해 차단되지 않았는지 확인합니다. MongoDB는 기본적으로 포트 27017
을(를) 사용합니다. MongoDB에서 사용하는 기본 포트 및 변경 방법에 대한 자세한 내용은 기본 MongoDB 포트를 참조하세요.
경고
MongoDB deployment에서 사용되는 포트인지 확실하지 않은 경우 방화벽에서 포트를 열지 않도록 합니다.
연결 거부 오류
드라이버가 MongoDB 인스턴스에 연결하려고 할 때 연결이 거부되면 다음 오류 메시지가 생성됩니다.
MongoServerSelectionError: connect ECONNREFUSED <IPv6 address>:<port>
다음 섹션에서는 잠재적으로 문제를 해결하기 위해 취할 수 있는 조치에 대해 설명합니다.
MongoDB와 클라이언트가 동일한 프로토콜을 사용하는지 확인
Node.js v17 이상에서는 클라이언트와 호스트가 모두 둘 다 지원하는 경우 DNS 확인자(resolver)가 기본적으로 IPv6
을 사용합니다. 예를 들어 MongoDB가 IPv4를 사용하고 클라이언트가 IPv6을 사용하는 경우 드라이버는 이전 오류 메시지를 반환합니다.
mongod
또는 mongos
(으)로 시작할 때 IPv6
모드를 사용하도록 MongoDB 배포서버를 구성할 수 있습니다. IPv6
모드를 지정하는 방법에 대한 자세한 내용은 서버 매뉴얼의 IP 바인딩을 참조하세요.
대안으로 MongoClient에 을 옵션으로 지정하여 클라이언트 에서 을(를)명시적으로 사용할 수 있습니다.IPv4
family: 4
const client = new MongoClient(uri, { family: 4, });
ECONNRESET 오류
드라이버가 client.connect()
를 호출할 때 연결이 재설정되면 다음 오류 메시지가 생성됩니다.
MongoServerSelectionError: connect ECONNRESET ::<IP address>:<port>
다음 섹션에서는 문제를 해결하는 데 도움이 될 수 있는 방법에 대해 설명합니다.
파일 디스크립터 수 제어
파일 디스크립터는 열린 프로세스와 연관된 고유 식별자입니다. 대부분의 운영 체제에서 드라이버의 각 열린 연결은 파일 디스크립터와 연결됩니다. 운영 체제에는 일반적으로 단일 프로세스에서 사용하는 파일 디스크립터 수에 제한이 있습니다. 연결 수가 이 제한을 초과하면 ECONNRESET
오류가 발생할 수 있습니다.
maxPoolSize
를 설정하여 최대 연결 수를 설정할 수 있습니다. 이 오류를 해결하려면 maxPoolSize
값을 설정하여 허용되는 최대 연결 수를 줄일 수 있습니다. 또는 운영 체제에서 파일 설명자(descriptor) 제한을 늘릴 수도 있습니다.
경고
운영 체제의 구성을 변경할 때는 항상 주의하세요.
인증 오류
승인이 올바르게 구성되지 않은 경우 Node.js 드라이버가 MongoDB 인스턴스에 연결하지 못할 수 있습니다. 인증에 SCRAM-SHA-256
을 사용하는데 드라이버가 연결에 실패할 경우, 드라이버에서 다음 메시지 중 하나와 유사한 오류 메시지를 표시할 수 있습니다:
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server <hostname>:<port>.
connection() error occurred during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-256": (AuthenticationFailed) Authentication failed.
다음 섹션에서는 잠재적으로 문제를 해결하기 위해 취할 수 있는 조치에 대해 설명합니다.
연결 문자열 확인
유효하지 않은 연결 문자열은 SCRAM-SHA-256
사용해 MongoDB에 연결하려고 할 때 인증 문제를 일으키는 가장 흔한 원인입니다.
팁
연결 문자열에 대한 자세한 내용은 연결 가이드의 연결 URI를 참조하세요.
연결 문자열에 사용자 이름과 암호가 포함된 경우 올바른 형식인지 확인합니다. 사용자 이름 또는 암호에 다음 문자가 포함된 경우 백분율로 인코딩해야 합니다.
: / ? # [ ] @
다음 예는 '#MyP@assword?'를 퍼센트 인코딩하는 방법을 보여줍니다.
console.log(encodeURIComponent('#MyP@assword?'));
이렇게 하면 다음과 같은 결과가 출력됩니다.
"%23MyP%40assword%3F"
사용자가 인증 데이터베이스에 있는지 확인하기
SCRAM-SHA-256
에서 사용자 이름과 암호를 사용하여 연결을 성공적으로 인증하려면 사용자 이름을 인증 데이터베이스에 정의해야 합니다. 기본 인증 데이터베이스는 admin
데이터베이스입니다. 인증에 다른 데이터베이스를 사용하려면 연결 문자열에 authSource
을(를) 지정하세요. 다음 예시에서는 드라이버에 users
을(를) 인증 데이터베이스로 사용하도록 지시합니다.
const { MongoClient } = require("mongodb"); const uri = "mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users"; const client = new MongoClient(uri);
동일한 코드를 사용하여 로컬 시스템에서 호스팅되는 MongoDB 인스턴스에 연결을 시도하여 이것이 문제인지 확인할 수 있습니다. 동일한 머신의 배포서버에는 연결하는 데 권한 부여가 필요하지 않습니다.
메시지 전송 오류
요청을 한 후 드라이버가 명령을 전송하지 못하면 다음과 같은 오류 메시지가 표시될 수 있습니다.
com.mongodb.MongoSocketWriteException: Exception sending message
다음 섹션에서는 잠재적으로 문제를 해결하기 위해 취할 수 있는 조치에 대해 설명합니다.
사용자 권한 확인
올바른 사용자로 MongoDB deployment에 액세스했는지 확인하세요. 오류의 '메시지'라는 용어는 드라이버가 보낸 명령일 수 있습니다. 명령을 보낼 권한이 없는 사용자를 사용하는 경우 드라이버에서 이 오류가 발생할 수 있습니다.
또한 사용자에게 보내는 메시지에 대한 적절한 권한이 있는지 확인하세요. MongoDB는 RBAC(역할 기반 액세스 제어)를 사용하여 MongoDB 배포서버에 대한 액세스를 제어합니다. MongoDB에서 RBAC를 구성하는 방법에 대한 자세한 내용은 기본 MongoDB 포트를 참조하세요.
방화벽 구성
방화벽에는 MongoDB 인스턴스와 통신할 수 있는 개방형 포트가 있어야 합니다. 방화벽 구성 정보는 연결 오류 섹션의 방화벽 구성에서 자세히 확인하세요.
연결 횟수 확인
각 MongoClient
인스턴스는 연결 풀에서 최대 동시 개방 연결 수를 지원합니다. 이 제한을 정의하는 매개변수 maxPoolSize
을(를) 구성할 수 있습니다. 기본값은 100
입니다. maxPoolSize
만큼 열려 있는 연결이 이미 여러 개 있는 경우 서버는 연결을 사용할 수 있을 때까지 기다립니다. 이 대기 시간이 maxIdleTimeMS
값을 초과하면 드라이버는 오류로 응답합니다.
연결 풀링의 동작 방식에 대한 자세한 내용은 FAQ의 노드 드라이버에서 연결 풀링은 어떻게 동작하나요? 를 참조하세요.
열려 있는 연결이 너무 많음
드라이버는 연결을 열려고 시도하지만 최대 연결 수에 도달하면 다음과 같은 오류 메시지를 생성합니다.
connection refused because too many open connections
다음 섹션에서는 문제를 해결하는 데 도움이 될 수 있는 방법에 대해 설명합니다.
연결 횟수 확인
열린 연결을 더 많이 만들려면 maxPoolSize
값을 늘리세요. 연결 수를 확인하는 방법에 대한 자세한 내용은 오류 메시지 전송 중 연결 수 확인 섹션을 참조하세요.
시간 초과 오류
네트워크가 드라이버의 요청을 서버에 충분히 빠르게 전달하지 못하면 타임아웃이 발생할 수 있습니다. 이 경우 다음 메시지와 유사한 오류 메시지가 나타날 수 있습니다.
timed out while checking out a connection from connection pool: context canceled
이 오류가 발생하면 다음 조치를 시도하여 문제를 해결하세요.
연결 제한 시간 설정
연결할 수 없는 복제본 세트 노드에 도달하는 데 시간이 너무 오래 걸려서 연결을 설정할 수 없는 경우 드라이버가 중단될 수 있습니다. connectTimeMS
설정을 사용하면 드라이버가 연결을 시도하는 데 소요되는 시간을 제한할 수 있습니다. 이 설정에 대해 자세히 알아보려면 서버 매뉴얼의 시간 초과 옵션 을 참조하세요.
connectTimeoutMS
설정이 해당 세트의 멤버에 대한 최대 네트워크 지연 시간보다 낮지 않은지 확인합니다. 세컨더리 멤버 중 하나의 지연 시간이 10000밀리초인 경우 connectTimeoutMS
를 9000으로 설정하면 드라이버가 해당 멤버에 연결되지 않습니다.
다음 예에서는 connectTimeoutMS
을(를) 10000밀리초로 설정합니다.
const client = new MongoClient(uri, { connectTimeoutMS: 10000, });
연결 횟수 확인
서버에 대한 연결 수가 maxPoolSize
개를 초과할 수 있습니다. 연결 수를 확인하는 방법에 대한 자세한 내용은 오류 메시지 전송 중 연결 수 확인 섹션을 참조하세요.