웹사이트 검색

Ubuntu 14.04에서 프로덕션용 Node.js 애플리케이션을 설정하는 방법


소개

Node.js는 서버 측 및 네트워킹 애플리케이션을 쉽게 구축하기 위한 오픈 소스 Javascript 런타임 환경입니다. 이 플랫폼은 Linux, OS X, FreeBSD 및 Windows에서 실행되며 해당 애플리케이션은 JavaScript로 작성됩니다. Node.js 애플리케이션은 명령줄에서 실행할 수 있지만 서비스로 실행하는 방법을 알려드립니다. 그러면 재부팅이나 실패 시 자동으로 다시 시작되므로 프로덕션 환경에서 사용할 수 있습니다.

이 튜토리얼에서는 두 개의 Ubuntu 14.04 서버로 구성된 프로덕션 준비 Node.js 환경 설정에 대해 다룹니다. 한 서버는 PM2에서 관리하는 Node.js 애플리케이션을 실행하고 다른 서버는 Nginx 리버스 프록시를 통해 애플리케이션 서버에 대한 액세스를 사용자에게 제공합니다.

이 튜토리얼의 CentOS 버전은 여기에서 찾을 수 있습니다.

전제 조건

이 가이드는 사설 네트워킹이 있는 두 개의 Ubuntu 14.04 서버를 사용합니다(동일한 데이터 센터에 있음). 다음 이름으로 참조하겠습니다.

  • 앱: Node.js 런타임, Node.js 애플리케이션 및 PM2를 설치할 서버
  • web: 애플리케이션에 대한 리버스 프록시 역할을 하는 Nginx 웹 서버를 설치할 서버입니다. 사용자는 이 서버의 공용 IP 주소에 액세스하여 Node.js 애플리케이션에 액세스합니다.

이 자습서에서는 단일 서버를 사용할 수 있지만 그 과정에서 몇 가지 사항을 변경해야 합니다. 앱 서버의 사설 IP 주소가 사용되는 곳마다 localhost IP 주소, 즉 127.0.0.1을 사용하기만 하면 됩니다.

다음은 이 튜토리얼을 따른 후의 설정에 대한 다이어그램입니다.

이 가이드를 시작하기 전에 두 서버 모두에 sudo 권한이 구성된 루트가 아닌 일반 사용자가 있어야 합니다. 이 사용자는 서버에 로그인해야 합니다. Ubuntu 14.04용 초기 서버 설정 가이드의 1-4단계를 따라 일반 사용자 계정을 구성하는 방법을 배울 수 있습니다.

공용 IP 주소 대신 도메인 이름을 통해 웹 서버에 액세스하려면 도메인 이름을 구입하고 다음 자습서를 따르십시오.

  • DigitalOcean으로 호스트 이름을 설정하는 방법
  • 일반 도메인 등록 기관에서 DigitalOcean 이름 서버를 가리키는 방법

앱 서버에 Node.js 런타임을 설치하여 시작하겠습니다.

Node.js 설치

앱 서버에 Node.js의 최신 LTS 릴리스를 설치합니다.

앱 서버에서 다음 명령으로 apt-get 패키지 목록을 업데이트해 보겠습니다.

  1. sudo apt-get update

그런 다음 apt-get을 사용하여 npm이 의존하는 git 패키지를 설치합니다.

  1. sudo apt-get install git

해당 페이지로 이동하여 해당 링크를 복사합니다.

홈 디렉터리로 변경하고 wget을 사용하여 Node.js 소스를 다운로드합니다. 강조 표시된 부분에 다운로드 링크를 붙여넣습니다.

  1. cd ~
  2. wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz

이제 다음 명령을 사용하여 방금 다운로드한 tar 아카이브를 node 디렉토리에 추출하십시오.

  1. mkdir node
  2. tar xvf node-v*.tar.?z --strip-components=1 -C ./node

다운로드한 Node.js 아카이브를 삭제하려면 더 이상 필요하지 않으므로 홈 디렉토리로 이동하여 다음 rm 명령을 사용하십시오.

  1. cd ~
  2. rm -rf node-v*

다음으로 npm의 전역 접두사를 구성합니다. 여기서 npm은 설치된 노드 패키지에 대한 심볼릭 링크를 생성합니다. 기본 경로. 다음 명령을 사용하여 /usr/local로 설정합니다.

  1. mkdir node/etc
  2. echo 'prefix=/usr/local' > node/etc/npmrc

이제 nodenpm 바이너리를 설치 위치로 이동할 준비가 되었습니다. 다음 명령을 사용하여 /opt/node로 이동합니다.

  1. sudo mv node /opt/

이 시점에서 root를 파일의 소유자로 만들 수 있습니다.

  1. sudo chown -R root: /opt/node

마지막으로 기본 경로에 nodenpm 바이너리의 심볼릭 링크를 생성해 보겠습니다. 다음 명령을 사용하여 링크를 /usr/local/bin에 넣습니다.

  1. sudo ln -s /opt/node/bin/node /usr/local/bin/node
  2. sudo ln -s /opt/node/bin/npm /usr/local/bin/npm

다음 명령으로 버전을 확인하여 Node가 설치되어 있는지 확인합니다.

  1. node -v

이제 Node.js 런타임이 설치되었으며 애플리케이션을 실행할 준비가 되었습니다! Node.js 애플리케이션을 작성해 봅시다.

Node.js 애플리케이션 만들기

이제 우리는 모든 HTTP 요청에 단순히 "Hello World\를 반환하는 Hello World 응용 프로그램을 만들 것입니다. 이것은 Node.js를 설정하는 데 도움이 되는 샘플 응용 프로그램이며 이를 대체할 수 있습니다. 자신의 애플리케이션으로 – 적절한 IP 주소 및 포트에서 수신하도록 애플리케이션을 수정했는지 확인하십시오.

우리는 Node.js 애플리케이션이 리버스 프록시 서버인 웹에서 오는 요청을 처리하기를 원하기 때문에 서버 간 통신을 위해 앱 서버의 사설 네트워크 인터페이스를 활용할 것입니다. 앱 서버의 사설 네트워크 주소를 찾습니다.

DigitalOcean 드롭릿을 서버로 사용하는 경우 메타데이터 서비스를 통해 서버의 개인 IP 주소를 조회할 수 있습니다. 앱 서버에서 curl 명령을 사용하여 지금 IP 주소를 검색합니다.

  1. curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address

Node.js 애플리케이션을 구성하는 데 사용되므로 출력(개인 IP 주소)을 복사해야 합니다.

헬로 월드 코드

다음으로 편집을 위해 Node.js 애플리케이션을 만들고 엽니다. 이 자습서에서는 vi를 사용하여 hello.js라는 샘플 애플리케이션을 편집합니다.

  1. cd ~
  2. vi hello.js

파일에 다음 코드를 삽입하고 강조 표시된 APP_PRIVATE_IP_ADDRESS 항목 모두를 앱 서버의 개인 IP 주소로 대체해야 합니다. 원하는 경우 두 위치에서 강조 표시된 포트인 8080을 교체할 수도 있습니다(관리 포트가 아닌 포트, 즉 1024 이상을 사용해야 함).

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8080, 'APP_PRIVATE_IP_ADDRESS');
console.log('Server running at http://APP_PRIVATE_IP_ADDRESS:8080/');

이제 저장하고 종료합니다.

이 Node.js 애플리케이션은 지정된 IP 주소와 포트에서 수신 대기하고 200 HTTP 성공 코드와 함께 "Hello World\를 반환합니다. 웹 서버와 같은 네트워크.

테스트 애플리케이션(선택사항)

애플리케이션이 작동하는지 테스트하려면 앱 서버에서 다음 node 명령을 실행하세요.

  1. node hello.js

참고: 이 방식으로 Node.js 애플리케이션을 실행하면 CTRL+C를 눌러 애플리케이션을 종료할 때까지 추가 명령이 차단됩니다.

응용 프로그램을 테스트하려면 다른 터미널 세션을 열고 웹 서버에 연결하십시오. 웹 서버는 동일한 사설망에 있기 때문에 curl을 사용하여 앱 서버의 사설 IP 주소에 도달할 수 있어야 합니다. APP_PRIVATE_IP_ADDRESS를 앱 서버의 사설 IP 주소로 대체하고 포트를 변경한 경우:

  1. curl http://APP_PRIVATE_IP_ADDRESS:8080

다음 출력이 표시되면 애플리케이션이 제대로 작동하고 적절한 IP 주소 및 포트에서 수신 대기하는 것입니다.

Output:
Hello World

적절한 출력이 표시되지 않으면 Node.js 애플리케이션이 실행 중이고 적절한 IP 주소 및 포트에서 수신 대기하도록 구성되어 있는지 확인하세요.

앱 서버에서 CTRL+C를 눌러 애플리케이션을 종료해야 합니다(아직 종료하지 않은 경우).

PM2 설치

이제 Node.js 애플리케이션용 프로세스 관리자인 PM2를 설치하겠습니다. PM2는 애플리케이션을 관리하고 데몬화(서비스로 실행)하는 쉬운 방법을 제공합니다.

기본적으로 Node.js와 함께 설치되는 Node 모듈의 패키지 관리자인 NPM(Node Packaged Modules)을 사용하여 앱 서버에 PM2를 설치합니다. 이 명령을 사용하여 PM2를 설치합니다.

  1. sudo npm install pm2 -g

PM2로 애플리케이션 관리

PM2는 간단하고 사용하기 쉽습니다. PM2의 몇 가지 기본 용도를 다룰 것입니다.

애플리케이션 시작

가장 먼저 할 일은 pm2 start 명령을 사용하여 애플리케이션 hello.js를 백그라운드에서 실행하는 것입니다.

  1. pm2 start hello.js

이렇게 하면 애플리케이션을 시작할 때마다 출력되는 PM2의 프로세스 목록에 애플리케이션이 추가됩니다.

Output:
┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐ │ App name │ id │ mode │ PID │ status │ restarted │ uptime │ memory │ watching │ ├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤ │ hello │ 0 │ fork │ 5871 │ online │ 0 │ 0s │ 9.012 MB │ disabled │ └──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘

보시다시피 PM2는 자동으로 앱 이름(.js 확장자가 없는 파일 이름 기반)과 PM2 id를 할당합니다. PM2는 또한 프로세스의 PID, 현재 상태 및 메모리 사용과 같은 기타 정보를 유지합니다.

PM2에서 실행 중인 애플리케이션은 애플리케이션이 충돌하거나 종료되면 자동으로 다시 시작되지만 시스템 시작(부팅 또는 재부팅) 시 애플리케이션을 시작하려면 추가 단계를 수행해야 합니다. 다행히도 PM2는 startup 하위 명령을 수행하는 쉬운 방법을 제공합니다.

startup 하위 명령은 서버 부팅 시 PM2 및 해당 관리 프로세스를 시작하는 시작 스크립트를 생성 및 구성합니다. 실행 중인 플랫폼도 지정해야 합니다. 이 경우 ubuntu입니다.

  1. pm2 startup ubuntu

결과 출력의 마지막 줄에는 실행해야 하는 명령(수퍼유저 권한으로 실행해야 함)이 포함됩니다.

Output:
[PM2] You have to run this command as root [PM2] Execute the following command : [PM2] sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"

생성된 명령(위에서 강조 표시된 출력과 유사)을 실행하여 PM2가 부팅 시 시작되도록 설정합니다(자신의 출력에서 명령 사용).

  1. sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"

기타 PM2 사용(선택사항)

PM2는 애플리케이션에 대한 정보를 관리하거나 조회할 수 있는 많은 하위 명령을 제공합니다. 인수 없이 pm2를 실행하면 튜토리얼의 이 섹션보다 더 자세히 PM2 사용법을 다루는 예제 사용법을 포함한 도움말 페이지가 표시됩니다.

다음 명령으로 애플리케이션을 중지합니다(PM2 앱 이름 또는 id 지정).

  1. pm2 stop example

다음 명령으로 애플리케이션을 다시 시작합니다(PM2 앱 이름 또는 id 지정).

  1. pm2 restart example

현재 PM2에서 관리하는 애플리케이션 목록은 list 하위 명령으로도 조회할 수 있습니다.

  1. pm2 list

특정 애플리케이션에 대한 자세한 정보는 info 하위 명령(PM2 앱 이름 또는 id 지정)을 사용하여 찾을 수 있습니다.

  1. pm2 info example

PM2 프로세스 모니터는 monit 하위 명령으로 가져올 수 있습니다. 애플리케이션 상태, CPU 및 메모리 사용량이 표시됩니다.

  1. pm2 monit

이제 Node.js 애플리케이션이 실행 중이고 PM2에서 관리하므로 리버스 프록시를 설정해 보겠습니다.

리버스 프록시 서버 설정

이제 애플리케이션이 실행 중이고 사설 IP 주소에서 수신하므로 사용자가 액세스할 수 있는 방법을 설정해야 합니다. 이를 위해 Nginx 웹 서버를 리버스 프록시로 설정합니다. 이 튜토리얼은 처음부터 Nginx 서버를 설정합니다. Nginx 서버 설정이 이미 있는 경우 location 블록을 선택한 서버 블록에 복사할 수 있습니다(위치가 웹 서버의 기존 콘텐츠와 충돌하지 않는지 확인).

웹 서버에서 다음 명령으로 apt-get 패키지 목록을 업데이트해 보겠습니다.

  1. sudo apt-get update

그런 다음 apt-get을 사용하여 Nginx를 설치합니다.

  1. sudo apt-get install nginx

이제 편집을 위해 기본 서버 블록 구성 파일을 엽니다.

  1. sudo vi /etc/nginx/sites-available/default

파일의 모든 항목을 삭제하고 다음 구성을 삽입합니다. server_name 지시문(또는 도메인이 설정되지 않은 경우 IP 주소)을 자신의 도메인 이름으로 대체하고 APP_PRIVATE_IP_ADDRESS. 또한 애플리케이션이 다른 포트에서 수신 대기하도록 설정된 경우 포트(8080)를 변경합니다.

server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

이렇게 하면 루트에서 요청에 응답하도록 웹 서버가 구성됩니다. example.com에서 서버를 사용할 수 있다고 가정하면 웹 브라우저를 통해 http://example.com/에 액세스하면 포트에서 애플리케이션 서버의 개인 IP 주소로 요청을 보냅니다. 8080, Node.js 애플리케이션에서 수신하고 응답합니다.

동일한 서버 블록에 추가 location 블록을 추가하여 동일한 웹 서버의 다른 애플리케이션에 대한 액세스를 제공할 수 있습니다. 예를 들어 포트 8081의 앱 서버에서 다른 Node.js 애플리케이션을 실행 중인 경우 http://example.com을 통해 액세스할 수 있도록 이 위치 블록을 추가할 수 있습니다. /앱2:

    location /app2 {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8081;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

애플리케이션에 대한 위치 블록 추가를 완료했으면 저장하고 종료합니다.

웹 서버에서 Nginx를 다시 시작합니다.

  1. sudo service nginx restart

Node.js 애플리케이션이 실행 중이고 애플리케이션과 Nginx 구성이 정확하다고 가정하면 웹 서버의 리버스 프록시를 통해 애플리케이션에 액세스할 수 있어야 합니다. 웹 서버의 URL(공개 IP 주소 또는 도메인 이름)에 액세스하여 사용해 보십시오.

결론

축하해요! 이제 Ubuntu 14.04 서버에서 Nginx 리버스 프록시 뒤에서 실행 중인 Node.js 애플리케이션이 있습니다. 이 리버스 프록시 설정은 사용자가 공유하려는 다른 애플리케이션 또는 정적 웹 콘텐츠에 대한 액세스를 제공할 수 있을 만큼 충분히 유연합니다. Node.js 개발에 행운을 빕니다!

또한 웹 서버와 사용자 간의 전송을 암호화하려는 경우 HTTPS(TLS/SSL) 지원을 설정하는 데 도움이 되는 자습서가 있습니다.