진취적 삶
15 AWS 와 GCP로 배포하기 본문
서비스를 출시한 이후에 서버에 문제가 생기면 서비스 자체에 심각한 타격을 입는다.
15.1.1 morgan 과 express-session
개발용으로 설정되어 있는 미들웨어를 배포용으로 설정
if (process.env.NODE_ENV === "production") {
app.use(morgan("combined"));
} else {
app.use(morgan("dev"));
}
배포 환경일 때는 combined
개발 환경일때는 dev 모드
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));
15.1.2 시퀄라이즈
데이터 베이스도 배포환경으로 설정
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,
},
};ㅂ
15.1.4 sanitize-html csurf
sanitize-html 와 csurf 는 XSS 와 CSRF 공격을 막기 위한 패키지 이다
XSS는 악의적인 사용자가 사이트에 스크립트를 삽입하는 공격
CSRF 는 사용자가 의도치 않게 공격자가 의도한 행동을 하게 만드는 공격
XSS 방지
const sanitizeHtml = require('sanitize-html')
const html = " locaion.href = "<<a href=https://gilbut.co.kr>https://gilbut.co.kr</a>>""; console.log(sanitizeHtml(html))
CSRF 방지
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')
})
15.1.5 pm2
pm2 는 원활한 서버 운영을 위한 패키지
개발할때는 nodemon 배포할 때는 pm2 !
큰 기능은 서버가 에러로 인해 꺼졌을때 서버를 다시 켜주는 것
멀티 프로세스 지원
단점은 멀티 스레딩이 아니여서 서버의 메모리 같은 자원을 공유하지는 않는다.
npx pm2 list
백그라운드에서 돌고 있는 노드 프로세스 확인
로그 확인
npx pm2 logs
에러확인
npx pm2 logs --err
프로세스 종료
npx pm2 kill
서버 재시작
npx pm2 reload all
15.1.6 winston
실제 서버를 운영할 때 console.log 와 console.error 를 대체하기 위한 모듈
로그를 파일이나 다른 데이터 베이스에 저장해야 한다.
const { createLogger, format, transports } = require("winston");
const logger = createLogger({
level: "info",
format: format.json(),
transports: [
new transports.File({ filename: "combine.log" }),
new transports.File({ filename: "error.log", level: "error" }),
],
});
if (process.env.NODE_ENV !== "production") {
logger.add(new transports.Console({ format: format.simple() }));
}
module.exports = logger;
15.1.7 helmet, hpp
서버의 각종 취약점을 보완해주는 패키지 ,익스프레스 미들웨어로서 사용할수 있다.
배포 환경일때만 적용
if (process.env.NODE_ENV === "production") {
app.use(morgan("combined"));
app.use(
helmet({
contentSecurityPolicy: false,
crossOriginEmbedderPolicy: false,
crossOriginResourcePolicy: false,
})
);
app.use(hpp());
} else {
app.use(morgan("dev"));
}
15.1.8 connect -redis
멀티 프로세스 간 세션 공유를 위해 레디스와 익스프레스를 연결해주는 패키지
dotenv.config() 객체보다 아래에 있어야 한다.
const redisClient = redis.createClient({
url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`,
password: process.env.REDIS_PASSWORD,
legacyMode: true,
});
const redis = require("redis");
const RedisStore = require("connect-redis")(session);
session 을 인수로 넣어서 호출하자 . ocnnect-redis는 express-session에 의존성이 있다.
15.2 깃허브
15.2.1 gitignore
node_modules
uploads
*.log
coverage
깃에 추가하지 않을 폴더를 적으면된다.
'개발 도서 > Node.js 교과서' 카테고리의 다른 글
16 서버리스 노드 개발 (0) | 2023.07.14 |
---|---|
14 CLI 프로그램 만들기 (0) | 2023.07.14 |
13 실시간 경매 시스템 만들기 (0) | 2023.07.14 |
12 웹 소켓으로 실시간 데이터 전송하기 (0) | 2023.07.14 |
11 노드 서비스 테스트하기 (0) | 2023.07.14 |