lang/node

Cluster를 이용한ws, wss 사용

C/H 2015. 9. 21. 08:30


웹과 스마트폰 클라이언트에서 WS, WSS 사용

  • WebBrowser HTTP > Node HTTP > Socket.io WS
  • WebBrowser HTTPS > NOde HTTPS > Socket.io WSS
  • SmartPhone > Socket.io WS
  • SmartPhone(SSL) > Socket.io WSS

평문/보안 연결 모두를 만족하는 방법은 노드에서 WS, WSS를 모두 제공하는 방법뿐입니다. 그 외 HTTPS > HTTP Proxy > WS 연결은 WS가 SSL연결이 되지 않은 관계로 SmartPhone > WSS 이 의미가 없으므로 고려 대상이 아니며, HTTP Proxy > WSS 은 wss handshake faild로 통신이 되지 않습니다.

이 부분은 KT클라우드 서비스를 이용 시 LB에서 이상동작이 있을 수 있습니다.
특히 GET 이외 POST/PUT/DELETE/WS/WSS 등에서 NULL문자가 포함되는 문제가 있을 수 있습니다.
해결책은 딱히 없으며 LB를 내렸다가 다시 올리거나 새롭게 구성해서 올릴 경우 정상 동작이 되는것을 2017.01.04 일 확인 했었습니다.
경험적인 내용이니 다른 결과가 나올 수 도 있습다.

모든 연결은 HTTPS > WSS, SmartPhone(SSL) > WSS 두 가지만 하는게 보안을 감안한다면 정석이지만 현재 이슈는 안드로이드5.0미만(4.4이하)에서 WSS Connection 에러가 발생(일반적인 상황이 아닌 특수한 상황입니다.)하는 관계로 어쩔 수 없이 WS, WSS 모두 서비스 해야 하는 상황에서 아래 코드를 적용해서 WS, WSS를 모두 사용.

코드

# cluster.js
var cluster = require('cluster');
//var numCPUs = require('os').cpus().length * 2; // http, https를 위해서 2배수 설정
var numCPUs = Math.round( require('os').cpus().length * 1.5 );

cluster.setupMaster({ exec: './app.js'});

if( cluster.isMaster ){
	for( var i=0, i < numPCUs; i++){
		cluster.fork({fork: i});
	}

	cluster.on('fork', function(worker){
		console.log("worker %s (%s) fork", worker.id, worker.process.pid);		
	});
	
	cluster.on('online', function(worker) {
		console.log("worker %s (%s) online", worker.id, worker.process.pid);
	});
	
	cluster.on('listening', function(worker, address) {
		console.log("worker %s listening %s:%s", worker.id, address.address||null, address.port||null);
	});
	
	cluster.on('disconnect', function(worker){
		console.log("worker %s (%s) disconnect", worker.id, worker.process.pid);
	});
}
cluster.on('exit', function(worker, code, signal) {
	console.log('worker ' + worker.process.pid + ' exit');
//	cluster.fork();
//	console.log('worker restart');
});
# app.js
if( process.env.fork % 2 === 0 ){
 // HTTPS, WSS 설정
}else{
 // HTTP, WS 설정
}


하나의 서버에 WS와 WSS를 사용하니 운영서버에서 SSL인증서가 깨지는 요상한 에러가 발생한다. 뭣 때문일까? 일단은 HTTPS+WSS만 사용하도록 설정을 돌려 놓았다. 인증서가 깨지는 원인은 체인인증서 적용이 잘 못되어서 문제가 된 경우이다. 하지만 위 내용으로 적용시 정상 동작은 운영서버에서 확인 하지 못 했으므로 아직은 실제 적용은 보류... 개인서버에서 테스트 후 다시 사용 유무에 대해서 덧글 추가할 예정이다. 2015.09.29 인증서는 문제가 없었다. 다만 node에서 체인인증서는 아파치나 엔진엑스와는 다르게 반대로 구성되어야 한다.


반응형

'lang > node' 카테고리의 다른 글

__file, __line 사용 magic-globals  (0) 2015.09.24
Node.js Chain 인증서 설정  (0) 2015.09.23
nodejs https > http Proxy  (0) 2015.09.17
Node.js SSL  (0) 2015.09.11
Node Mysql Reconnection  (0) 2015.09.04