Server Deploy

Siwoo Pak·2021년 9월 15일
0

AWS

목록 보기
7/15

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
  • .bash_profile 내용 추가
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This load$
  • 저장후 편집기 종료
  • 수정한 파일 적용
$ 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로 시작했던 프로세스 삭제
    $ pm2 delete app.js
    • pm2에 관리자 권한을 부여하기
    $ 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
profile
'하루를 참고 인내하면 열흘을 벌 수 있고 사흘을 참고 견디면 30일을, 30일을 견디면 3년을 벌 수 있다.'

0개의 댓글