관리 메뉴

진취적 삶

15 AWS 와 GCP로 배포하기 본문

개발 도서/Node.js 교과서

15 AWS 와 GCP로 배포하기

hp0724 2023. 7. 14. 11:49

서비스를 출시한 이후에 서버에 문제가 생기면 서비스 자체에 심각한 타격을 입는다.

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

깃에 추가하지 않을 폴더를 적으면된다.