- [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
짠 백단 서버 성공 ~
'AWS' 카테고리의 다른 글
[AWS]리액트 개인 프로젝트 배포하기(nextjs,nestjs)[7]-Cookie 문제 해결 & 도메인 설정 (0) | 2021.05.28 |
---|---|
[AWS]리액트 개인 프로젝트 배포하기(nextjs,nestjs)[6]-Front 배포 & 탄력적 IP고정 (0) | 2021.05.28 |
[AWS]리액트 개인 프로젝트 배포하기(nextjs,nestjs)[4]-mysql 설정 (0) | 2021.05.27 |
[AWS]리액트 개인 프로젝트 배포하기(nextjs,nestjs)[3]-우분투 npm start (0) | 2021.05.27 |
[AWS]리액트 개인 프로젝트 배포하기(nextjs,nestjs)[2]-우분투 mysql설치 (0) | 2021.05.27 |