Skip to content

Latest commit

 

History

History
230 lines (146 loc) · 7.47 KB

File metadata and controls

230 lines (146 loc) · 7.47 KB

Deploying Node.js Applications

From Development to Production

Contents

  1. Preparing for Deployment
  2. Deployment Steps & Config
  3. Security

1. Theory

Which Kind of Application?

  • 우리가 만들었던 Backend 서버는Node Framwork인 Express로 구성했습니다.
  • 이 서버는 대기하다가 요청이 들어오면 응답을 주면 됩니다.
  • 웹 서버에서도 마찬가지로 npm start를 하고 들어오는 요청을 기다리는 방식을 사용하면 됩니다.

Preparing the Code for Production

  • Use Environment Variables : 코드에서 하드코딩을 피한다.
  • Use Production API Keys : 테스트 API 키를 사용하지 않는다.
  • Reduce Error Output Details : 유저에게 자세한 에러 내용을 보내지 않는다.
  • Set Secure Response Headers : 보안에 필요한 헤더를 구현하자.

주로 클라우드에서 관리해주는 것들

  • Add Asset Compression : 사용자에게 주는 데이터를 최소로 하자.
  • Configure Logging : 서버에서 일어나는 일들을 항상 관리하자.
  • Use SSL/TLS : 주고받는 데이터를 암호화 해서 보내자.

2. 프로젝트에 적용하기

  • 여기서는 이전에 MVC 패턴으로 만들었던 Node Shop(깃허브에 업로드한 project1-2)프로젝트를 사용하도록 하겠습니다.

Node Environment Variable 사용하기

  • 기존에 3자 패키지를 사용할때 API 키를 가져왔습니다. 이 키에는 비밀번호가 들어있어서 웹 서버에 올리게 되면 보안 문제가 발생합니다.
  • 기존에 사용한 타사 패키지 API는 Stripe(메일 서비스), MongoDB(DB 서비스) 입니다.
  • 따라서 이 키를 서버에 배포되지 않도록 관리하도록 하겠습니다.
  • 또한 app.js에서 대기하는 포트를 지정해줬습니다. 이 포트는 클라우드에서 자동으로 설정하므로 포트도 환경변수로 설정해 줍시다.

mongoDB와 PORT 번호, Stripe Key 환경변수로 설정하기

  1. app.js

    • mongoDB URL 환경변수로 수정하기 process는 노드에서 제공하는 변수입니다.

      const MONGODB_URI = `mongodb+srv://${process.env.MONGO_USER}:${process.env.MONGO_PASSWORD}@nodeshop-s8bpd.gcp.mongodb.net/${MONGO_DEFAULT_DATABASE}?retryWrites=true&w=majority`;
    • port 설정하기

      mongoose
        .connect(MONGODB_URI)
        .then((result) => {
      // 클라우드가 자동으로 설정해주거나 3000 port
          app.listen(process.env.PORT || 3000);
        })
        .catch((err) => {
          console.log(err);
        });
  2. controllers/shop.js

    • stripe Key 환경변수로 설정하기

      const stripe = require('stripe')(process.env.STRIPE_KEY);

node HELMET 이용하여 headers 보안 유지하기

  1. $npm i --save helmet

  2. app.js

    • helmet 패키지가 모든 요청에 안전한 응답을 하기 위해 app.js에 적용해준다.

      const helmet = require('helmet');
      
      app.use(helmet());
  3. header 확인

    • header를 보면 보안을 위해 옵션이 추가 된 것을 알 수 있습니다.. 자세한 기능은 아래 공식 docs를 참고합시다. Helmet

node compression 이용해서 asset 압축하기

  1. npm i --save compression

  2. app.js

    • 미들웨어로 설정하기

      const compresison = require('compression')
      app.use(compression());
  3. 기능

    • 해당 패키지를 사용하면 CSS, JavaScript 파일이 압축해서 Client에게 전달 됩니다.
    • 그렇기 때문에 조금 더 나은 사용자 경험을 제공합니다.
    • 대부분의 호스팅 서버에서는 제공하는 기능이므로 왠만하면 사용할 일이 없습니다.

morgan을 이용해서 request log 확인하기

  1. $npm i --save morgan

  2. app.js

    • morgan 미들웨어로 설정하기

      const morgan = require('morgan');
      
      app.use(morgan('combined'));
    • Log Data 파일에 저장하기

      const fs = require('fs');
      
      // {flags : 'a'} -> append 옵션: 덮어쓰지 않고 새로 쓰겠어
      const accessLogStream = fs.createWriteStream(
        path.join(__dirname, 'access.log'),
        { flags: 'a' }
      );
  3. 다른 방법으로 로깅하기

SSL/TLS 사용하기

  • TLS가 SSL의 최신 버전이고 보면 됩니다.
  • 이 기술은 클라이언트에서 보낸 데이터를 보호하는 것입니다.
  • 보호하는 방법은 SST/TLS 암호화 라고 합니다.
  • 암호화를 위해 Public keyPrivate Key를 사용합니다.
  • OpenSSL은 2013년도에 문제점이 발견되어 TLS로 대체 되었습니다.
  1. https://slproweb.com/products/Win32OpenSSL.html에서 Win64 OpenSSL v1.1.1f 설치하기

Heroku 사용하기

HostingProvider

  • AWS, Heroku는 클라우드에 코드를 올리면 SSL Compression, Logging 등 다양한 기능을 자동으로 제공합니다.
  • 우리느 Heroku를 사용해봅시다.
  1. https://id.heroku.com/login 에서 로그인하고 create App 하기

  2. Deploy에서 Deploy Method를 Heroku Git으로 설정하기

    • Heroku CLI 설치하기
  3. heroku 사용하기

    $ cd my-project/
    $ git init
    $ heroku git:remote -a node-shop-test1
  4. package.json

    • egines 추가해주기

        "engines": {
          "node": "10.9.0"
        },
  5. Procfile

    • 루트 폴더에 Procfile 생성하기 : 어떤 언어인지 명시하기 web: node app.js
  6. .gitignore

    • node_modules를 추가해줍니다. Heroku에는 이미 Package가 설정 되어 있습니다..
  7. Heroku 사이트에서 환경변수 설정하기

    • 기존에 로컬에서 사용하던 환경변수를 사용하기 위해서는 Heroku Dashboard에서 환경변수를 설정해야 합니다.

      HerokuEnvSetting

  8. git 업로드하기

    • 준비가 되면 코드를 업로드 합니다.

      $ git add.
      $ git commit -m "prepared for deployment"
      $ git push heroku master
  9. Deploy 확인하기

    • 앱을 열어보니 Error가 발생했습니다.
    • Error를 확인하기 위해 Bash에서 heroku logs를 입력하면 log를 확인할 수 있습니다.
  10. mongoDB에 접근할 수 있도록 Atlas 설정하기

    • heroku 서버는 IP 가 동적을 할당 되어 있기 때문에 Atlas에 모든 IP가 접근할 수 있도록 열어줍니다.
    • 이렇게 설정해도 비밀번호가 필요하기 때문에 안전합니다. (그전 보다는 위험)

정상적으로 빌드완료!

HerokuBuilded

  • Heroku는 일반적으로 AWS에 가격이 비쌉니다. 따라서! 개인 프로젝트에만 사용하도록 하고 트래픽이 많이 발생하는 서버를 제작할 때는 AWS 서비스를 사용합시다.