15. AWS와 GCP로 배포하기

진영민·2022년 9월 12일
0

Node.js 교과서

목록 보기
13/13

해당 글은 Node.js 교과서의 내용을 요약, 정리한 글입니다.

필요한 패키지

morgan & express-session

//app.js
if(process.env.NODE_ENV === 'production'){
	app.use(morgan('combined'));
} else {
	app.use(morgan('dev'));
}

process.env.NODE_ENV는 배포 환경인지 개발 환경인지 판단할 수 있는 환경 변수이다.
combined모드는 dev 모드에 비해 더 많은 사용자 정보를 남기며, 추후 버그를 수정할 때 더 유용하게 사용할 수 있다.

//app.js
const sessionOption = {
	resave: false,
    saveUninitialized:false,
    secret:process.env.COOKIE_SECRET,
    cookie:{
    	httpOnly: true,
        secure: false,
    },
};
if(process.env.NODE_ENV === 'production'){
	sessionOption.proxy = true;
}
app.use(session(sessionOption));

sequelize

require(dotenv').config();

module.exports = {
	development: {
    	username: 'root',
        password: process.env.SEQUELIZE_PASSWORD,
        database: 'nodebird',
        host: '127.0.0.1',
        dialect: 'mysql',
    },
    test: {
    	username: 'root',
        password: process.env.SEQUELIZE_PASSWORD,
        database: 'nodebird_test',
        host: '127.0.0.1',
        dialect: 'mysql',
    },
    production: {
    	username: 'root',
        password: process.env.SEQUELIZE_PASSWORD,
        database: 'nodebird',
        host: '127.0.0.1',
        dialect: 'mysql',
        logging:false,
    }
};

js 파일이므로 dotenv를 사용할 수 있다.
username이나 host 속성은 숨기는 것이 좋다.

//.env
SEQUELIZE_PASSWORD=데이터베이스 비밀번호

cross-env

cross-env 패키지를 사용하면 동적으로 process.env를 사용할 수 있다.
$npm i cross-env

//package.json
{
	...
    "scripts":{
    	"start":"cross-env NODE_ENV=production PORT=80 node server",
        "dev":"nodemon server",
        "test":"jest"
    }
    ...
}

crossenv 사건

사람들이 실수로 cross-env 대신에 crossenv를 설치해서 발생한 사건
crossenv는 .env파일에 들어 있는 키들을 해커에게 전송하는 악성 패키지였음.

sanitize-html, csurf

sanitize-html은 XSS(Cross Site Scripting)
csurf는 CSRF(Cross Site Request Forgery)공격을 막기 위한 패키지이다.
$npm i sanitize-html
$npm i csurf

const sanitizeHtml = require('sanitize-html');

sanitizeHtml(내용);

사용자가 업로드한 HTML을 sanitize-html 함수로 감싸면 허용하지 않는 태그나 스크립트가 제거된다.

const csrf = require('csurf');
const csrfProtection = csrf({cookie:true});

app.get('/form', csrfProtection,(req,res)=>{
	res.render('csrf',{csrfToken:req.csrfToken()});
});

app.post('/form',csrfProtection, (req,res)=>{
	res.send('ok');
});

form 같은 것을 렌더링할 때 CSRF토큰을 같이 제공한다.
현재 cookie를 사용하는 것으로 옵션을 설정했으므로 cookie-parser 패키지도 연결되어 있어야 한다.

pm2

개발할 때 nodemon을 쓴다면 배포할 때는 pm2를 쓴다는 말이 있을 정도로 유용한 패키지.
가장 큰 기능은 서버가 에러로 인해 꺼졌을 때 서버를 다시 켜주는 일이다.
또한, 멀티 프로세싱을 지원하여 노드 프로세스를 한개 이상으로 늘릴 수 있다.

하지만 멀티 스레딩이 아니므로 메모리 자원을 공유하지는 못한다. 이를 위해 레디스 같은 서비스를 이용한다.
$npm i pm2

//package.json
{
	...
    "scripts":{
    	"start":"cross-env NODE_ENV=production PORT=80 pm2 start server.js",
        ...
}

pm2가 서버를 백그라운드로 돌리므로 명령어를 입력할 수 있다.
$npx pm2 list
백그라운드에서 돌고 있는 노드 프로세스를 확인한다.

npx pm2 kill
npx pm2 reload all
등의 명령어가 있다.

//package.json
{
	...
    "scripts":{
    	"start":"cross-env NODE_ENV=production PORT=80 pm2 start server.js -i 0",
        ...
}

-i 뒤에 써 있는 숫자 만큼 프로세스를 생성한다는 뜻이다. 0은 현재 CPU코어 개수만큼 프로세스를 생성하겠다는 뜻이고, -1은 CPU코어 개수보다 한 개 덜 생성하겠다는 뜻이다.
npx pm2 monit
명령어로 현재 프로세스를 모니터링할 수 있다.

winston

실제 서버를 운영할 때 로그를 남기는 패키지이다.
$npm i winston

helmet, hpp

서버의 각종 취약점들을 보완해주는 패키지이다.

//app.js
const helmet = require('helmet');
const hpp = require('hpp');

app.use(helmet({contentSecurityPolicy:false}));
app.use(hpp());

connect-redis

멀티 프로세스 간 세션 공유를 위해 레디스와 익스프레스를 연결해주는 패키지이다.
$npm i redis connect-redis
레디스를 사용하려면 레디스 데이터베이스를 설치해야 한다.
서버에 직접 설치할 수도 있지만 호스팅해주는 서비스를 쓰는 것이 편리하다.
redislabs

nvm, n

노드 버전을 업데이트하기 위한 패키지이다.
윈도우에서는 nvm을 사용하고 리눅스나 맥에서는 n을 사용한다.

깃, 깃허브

여기까지 따라오실 정도면 기본적인 깃 사용법은 아실 거라 믿습니다...
이 책에서도 자세히 알려주지는 않으니 제 블로그 git 교과서 편을 참고해주세요.

AWS 시작하기

aws를 생성하고 ssh키를 이용하여 접속하고 실행하는 방법입니다.

GCP 시작하기

구글 클라우드 플랫폼입니다.aws와 상당히 유사합니다.

profile
코린이

0개의 댓글