웹사이트 검색

PM2를 사용하여 Ubuntu VPS에서 Node.js 프로덕션 환경을 설정하는 방법


소개

이 튜토리얼은 Express, Geddy 또는 Sails 기반 앱을 포함하여 Node.js 애플리케이션을 실행하기 위해 Ubuntu 서버를 설정하는 데 도움을 주는 것을 목표로 합니다. 이러한 지침은 몇 가지 보안 실수를 피하는 데 도움이 될 뿐만 아니라 다음과 같은 몇 가지 놀라운 이점을 제공합니다.

  • 앱을 루트로 실행하지 않습니다. 따라서 앱이 더 안전해집니다.\n
  • 일반적으로 루트 사용자만 액세스할 수 있는 포트 80을 사용하여 앱을 실행하게 됩니다. (http://mysite.com과 같은 사용자 지정 URL을 사용하여 앱을 실행할 수 있지만 포트를 지정할 필요는 없습니다.)\n
  • 충돌이 발생하면 응용 프로그램이 다시 시작되고 처리되지 않은 예외 로그가 유지됩니다.\n
  • 서버가 시작되면 응용 프로그램이 다시 시작됩니다. 즉, 서비스로 실행됩니다.\n

이 지침은 독자가 Linux에 대한 기본 지식만 가지고 있다고 가정합니다. 필요하지 않은 정보는 건너뛸 수 있지만 단계를 면밀히 따르면 몇 가지 이점이 있습니다.

코드 실행을 위한 안전한 계정 만들기

DigitalOcean 드롭릿을 처음 설정할 때 루트 계정을 사용하여 로그온하라는 지침을 받았습니다. 지침은 다음과 같습니다.

드롭릿에 로그인하려면 터미널 창을 열고 다음 문자열을 복사하여 붙여넣어야 합니다.

ssh root@192.241.xxx.xxx

'192.241.xxx.xxx'는 사용자에 따라 다를 수 있습니다. 가상 서버를 설정할 때 DigitalOcean에서 받은 지침을 따르고 ssh를 사용하여 로그온하기만 하면 됩니다.

우리 대부분이 알고 있듯이 루트 계정을 사용하여 코드를 실행하고 적대적인 당사자가 코드를 손상시키는 경우 해당 당사자가 VPS를 완전히 제어할 수 있습니다.

이를 방지하기 위해 적절한 암호를 제공하면 여전히 루트 작업을 수행할 수 있는 안전한 계정을 설정합시다. 이 자습서의 목적을 위해 안전한 사용자를 "safeuser\라고 부르겠습니다. 원하는 이름을 지정할 수 있습니다. 지금은 루트 사용자로 로그온하고 다음 단계를 따르십시오.

  • /home/safeuser/에 폴더가 있는 사용자를 생성합니다.

useradd -s /bin/bash -m -d /home/safeuser -c "safe user" safeuser

  • safeuser에 대한 비밀번호 만들기 - 다음 명령을 입력하면 비밀번호를 두 번 입력하라는 메시지가 표시됩니다.

passwd safeuser

  • 루트 수준 명령을 사용할 수 있는 안전한 사용자 권한 부여:

usermod -aG sudo username

안전한 사용자로 로그인

ctrl-D를 눌러 DigitalOcean 루트 세션에서 로그아웃합니다.

안전한 사용자로 로그온하는 명령은 이전에 사용한 명령과 동일하지만 사용자 이름이 변경되었습니다. 안전한 사용자로 로그온하면 루트 권한이 있는 명령을 실행할 때마다 sudo라는 단어로 명령을 진행해야 합니다. 컴퓨터의 명령줄에서 아래에 나타나는 명령을 사용하여 로그온합니다.

ssh safeuser@192.241.xxx.xxx

GIT 설치

로그온한 사용자 중 GIT를 설치합니다(GIT를 사용하여 Node.js를 설치합니다). 어떤 이유로든 GIT에 익숙하지 않다면 GIT는 삶의 큰 부분이 될 아름다운 도구입니다. 더 알고 싶다면 GIT 책을 읽으십시오. Ubuntu에 설치하는 것은 쉽습니다.

sudo apt-get install git

sudo라는 단어는 이 명령을 루트로 실행하려고 함을 나타냅니다. 비밀번호(예: 안전한 사용자 비밀번호)를 입력하라는 메시지가 표시됩니다. 암호를 입력하면 명령이 실행됩니다.

최신 Node.JS 설치

v0.10.24는 이 글을 쓰는 시점에서 Node의 최신 버전입니다. 최신 버전이 있는 경우 해당 버전 번호를 대신 사용하십시오.

한 번에 한 줄씩 다음 명령을 입력하고 드롭릿이 Node.js를 다운로드, 컴파일 및 설치하는 과정을 지켜보세요.

sudo apt-get install build-essential
sudo apt-get install curl openssl libssl-dev
git clone https://github.com/joyent/node.git
cd node
git checkout v0.10.24
./configure
make
sudo make install

sudo make를 입력하면 많은 일이 발생합니다. 인내심을 가지십시오.

make install 프로세스가 끝나면 다음을 입력하여 모든 것이 잘 되었는지 확인합니다.

node -v

모든 것이 잘 되었다면 v0.10.24.가 표시되어야 합니다.

안전한 사용자에게 포트 80 사용 권한 부여

우리는 루트 사용자로 응용 프로그램을 실행하고 싶지 않지만 문제가 있습니다. 안전한 사용자에게는 기본 HTTP 포트(80)를 사용할 권한이 없습니다. 귀하의 목표는 방문자가 http://mysite.com과 같이 사용하기 쉬운 URL로 이동하여 사용할 수 있는 웹사이트를 게시하는 것입니다.

안타깝게도 루트로 로그인하지 않는 한 일반적으로 http://mysite.com:3000과 같은 URL을 사용해야 합니다. 포트 번호를 확인하세요.

많은 사람들이 여기서 막히지만 해결책은 간단합니다. 몇 가지 옵션이 있지만 이것이 내가 좋아하는 것입니다. 다음 명령을 입력합니다.

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

이제 노드 응용 프로그램에 포트 80에서 실행하기를 원한다고 말하면 불평하지 않습니다.

NPM을 사용하여 PM2라는 패키지를 설치합니다.

NPM은 Node.js 애플리케이션과 함께 사용할 프레임워크 및 라이브러리를 설치하는 데 사용할 패키지 관리자입니다. NPM은 Node.js와 함께 설치되었습니다. PM2는 두 가지 문제를 해결해 줄 작고 귀여운 도구입니다.

  1. 충돌이 발생하면 응용 프로그램을 다시 시작하여 사이트를 계속 유지합니다. 이러한 충돌은 발생해서는 안 되지만 PM2가 여러분의 등을 맞댄다는 것은 좋은 일입니다. (일부 사람들은 노드 기반 사이트를 계속 실행하는 데 사용되는 또 다른 도구인 Forever.js를 알고 있을 수 있습니다. PM2가 많은 것을 제공한다는 것을 알게 될 것입니다.)\n
  2. 서버를 다시 시작할 때마다 노드 애플리케이션을 서비스로 다시 시작하면 도움이 될 것입니다. 일부 사용자는 이 작업을 수행하는 다른 방법을 알고 있지만 pm2는 더 쉽게 만들고 약간의 유연성을 추가합니다.\n

명령줄에 다음 thr을 입력하여 PM2를 설치합니다.

sudo npm install pm2 -g

간단한 노드 앱 만들기

여기에서 환경을 테스트하여 모든 것이 정상적으로 작동하는지 확인할 수 있습니다. 이 예에서는 IP 주소를 사용하지만 목표는 도메인 이름을 사용하는 것입니다. 나중에 이 지침을 살펴보십시오. DigitalOcean으로 호스트 이름을 설정하는 방법

먼저 테스트용으로 간단한 노드 앱을 만듭니다. 명령줄에 다음을 입력합니다.

nano app.js

그런 다음 nano 편집기에 다음 코드 줄을 입력합니다.

var http = require('http');
var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end("Hello World\n");
});
server.listen(80);
console.log("Server running at http://127.0.0.1:80/");

종료하려면 ctrl-X를 누르십시오. nano가 저장 여부를 물으면 예라고 대답하십시오.

이제 환경을 테스트하는 데 사용할 수 있는 app.js라는 노드 기반 애플리케이션이 있습니다.

node app.js를 입력하여 명령줄에서 app.js를 실행할 수 있습니다.

그렇게 하면 브라우저를 사용하고 IP 주소를 URL로 입력하여 Hello World 텍스트를 볼 수 있어야 합니다. crtl-C를 눌러 실행을 중단할 수 있습니다. 이것은 우리가 애플리케이션을 실행하려는 방식이 아닙니다. 훨씬 더 좋은 방법이 있습니다. Node를 직접 사용하는 대신 PM2를 사용하여 실행합니다.

PM2를 사용하여 앱을 실행하고 서버가 다시 시작될 때 node.js 애플리케이션이 자동으로 시작되는지 확인하십시오.

pm2를 사용하여 애플리케이션을 실행하면 몇 가지 큰 이점이 있습니다. 위와 같이 앱을 실행하는 대신 다음 명령을 사용하여 실행합니다.

다음 보고서가 표시됩니다.

이러한 방식으로 애플리케이션을 실행하면 어떤 이점이 있습니까?

  • 충돌이 발생하면 PM2가 자동으로 애플리케이션을 다시 시작합니다.\n
  • PM2는 처리되지 않은 예외의 로그를 보관합니다. 이 경우 /home/safeuser/.pm2/logs/app-err.log의 파일에 있습니다.\n
  • 하나의 명령으로 PM2는 서버가 재부팅될 때 관리하는 모든 애플리케이션이 다시 시작되도록 할 수 있습니다. 기본적으로 노드 애플리케이션은 서비스로 시작됩니다.\n

다음을 입력하여 이 명령을 실행하여 애플리케이션을 서비스로 실행합니다.

sudo env PATH=$PATH:/usr/local/bin pm2 startup -u safeuser

safeuser를 사용자 이름으로 사용하지 않을 수 있습니다. 설정에 해당하는 이름을 사용하십시오. 다음 보고서가 표시되어야 합니다.

Adding system startup for /etc/init.d/pm2-init.sh ...
   /etc/rc0.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc1.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc6.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc2.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc3.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc4.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc5.d/S20pm2-init.sh -> ../init.d/pm2-init.sh

이제 우리의 명시된 목표가 달성되었습니다!

  • 루트로 실행하고 있지 않습니다. 따라서 앱이 더 안전합니다.\n
  • 일반적으로 루트 사용자만 사용할 수 있는 포트 80을 사용하고 있습니다.\n
  • 충돌이 발생하면 응용 프로그램이 다시 시작되고 처리되지 않은 예외에 대한 로그가 유지됩니다.\n
  • 서버가 시작되면 애플리케이션이 다시 시작됩니다.\n

재미있게 보내세요! 이것은 시작하기에 상당히 강력한 설정입니다.

**생각 후: ** safeuser 디렉터리에 node라는 파일 폴더가 있음을 알 수 있습니다. 설치 중에 사용되었지만 더 이상 필요하지 않습니다. 다음을 입력하여 삭제할 수 있습니다.

rm -rf /home/safuser/node

노드에 대해 더 많은 것을 배울 수 있지만 이 튜토리얼은 여러분을 올바른 길로 인도할 것입니다. pm2에 대해 자세히 알아보려면 pm2 저장소를 방문하세요.

중요한 설명: 노드 애플리케이션을 시작하는 시작 스크립트가 있지만 작동 방식을 이해하면 많은 혼란을 피할 수 있습니다. 이 스크립트는 'pm2-init.sh'라고 합니다. 이 스크립트는 'etc/init.d/' 디렉토리에 있지만 app.js를 시작하지는 않습니다. 대신 마지막으로 서버가 종료되었을 때 PM2에서 실행 중이던 프로그램을 시작합니다.

이건 중요하다. pm2 list를 입력할 때 노드 애플리케이션이 목록에 표시되지 않으면 서버가 다시 시작될 때 앱이 다시 시작되지 않습니다. 다시 시작하려면 pm2를 사용하여 앱을 시작하기 위한 적절한 지침을 따르세요. pm2 start app.js

짐 캐시디