1. EC2 인스턴스 생성/연결
- 회원가입 나오는 화면에서 인스턴스 시작 버튼 클릭
- AMI 선택화면에서 ubuntu 검색해 18.04 선택
- 인스티어 유형 선택은 프리티어 선택하고 검토 및 시작 버튼 클릭
- 모달창으로 키페어 생성이 뜬다. 새 키 페어 생성하고 키페어이름 아무거나 작성. 키페어를 다운로드 받는다
- 인스턴스 시작 버튼 클릭
- 인스턴스의 name을 입력해준다
- 연결버튼 클릭하면 터미널에서 ssh 원격접속을 통해 인스턴스에 접속할수 있는 주소가 뜬다. 이 때 필요한 것이 아까 생성한 키페어 파일
- 3-4개의탭이 뜨는데 그 중에 SSH클라이언트 클릭
- .pem파일에 누구나 접근할 수 있는 권한이 부여되어 있다면 인스턴스는 연결을 거부하기에 키페어파일 다운로드된 경로로 이동
$ chmod 400 키페어파일명
- 권한을 400으로 줘서 소유자의 읽기 권한만 준다.
- 그리고 맨마지막에 ssh로 시작하는 클립보드를 복사하여 터미널입력하고 엔터치면 AWS에서 생성한 인스턴스로 접속!
2. EC2 인스턴스 상에서 서버실행
2.1 인스턴스에 개발환경 구축
$ sudo apt update
// nvm install
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
$ nano ~/.bash_profile
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
$ source ~/.bash_profile
// 잘 설치되었는지 nvm 버전확인
$ nvm --version
$ nvm install node
$ sudo apt install npm
// git에 있는 코드 클론받기 위해 git 설정
$ git config --global user.name "깃헙유저명"
$ git config --global user.email "깃헙이메일"
// keygen 생성하고 암호설정. 깃헙사이트에다 ssh키를 추가해준다
$ git clone 깃헙코드경로
// 위와 같이 깃헙 설정 잡아주고 클론해야 아무 문제없이 가져온다
// 해당 서버폴더로 이동 후 서버구동
$ cd im-sprint-pratice-deploy/server && npm start
// 1024번 포트 아래론 관리자 권한으로 실행해야 하기에
$ sudo npm start
- 사이트로 연결은 시도하지만 연결되지 않는다. 그 이유는 아직 aws에서 보안그룹 설정을 하지 않았기 때문
2.2 보안그룹 설정
- 인스턴스로 들어가고 인스턴스에서 나가는 트래픽에 대한 가상 방화벽이 보안그룹.
- 인바운드: 인스턴스로 들어가는 트래픽
- 아웃바운드: 인스턴스에서 나가는 트래픽
- 인바운드 규칙은 EC2인스턴스로 들어오는 트래픽에 대한 규칙
- 인바운드 규칙에 허용되지 않은 규칙은 인스턴스로 접근하지 못하도록 필터링
- EC2인스턴스를 생성하면 기본적으로 SSH접속을 위한 SSH규칙만 생성되어짐.
- 보안그룹으로 들어가서 인바운드 규칙 추가
- 유형은 HTTP, 프로토콜은 TCP 포트번호는 80으로 해서 추가해주면 된다.
2.3 PM2
- ssh로 접속된 터미널을 강제종료한다면?
- 로컬의 ssh프로세스가 강종!
- EC2상의 node프로세스가 강종!
- 결국 node로 작동중인 웹서버도 강종!
- 터미널을 강종해도 서버가 항상 실행되게 하고 싶다면?
node app.js &
- 뒤에 &기호를 붙이는 것만으로 백그라운드에서 실행되게 할 수 있다.
- 하지만 우리의 서버의 포트번호는 80번... 1024번 포트번호 아래에선 문제가 발생하니 3번 글을 참고해주세요
- 이런 명령어 대신에 프로세스를 전문적으로 관리해주는 프로그램, 고것은 PM2
- node.js로 실행되는 프로그램을 관리해주며, 백그라운드에서 실행되게 만들 수 있음
- Hot Reload와 같이 프로그램이 변경될 때 자동으로 재시작하게 도와준다거나 프로그램 실행중 에러가 나서 서버가 종료되면, 다시 자동으로 실행시켜주는 기능을 제공
- 서버 운영에서 필수라고 할 수 있는 로그 관리를 좀 더 전문적으로 할 수 있고, 클러스터 모드와 같이 멀티코어 CPU를 최대한 활용하는 옵션도 있음
- 설치 및 백그라운드 실행
$ npm install pm2 -g
// 백그라운드 실행
$ pm2 start 파일명
- pm2 명령어
- pm2 stop
- pm2 restart
- pm2 ls
- pm2 log
- 일반적으로 pm2 start명령어로 프로세스 실행 후 로그기록을 볼 시 에러가 발생하는데, 그것은 pm2가 프로세스를 실행시킬 때 관리자 권한으로 실행하지 못해 생긴 문제다
- 이 문제를 해결하기 위해 authbind라는 패키지를 추가적으로 설치해야 함
$ sudo apt-get update
$ sudo apt-get install authbind
$ sudo touch /etc/authbind/byport/80
$ sudo chown ubuntu /etc/authbind/byport/80
$ sudo chmod 755 /etc/authbind/byport/80
$ authbind --deep pm2 update
$ pm2 delete app.js
$ authbind --deep pm2 start app.js
- 위의 명령어로 실행 시 pm2 log 명령어도 오류없이 잘 수행하는 것 확인할 수 있다.
3. app.js 백그라운드 실행시 에러발생시
ubuntu@ip-172-31-14-21:~/im-sprint-practice-deploy/server$ node app.js &
[2] 24950
ubuntu@ip-172-31-14-21:~/im-sprint-practice-deploy/server$ node:events:371
throw er; // Unhandled 'error' event
^
Error: listen EACCES: permission denied 0.0.0.0:80
at Server.setupListenHandle [as _listen2] (node:net:1302:21)
at listenInCluster (node:net:1367:12)
at Server.listen (node:net:1454:7)
at Function.listen (/home/ubuntu/im-sprint-practice-deploy/server/node_modules/express/lib/application.js:618:24)
at Object.<anonymous> (/home/ubuntu/im-sprint-practice-deploy/server/app.js:49:5)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:79:12)
Emitted 'error' event on Server instance at:
at emitErrorNT (node:net:1346:8)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
code: 'EACCES',
errno: -13,
syscall: 'listen',
address: '0.0.0.0',
port: 80
}
- 해결방안
- app.js 안에 포트번호를 8080으로 바꾸고 8080포트로 접속시 80포트로 재연결되게 설정
$sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
4. 특정포트 확인하고 싶을 때
$sudo lsof -i :포트번호
$sudo kill -9 해당포트PID