[Node.js] http 모듈로 웹 서버 만들기 (3)

http 모듈로 웹 서버 만들기 (3)

https, http2

노드도 https를 지원한다.

https는 암호화 통신이기 때문에 인증이 필요하다. (기관에서 발급한 인증서가 필요)

무료 인증 중에 제일 유명한 건 let's encrypt

http2는 https 기반으로 동작하므로 인증서가 필요하다. 또한, http2는 express랑 호환 문제가 있어서 대신 spdy를 사용한다. http2가 https보다 속도가 약간 빠르다.

const http = require('http');
const https = require('https');
const http2 = require('http2');
const fs = require('fs');

// http server
http.createServer((req, res) => {
    res.end('http server');
}).listen(80);

// https server
https.createServer({
    // 암호화가 인증되었다는 내용을 적어줘야 한다.
    cert: fs.readFileSync('도메인 인증서 경로'),
    key: fs.readFileSync('도메인 비밀키 경로'),
    ca: [
    	fs.readFileSync('상위 인증서 경로'),
        fs.readFileSync('상위 인증서 경로'),
        fs.readFileSync('상위 인증서 경로'),
    ]
}, (req, res) => {
    res.end('https server');
}).listen(443);

// http2 server (node 10 기준 실험적인 모듈이라 아직 쓰기엔 이르다..)
http2.createSecureServer({
    // 암호화가 인증되었다는 내용을 적어줘야 한다.
    cert: fs.readFileSync('도메인 인증서 경로'),
    key: fs.readFileSync('도메인 비밀키 경로'),
    ca: [
    	fs.readFileSync('상위 인증서 경로'),
        fs.readFileSync('상위 인증서 경로'),
        fs.readFileSync('상위 인증서 경로'),
    ]
}, (req, res) => {
    res.end('https server');
}).listen(443);

cluster로 멀티 프로세싱 하기

노드는 싱글쓰레드이기 때문에 cpu의 코어를 하나만 사용한다는 단점이 있다.

클러스터링(clustering)을 통해 노는 코어들을 다 활용할 수 있다.

클러스터에는 master(관리자) 프로세스와 worker(일꾼) 프로세스가 있다. cluster.fork()로 워커를 만든다.

마스터는 워커들의 행동을 관리할 수 있다.

워커는 CPU의 코어 갯수만큼 생긴다. 워커는 요청을 나눠서 받는다. 즉, 코어의 개수만큼 요청을 받을 수 있다. 만약 모든 워커가 죽으면 서버도 죽으면서 더이상 요청이 보내지지 않는다.

const cluster = require('cluster');
const os = require('os');
const http = require('http');
const numCPUs = os.cpus().length;	// cpu코어 개수를 확인할 수 있다.

if(cluster.isMaster) {
    // process.pid로 현재 프로세스(마스터든 워커든)의 아이디를 가져올 수 있다.
    console.log('마스터 프로세스 아이디', process.pid);
    // 마스터인 경우 cpu 개수만큼 워커들을 만들어낸다.
    for(let i=0; i < numCPUs; i+=1) {
        cluster.fork();
    }
    // 워커가 일하다 쓰러진 경우(exit 한 경우)
    cluster.on('exit', (worker, code, signal) => {
        console.log(worker.process.pid, '워커가 종료되었습니다.');
        // 워커가 하나 죽었으니 다시 하나 만들어준다.
        cluster.fork();
    })
} else {
    // 워커인 경우(실제 서버를 만들고 리스닝 한다.)
    http.createServer((req, res) => {
        res.end('http server');
        // 요청마다 워커를 하나씩 죽인다. (테스트용)
        setTimeout(() => {
            process.exit(1);
        }, 1000)
    }).listen(8080);
    console.log(process.pid, '워커 실행');
}

댓글남기기