[AWS]리액트 개인 프로젝트 배포하기(nextjs,nestjs)[5]-pm2 사용하기

2021년 05월 27일 by Xion

    [AWS]리액트 개인 프로젝트 배포하기(nextjs,nestjs)[5]-pm2 사용하기 목차

자 이제 서버 실행도 시켰고 !

 

중요한 건 쉘에서 서비스를 중지시키면 홈페이지도 중지가 되버린다..

 

 

이랬던게 이렇게 꺼져버린다.

 

이게 참 애매한게 그렇다고 해서 항상 백앤드창을 계속 접속할 수 없는 노릇인데..

 

 

이 현상이

노드가 foreground process 로 돌아가서 생기는 문제인데 이러면 shell을 종료했을 때 foreground process도 같이 종료된다.

node app 으로 실행하면 foreground process가 된다는 것.

 

foreground process란 ?

-> 터미널을 끄면 같이 꺼지는 것 (node app)

 

background process

-> 터미널을 꺼도 안 꺼지는 것

 

 

오늘은 이걸 해결해보자 먼저 다시 백앤드 서버 실행 

엥 ?

오류다 뭐지 ?

 

이 원인은 우분투(ubuntu)때문에 발생한다. 이건 권한이 없다는 의미인데

"root" 권한으로 접속해서 실행해줘야 한다 !

root만 1023이하의 port의 service를 시작할 권한이 존재한다!

 

꼭 root 로 접속해서 실행해주자 ! (sudo npm run start:prod)

 

 

자 다시 본론으로 가서

background process를 실행시키는 방법은 총 2가지이다

1. $ 달러를 이용한 방법

2. pm2를 이용한 방법

 

우리는 pm2를 이용해서 서비스를 background process로 변경시킬 것이다 !

 

server(back) 우분투 서버에서 pm2 다운

 

npm i pm2

 

 

 

설치가 끝났다면,

vim package.json 입력

script start 부분을 pm2로 변경해 줍니다 !

 

꼭! pm2 start app.js 와 같이 " .js " 를 꼭 붙여야 합니다! (노드 기준)

 

저는 nestjs라 pm2 start를 붙여줬습니다! ( 이 부분은 좀 해결해야 할 것 같습니다 ! ) 

 

다시 sudo npm run start:prod  노드 : sudo npm run start

 

 

 

!주의 나는 여기서 4시간정도 시간 버렸다 

이유는 정확히 모르겠는데

nestjs에서 aws 배포시 우분투 파일안에서 build시 자꾸 main.js가 생기지 않는 문제가 발생하였고

그로인해 dist/main.js 이 생기지 않았다

진짜 모르겠어서 clone을 다시 받고  가장 중요한건 매 명령어마다 "sudo"를 함께 붙여서 install해주고

sudo npm run start로 해주고 build도 해주고 또 app.module에서 Joi로 타입 검증하는곳에 dev모드 관련된건 다 빼버렸다

또한 .env파일을 다음과 같이 코드상에서 .env.dev 파일로 생성하고 있었다.

이 부분을 product로 바꿔주었는데 어디가 문제인지 모르겠는데 잘 생성되었다 

 

 

이유를 대충 알 것 같은데 그냥 sudo npm run start 하고 좀 오래 기다린 후 dist 폴더에 들어가면 main.js 그외 app.module 생겨있다..

 

envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.product',

너무 찝찝하시만 그래도 성공했으니... 감사합니다..

 

 

 

드디어 꿈에그리던 pm2 실행 시 화면 

 

 

위 사진을 잘 보면 분명 server를 실행했는데 명령어를 입력할 수 있다 !!

이게 바로 background process 이다! 

 

 

| pm2  명령어와 함께 사용하기

 

sudo npx pm2 monit이란 기능은 에러 로그를 볼 수 있는데

"sudo"를 붙이지 않으면 서버에 에러가 나도 에러 로그를 볼 수 없다 !

따라서 pm2를 종료 시켜주고

pm2 끄는 방법 : sudo npx pm2 kill 

 

 

pm2 monit 기능과 같이 켜보자 !

sudo npm run start:prod && sudo npx pm2 monit

실행

 

이와 같이 main Logs 에 출력이 되는 것을 볼 수 있다 

(기쁘다)

 

이처럼 pm2는 서버가 죽으면 자동으로 되살려주고

sudo npx pm2 logs

를 입력하면 로그들을 볼 수있다!!

( 에러로그는 : sudo npx pm2 logs --error )

 

 

그 외 명령어들

sudo npx pm2 reload all : 지금 서버들을 새로고침 해준다. (재시작)

sudo npx pm2 list : list 출력

sudo lsof -i tcp:포트번호 : 포트번호가 현재 사용중인지 조회

sudo npx pm2 kill  : pm2 죽이기

재시작을 하면 리로드 모양 아이콘이  " 1 " 씩 증가한다.

 

 

 

 

이번에 가장 중요하게 배운 건 root 와 ubuntu 의 권한이 다르기 때문에 80 port 접근을 할 수 없다는 점과,

우분투 사용 시 "sudo" 를 꼭 입력해주면서 명령어를 치자 ! 또한 sudo 붙여서 사용한 pm2는 계속 sudo로 실행해야한다.

 

이게 귀찮으면 sudo su 를 입력해서 root로 돌아간다음 실행하면된다

 

하지만 내가 저렇게 root로 돌리고 sudo를 입력하지 않고 돌아다녔더니 어디선가 분명 꼬이게 된다.

그래서 추천하는 방법은 그냥 sudo를 습관화해서 치자 !

 

 

추가적으로 production 모드를 위한 package.json을 수정하겠습니다~

저는 nest js를 사용하기 때문에 prod 에 dist/main.js 로 보이지만

nestjs가 아닌 node 환경에서는 "cross-env NODE_ENV=production pm2 start app.js" 이렇게 해주시면 됩니다 !

(단, app.js는 실행 기준이 되는 파일이기 때문에 여러분 파일로 맞춰야 합니다 port 번호가 들어가있는 메인 파일 )

 

간혹, commit push 후 aws server에서 pull 받을 때 밑에 문제가 발생하곤 하는데 이런 문제는 간단합니다.

"Please commit your changes or stash them before you merget Aborting"오류

해결 : git reset --hard

 

성공 ~

 

그럼 그 전에 실했했었던 pm2 애들을 종료해줘야한다 

일단 포트 조회해보자 sudo lsof -i tcp:80 

만약 실행중인 애들이 있다면 pid 번호로 종료시켜주자.

 sudo npx pm2 kill

 

그 후

1.sudo npm i 로 기존에 풀 받았던 애들 중 의존성을 다운 받은 애들이 있을 수 있으므로 먼저 실행해주자!

2.sudo npm run start:prod 

짠 백단 서버 성공 ~