수색…


설정 NODE_ENV = "생산"

프로덕션 배포는 여러 가지 방법으로 다양하지만 프로덕션에 배포 할 때 표준 규칙은 NODE_ENV 라는 환경 변수를 정의하고 그 값을 "production"으로 설정하는 것입니다.

런타임 플래그

응용 프로그램 (외부 모듈 포함)에서 실행중인 모든 코드는 NODE_ENV 의 값을 확인할 수 있습니다.

if(process.env.NODE_ENV === 'production') {
    // We are running in production mode
} else {
   // We are running in development mode
}

종속성

NODE_ENV 환경 변수가 'production'으로 설정되면 package.json 파일 모든 devDependenciesnpm install 실행할 때 완전히 무시됩니다. --production 플래그로 이것을 강제 할 수도 있습니다 :

npm install --production

NODE_ENV 를 설정 NODE_ENV 다음 방법 중 하나를 사용할 수 있습니다.

방법 1 : 모든 노드 응용 프로그램에 대해 NODE_ENV를 설정하십시오.

Windows :

set NODE_ENV=production

리눅스 또는 다른 유닉스 기반 시스템 :

export NODE_ENV=production

이것은 현재 bash 세션에 대해 NODE_ENV 를 설정 NODE_ENV 명령문 이후에 시작된 모든 응용 프로그램은 NODE_ENVproduction 설정합니다.

방법 2 : 현재 응용 프로그램에 대해 NODE_ENV 설정

NODE_ENV=production node app.js

현재 앱에 대해서만 NODE_ENV 가 설정됩니다. 이는 다양한 환경에서 앱을 테스트 할 때 도움이됩니다.

방법 3 : .env 파일을 만들고 사용하십시오.

여기에 설명 된 아이디어가 사용 됩니다 . 자세한 내용은이 게시물을 참조하십시오.

기본적으로 .env 파일을 만들고 환경에 설정하기 위해 bash 스크립트를 실행합니다.

bash 스크립트 작성을 피하기 위해 env-cmd 패키지를 사용하여 .env 파일에 정의 된 환경 변수를로드 할 수 있습니다.

env-cmd .env node app.js

방법 4 : cross-env 패키지 사용

패키지를 사용하면 모든 플랫폼에 대해 환경 변수를 한 가지 방법으로 설정할 수 있습니다.

npm으로 설치 한 후 다음과 같이 package.json 의 배포 스크립트에 추가 할 수 있습니다.

"build:deploy": "cross-env NODE_ENV=production webpack"

프로세스 관리자로 앱 관리

프로세스 관리자가 제어하는 ​​NodeJS 앱을 실행하는 것이 좋습니다. 프로세스 관리자는 응용 프로그램을 영구적으로 유지하고, 실패시 다시 시작하며, 중단 시간없이 다시로드하고 관리를 단순화하는 데 도움이됩니다. 이들 중 가장 강력한 것은 ( PM2 와 마찬가지로)로드 밸런서가 내장되어 있습니다. 또한 PM2를 사용하여 응용 프로그램 로깅, 모니터링 및 클러스터링을 관리 할 수 ​​있습니다.

PM2 프로세스 관리자

PM2 설치 :

npm install pm2 -g

로드 밸런서가 통합 된 클러스터 모드에서 프로세스를 시작하여 프로세스간에로드를 분산시킬 수 있습니다.

pm2 start app.js -i 0 --name "api" ( -i 는 스폰 할 프로세스 수를 지정하고 0이면 프로세스 수는 CPU 코어 수를 기반으로합니다)

프로덕션 환경에서 여러 사용자를 보유하고 있지만 PM2에 대해 단일 지점을 가져야합니다. 따라서 pm2 명령 앞에는 위치 (PM2 config의 경우)가 있어야하며 그렇지 않은 경우 홈 디렉토리에 config가있는 모든 사용자에 대해 새로운 pm2 프로세스가 생성됩니다. 그리고 그것은 모순이 될 것입니다.

사용법 : PM2_HOME=/etc/.pm2 pm2 start app.js

PM2를 사용한 배포

PM2Node.js 응용 프로그램의 프로덕션 프로세스 관리자로, 응용 프로그램을 영구적으로 유지하고 가동 중단없이 다시로드 할 수 있습니다. 또한 PM2를 사용하여 응용 프로그램 로깅, 모니터링 및 클러스터링을 관리 할 수 ​​있습니다.

pm2 전역으로 설치하십시오.

npm install -g pm2

그런 다음 PM2. 사용하여 node.js 앱을 실행합니다 PM2.

pm2 start server.js --name "my-app"

여기에 이미지 설명을 입력하십시오.

다음 명령은 PM2 작업하는 동안 유용합니다.

실행중인 모든 프로세스 나열 :

pm2 list

앱 중지 :

pm2 stop my-app

앱 다시 시작 :

pm2 restart my-app

앱에 대한 자세한 정보를 보려면 다음 단계를 따르세요.

pm2 show my-app

PM2의 레지스트리에서 앱을 삭제하려면 다음 단계를 따르세요.

pm2 delete my-app

프로세스 관리자를 사용하여 배포

프로세스 관리자는 일반적으로 프로덕션에서 nodejs 응용 프로그램을 배포하는 데 사용됩니다. 프로세스 관리자의 주요 기능은 충돌이 발생하면 서버를 다시 시작하고 자원 소비를 확인하며 런타임 성능을 향상시키고 모니터링하는 것입니다.

노드 커뮤니티에서 만든 인기있는 프로세스 관리자 중 일부는 영원히 pm2입니다.

Forvever

forever 는 주어진 스크립트가 지속적으로 실행되도록하는 명령 줄 인터페이스 도구입니다. forever 의 간단한 인터페이스는 Node.js 앱과 스크립트의 소규모 배포를 실행하는 데 이상적입니다.

forever 프로세스를 모니터링하고 충돌이 발생하면 프로세스를 다시 시작합니다.

전 세계적으로 forever 설치하십시오.

$ npm install -g forever

응용 프로그램 실행 :

$ forever start server.js

그러면 서버가 시작되고 프로세스 ID (0부터 시작)가 제공됩니다.

응용 프로그램 재시작 :

$ forever restart 0

여기서 0 은 서버의 ID입니다.

신청 중지 :

$ forever stop 0

다시 시작과 마찬가지로 0 은 서버 ID입니다. 영원히 주어진 id 대신에 프로세스 id 나 스크립트 이름을 줄 수도있다.

기타 명령 : https://www.npmjs.com/package/forever

dev / qa, staging 등과 같은 다양한 환경에서 다른 속성 / 구성 사용

대규모 응용 프로그램은 다른 환경에서 실행될 때 종종 다른 속성을 필요로합니다. NodeJs 응용 프로그램에 인수를 전달하고 노드 프로세스에서 동일한 인수를 사용하여 특정 환경 속성 파일을로드함으로써이 작업을 수행 할 수 있습니다.

서로 다른 환경에 대한 두 개의 등록 정보 파일이 있다고 가정합니다.


  • dev.json

      {
          "PORT": 3000,
          "DB": {
              "host": "localhost",
              "user": "bob",
              "password": "12345"
          }
      }
    
  • qa.json

      {
          "PORT": 3001,
          "DB": {
              "host": "where_db_is_hosted",
              "user": "bob",
              "password": "54321"
          }
      }
    

응용 프로그램의 다음 코드는 사용할 각 속성 파일을 내보낼 것입니다.

process.argv.forEach(function (val) {
    var arg = val.split("=");
    if (arg.length > 0) {
        if (arg[0] === 'env') {
            var env = require('./' + arg[1] + '.json');
            exports.prop = env;
        }
    }
});

우리는 다음과 같이 응용 프로그램에 인수를 제공합니다.

node app.js env=dev

우리가 프로세스 관리자를 영원히 좋아하는 것처럼 사용한다면

forever start app.js env=dev

클러스터 활용

Node.js의 단일 인스턴스는 단일 스레드에서 실행됩니다. 멀티 코어 시스템을 이용하려면 사용자는로드를 처리하기 위해 Node.js 프로세스의 클러스터를 시작해야하는 경우가 있습니다.

 var cluster = require('cluster');
    
    var numCPUs = require('os').cpus().length;
    
        if (cluster.isMaster) {
          // In real life, you'd probably use more than just 2 workers,
          // and perhaps not put the master and worker in the same file.
          //
          // You can also of course get a bit fancier about logging, and
          // implement whatever custom logic you need to prevent DoS
          // attacks and other bad behavior.
          //
          // See the options in the cluster documentation.
          //
          // The important thing is that the master does very little,
          // increasing our resilience to unexpected errors.
            console.log('your server is working on ' + numCPUs + ' cores');
            
             for (var i = 0; i < numCPUs; i++) {
                    cluster.fork();
                  }
             
          cluster.on('disconnect', function(worker) {
            console.error('disconnect!');
            //clearTimeout(timeout);
            cluster.fork();
          });
    
          
        } else {
            require('./app.js');
        
        }


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow