Nginx Node.js Koa 설정 - Ubuntu - AWS

Share

Last Updated on 1월 14, 2022 by Jade(정현호)

Node.js

Node.js 는 2009년 5월 27일 처음 소개되었으며 오픈 소스 JavaScript 엔진인 크롬 V8에 비동기 이벤트 처리 라이브러리인 libuv를 결합한 플렛폼 입니다.

다시 말해서 JavaScript로 브라우저 밖에서 서버를 구축하는 등의 코드를 실행할 수 있게 해주는 런타임 환경 입니다.
- 나무위키


설치 환경

AWS EC2 프리티어
Ubuntu 18.04
Nginx 1.19.5
Node.js 14.15.3 or v15.5.0


AWS EC2 환경에서의 구성이며 AWS EC2 프리티어 정보는 아래 글을 참조하시면 됩니다.


* 포스팅에서 ubuntu$ 는 프롬프트 입니다.
            

Node.js 설치

Node.js 설치 및 PM2 설치를 진행 하도록 하겠습니다.
        

Node.js 버전 종류

Stable 버전 과 LTS 버전의 정보 그리고 설치 방법 등의 추가적인 정보는 사이트를 참조하시면 됩니다.

 





LTS 는 Long Term Supported 로 서버환경에서 장기적으로 안정적인 지원을 제공하는 버전(짝수) 입니다.

Stable 버전은 홀수 버전으로 잦은 또는 빠른 업데이트를 진행, 추가 기능 개발적용과 기존 API의 기능 개선을 목적으로 합니다.
          

Node.js 설치

LTS 버전 설치
ubuntu$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
ubuntu$ sudo apt-get install -y nodejs

또는

Stable 버전 설치
ubuntu$ curl -sL https://deb.nodesource.com/setup_15.x | sudo -E bash -
ubuntu$ sudo apt-get install -y nodejs


선택해서 설치하시면 됩니다 포스팅 작성시에는 아래의 버전으로 설치하였습니다.

ubuntu$ node -v
v14.15.3

ubuntu$ npm -v
6.14.9


[참고] CentOS나 RPM 계열에서 설치시
16.x 버전을 root 로 진행시

curl -sL https://rpm.nodesource.com/setup_16.x | bash -
yum install nodejs

         

PM2 설치

PM2 는 Node.js의 프로세스 매니저 입니다.
Node.js 의 사용성을 매우 많이 높여주는 역활을 하게 됩니다.

싱글 스레드로 동작하는 Node.js 의 마스터 프로세스 와 워커 프로세스간의 다중 실행, 종료 , 재시작 등의 처리 역활을 하게 됩니다.
설치는 아래와 같이 진행 합니다.

ubuntu$ sudo npm install -g pm2
          

Nginx 설치

Nginx 는 Mainline 버전과 Stable 버전이 있습니다.

새로운 특징, 기능, 버그 패치 등은 Mainline 버전에서 작업하고 그 이후에, 새로운 기능이 추가되지 않고 버그 패치만 하는 게 Stable 버전입니다.

버전 선택에 관련해서 NGINX의 공식 입장은 다음과 같습니다.

We recommend that in general you deploy the NGINX mainline branch at all times.
The main reason to use the stable branch is that you are concerned about possible impacts of new features,
such as incompatibility with third-party modules or the inadvertent introduction of bugs in new features.


기본적으로 Mainline 버전을 택하고 지속적으로 업데이트 하기를 권장하고 있습니다.

Stable 버전은 3rd party(서드 파티) 모듈과 호환성 문제 또는 New Feature 로 인한 문제로 인하여 업데이트가 불가능한 상황에서 사용하면 된다고 합니다.

버전을 환경을 고려하여 선택하시면 될 것 같습니다


* 포스팅에서는  Mainline 버전으로 하여 최신버전을 설치 하도록 하겠습니다.


선행 필요 패키지 설치하기

ubuntu$ sudo apt install curl gnupg2 ca-certificates lsb-release -y


APT 레파지토리 구성

둘중 1가지를 선택하여 수행하시면 됩니다.


# mainline 버전의 nginx packages 설치시
ubuntu$ sudo echo "deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list


# stable 버전의 nginx packages 설치시
ubuntu$ echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list


설치전 공식적인 서명키를 받아와서 apt 패키지의 진위 여부를 확인합니다.
ubuntu$ sudo curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
-> OK

ubuntu$ sudo apt-key fingerprint ABF5BD827BD9BF62


Nginx 설치

사전 준비가 다 끝났고 apt update 실행후 nginx 를 설치 합니다

ubuntu$ sudo apt update
ubuntu$ sudo apt install nginx


설치한 버전 확인

ubuntu$ nginx -V
nginx version: nginx/1.19.5
built by gcc 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
built with OpenSSL 1.1.1 11 Sep 2018 (running with OpenSSL 1.1.1g 21 Apr 2020)
TLS SNI support enabled
        

koa 설치 및 node.js 서버 실행

Node.js 에서 인기있는 웹 프레임워크인 Express.js 의 개발팀이 Koa 라는 웹프레임워크를 새로 만든것 입니다.


Koa 프레임워크 설치

ubuntu$ npm install koa

ubuntu$ mkdir nodejs
ubuntu$ cd nodejs

ubuntu$ vi index.js

const Koa = require('koa');
const app = new Koa();

app.use((ctx) => {
ctx.body = "<h1>Hello node.js and Koa<h1>"
});

app.listen(3000, () => {
console.log('Server listen to port 3000');
});


pm2 프로세스 매니저 실행

ubuntu$ pm2 start index.js




포트 확인

ubuntu@instance-9:~/nodejs$ netstat -antp | grep 3000
tcp6 0 0 :::3000 :::* LISTEN 15161/node /home/ub
       

Nginx 설정

Nginx 설정의 홈 디렉토리는 /etc/nginx 입니다.

Nginx 최근버전에서는 /snippets /sites-enabled , /sites-available 같은 디렉토리 없이 conf.d 디렉토리만 존재 하고 nginx.conf 파일에서는 모든 conf 파일을 include 하여 사용하게 됩니다.


ubuntu$ cd /etc/nginx
ubuntu$ cat nginx.conf | grep conf
include /etc/nginx/conf.d/*.conf
  ==> /etc/nginx/conf.d/ 아래에 .conf 파일은 자동으로 include 되어 적용 되게 됩니다.
      

nginx.conf 수정

먼저 nginx.conf 를 확인 해보겠습니다.
# 은 모두 주석 입니다.

ubuntu$ cd /etc/nginx
ubuntu$ sudo vi nginx.conf


user nginx;
# nginx 에서 사용할 OS로 유저로 nginx 로 사용하면 무난합니다.


#master_process ON; # ON is default
# 엔진엑스는 하나의 메인 프로세스(마스터 프로세스)와 여러 개의 작업자 프로세스를 시작할 수 있습니다 (ON)
# ON 이 default 이고 off 로 해제하면 단인 프로세스로 동작하게 됩니다.
# 해당 옵션은 기재가 되어있지는 않습니다 내용 참고를 위해 기재 한 것 입니다


worker_processes 4;
# or
# worker_processes auto;

# 접속을 받고 처리하는 worker process의 수 이며 정한 수만큼 기동시 프로세스가 생성됩니다.
# 보통 CPU Core 나 CPU Count 와 상관되어 결정되며 설정 이후 CPU의 사용률이 높지 않다면 올려서 사용 할 수 있습니다.

# 혹은 auto 로 nginx 알아서 생성되게 할 수도 있습니다.
# 저는 일단 4로 설정하고 사용 하도록 하겠습니다.


error_log /var/log/nginx/error.log notice;
# 로그 파일명과 경로, 로깅 레벨을 설정 할 수 있습니다.
# 로깅 레벨은 warn, error crit, alert, and emerg 설정 할 수 있습니다.

# 기동 과 중지 시 로그를 받을 수 있도록 notice 를 기본으로 사용 하면 됩니다.
# 문제 파악이나 설정시 테스트를 위해서는 debug를 사용하면 됩니다.


events {
use epoll;
worker_connections 1024;
}

# worker_connections 는 woker 당 가능한 접속수를 의미 합니다.
# 위에서 worker 4로 지정 하였으면 4*1024 하여 4096 Connection이 가능하게 됩니다.


log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';


access_log /var/log/nginx/access.log main;
# main 명칭의 로그 포팻으로 설정된 정보가 있고 설정된 main 포맷 Access 로그에서 사용 하고 있습니다
# log_format main 을 수정하여 사용하거나 별도의 log format을 생성 후 access 로그에서 변경하여 사용 할 수 있습니다


log_not_found off;
index index.php index.htm index.html;

# 위의 2개 라인을 추가 해줍니다


### deflate ### <== 내용 추가 합니다.
gzip on;
gzip_disable "msie6";
gzip_comp_level 6;
gzip_min_length 500;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain text/css text/js text/xml text/javascript application/javascript application/x-javascript application/json application/xml application/rss+xml image/svg+xml image/png;


keepalive_timeout 65;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
aio on;
sendfile_max_chunk 512k;
directio 4m;
server_tokens off;
client_max_body_size 50M;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;



[참고] gzip 설명

gzip(deflate) 는 HTTP 압축으로 HTTP 데이터는 서버로부터 전송되기 전에 압축됩니다.
nginx.conf 파일에 설정 하였기 때문에 모든 server block 에 공통으로 적용 되게 됩니다.

gzip on;
이 line을 통해 gzip을 사용할 것이라고 알려주는 것입니다.

gzip_disable "msie6";
IE 6이하에는 적용시키지 않습니다.

gzip_comp_level
압축의 정도를 설정하는 부분으로 높을수록 압축율이 높습니다
그대신 서버에서의 CPU 사용률이 올라가거나 압축에 더 시간이 소요될 수 있어서 적절한 값을 사용하는 것이 좋습니다.

gzip_types
압축을 할 대상 Source 파일의 종류를 지정 하는 것입니다.
           

Server Block 설정

이제 각 서버 설정 파일을 수정 하도록 하겠습니다

user$ cd /etc/nginx/conf.d
user$ sudo cp -rp default.conf default.conf.ori
   => 먼저 default 값으로 설정된 파일은 백업 후 설정을 변경 하여 사용하겠습니다.


user$ sudo vi default.conf

server {
listen 80 default_server;
# 사용할 포트 번호입니다.
# default_server는 server 절이 여러개 있을 때 IP로 접속 하거나 없는 서브도메인 등으로 접속시
# default 로 접속을 하게 되는 sever 절을 의미 합니다.

# default_server는 server block{ } 중에서 한곳만 사용 할 수 있습니다


server_name localhost;
# IP나 /etc/hosts에 설정된 호스트네임 , 도메인이 있다면 도메인명을 기재해 줍니다.
# 도메인이 없다면 localhost 로 지정하시면 됩니다.

charset utf-8;
# character set 설정입니다.

access_log /var/log/nginx/localhost.access.log main;
error_log /var/log/nginx/localhost.error.log;
# Access , Error 로그는 기본적으로는 주석처리 되어 있습니다.
# 주석을 해제하고 서버명이나 도메인 명 등을 추가하여 로그를 확인 할 때
# 파일명으로 쉽게 찾을수 있도록 명시적으로 지정하는 것이 좋습니다.



# Proxy_Pass 설정
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;

proxy_pass http://127.0.0.1:3000;
proxy_redirect off;
#proxy_send_timeout 60;
#proxy_read_timeout 60;
#proxy_connect_timeout 60;
}


여기 까지 설정 하였다면 저장 후 종료 합니다.
:wq!
         

Nginx 재시작 및 확인

Nginx 를 reload 하여 변경된 설정 사항을 반영 합니다.

ubuntu$ sudo systemctl reload nginx


웹 브라우저에서 확인 하기 전에 AWS 나 클라우드 환경이라면 보안 정책 또는 보안 그룹의 설정이 필요 합니다.

AWS EC2 환경이라면 보안 그룹 정책에 80포트를 추가 해주시면 됩니다.
보안그룹은 아래 포스팅의 내용을 참조하시면 됩니다.



보안 그룹 설정이 다되었다면 브라우저에서 접속하여 정상적으로 동작 하는지를 확인해봅니다.




연관된 다른 글

 

 

 

 

 

0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x