node.js를 통해서 리눅스 서버에 ssh를 접속 한 다음 데이터베이스에 접속하는 경우, 구글링 하면 대부분의 소스코드들이 직관적이고 어렵지 않게 잘 나와 있다.
nodejs를 활용해서 tunnel-ssh을 활용하면 마찬가지로 쉽게 가능한데.. 막상 실제로 잘 나와있는 예제를 그대로 따라서 사용 해 보면 오류가 나거나 잘 안됬었다.
먼저 터널링을 위해서 tunnel-ssh을 설치한다.
npm install tunnel-ssh
터널링을 통해서 데이터베이스에 접속하는 방법은 아래 단계로 이루어진다.
1. ssh 접속
2. ssh 접속한 곳 에서 포트 포워딩
3. 데이터 베이스 접속
몽고db를 기준으로 작성 한 코드이다.
먼저 config에 내용에서 localport가 포트포워딩 한 이후 사용 할 가상 포트번호이다.
var tunnel = require('tunnel-ssh');
var mongoose = require("mongoose");
var config = {
username: '리눅스아이디',
password: '리눅스비번',
host: '접속할 리눅스주소',
port: 7616, //접속할 리눅스ssh포트
dstHost: '127.0.0.1', //최종목적지(내가 접속 할 데이터베이스)
dstPort: 26016, //최종목적지에서 사용할 포트(내가 접속 할 데이터베이스 포트)
localPort: 22000 //ssh가 접속후 사용할 가상포트번호
};
다음으로 서버에 접속해서, 데이터베이스에 접속하는 프로세스이다.
var server = tunnel(config, function (error, server) {
if (error) {
console.log('Error!! ', error);
} else {
if (server != null) {
var Schema = mongoose.Schema;
const url = 'mongodb://데이터베이스아이디:비밀번호@127.0.0.1:22000/데이터베이스명칭';
var conn = mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }).connection;
console.log(conn);
if(mongoose){
mongoose.disconnect();
}
if(server){
server.close();
}
}
}
});
포트포워딩 된 이후에 가상포트번호인 22000번으로 접속하게 하였다.
포트포워딩에서 같은 포트를 쓰면 오류가난다. 그러므로 쓸떼없는포트 아무거나 적어주자.
그런데...ssh까지는 접속이 잘 되는데 계속 아래 사진과 같은 오류가 났다.
실제로 동작했을 때 만난 오류이다.
구글링 해서 된다는 코드, 방법 다 붙여서 해 보았지만 저 오류를 피할 수는 없었다.
그러다가 config 옵션중에 ssh접속에서 키를 활용한 내용이 있어서 혹시나 하고 config설정을 바꾸어 보았다.
물론 key는 리눅스 서버에서 생성 후 putty를 통해서 해당 키를 통해서 접속이 되는지 테스트 한 이후에 진행하였다.
var tunnel = require('tunnel-ssh');
var mongoose = require("mongoose");
var config = {
username: '리눅스아이디',
password: '리눅스비번',
host: '접속할 리눅스주소',
port: 7616, //접속할 리눅스ssh포트
privateKey:require(fs).readFileSync('/path/to/key'), //리눅스에서 ssh접속시 사용할 키!!
dstHost: '127.0.0.1', //최종목적지(내가 접속 할 데이터베이스)
dstPort: 26016, //최종목적지에서 사용할 포트(내가 접속 할 데이터베이스 포트)
localPort: 22000 //ssh가 접속후 사용할 가상포트번호
};
위 내용까지 하고나서 접속을 시도하니 매우 잘되었다;
nodejs에서 제공되는 터널링과 관련된 모듈사용시 일반적인 방법이 안되면, 위 내용처럼 서버에서 키를 생성 한 이후에 키를 통한 접속방법을 적용하면 되는 것 같다.
다른 데이터베이스 접속도 마찬가지로 터널링 한 이후에 데이터베이스 접속과 관련된 코드를 작성하여주면 된다.
오라클, maria 등등 전부 말이다.
var tunnel = require('tunnel-ssh');
var mongoose = require("mongoose");
var config = {
username: '리눅스아이디',
password: '리눅스비번',
host: '접속할 리눅스주소',
port: 7616, //접속할 리눅스ssh포트
privateKey:require(fs).readFileSync('/path/to/key'), //리눅스에서 ssh접속시 사용할 키!!
dstHost: '127.0.0.1', //최종목적지(내가 접속 할 데이터베이스)
dstPort: 26016, //최종목적지에서 사용할 포트(내가 접속 할 데이터베이스 포트)
localPort: 22000 //ssh가 접속후 사용할 가상포트번호
};
var server = tunnel(config, function (error, server) {
if (error) {
console.log('Error!! ', error);
} else {
if (server != null) {
//원하는 데이터베이스 접속과 관련된 코드작성~
//오라클, 마리아, 포트스그레 등등..뭐든 상관 없다.
}
}
});
이런내용이 없어서 계속 만났던 커넥션 refuse가 참 얄밉다.
자바는 그런거없이도 잘 되던데..
'Node.js' 카테고리의 다른 글
Typescript 환경 구성을 통한 Express 사용(Node.js express Typescript) (0) | 2020.05.06 |
---|---|
Nodejs http client, NodeJs Http 클라이언트, 노드JS Http 요청 (0) | 2019.11.12 |
NodeJs Redis 기본 함수들(노드js 레디스, Node.js redis) (0) | 2019.08.19 |
NodeJs Redis 연동(NodeJs 레디스연동, zrangebyscore) (0) | 2019.08.16 |
NodeJs 오라클 연동 (NodeJs Oracle, Node.js Oracle, Oracle 연동) (16) | 2019.08.14 |
댓글