(TIL13) AWS 환경세팅하기2🔧(back)

져니·2021년 7월 21일
0

AWS

목록 보기
2/2
post-thumbnail

node.js, mariadb, pm2패키지 깔기🔧


서버를 연결할 새로운 폴더를 하나 만들어봅니다.

SOURCE폴더 안에 back 폴더와 front 폴더를 만들고, 터미널도 aws용과 local용 두개를 열어줍니다!

지금은 aws용 back터미널에서 명령어를 작성하겠습니다.
back 폴더 안에 아까 다운로드 받았던 키페어 파일을 넣어줍니다.
git push할때 키페어 파일이 들어가지 않도록 gitignore 파일 안에 키페어 파일명을 적어줍니다!

AWS의 인스턴스 실행중 페이지로 돌아가서 실행중인 인스턴스의 체크박스를 누르고 연결을 눌러줍니다.

SSH클라이언트로 들어가서 인스턴스 연결 명령어를 복사해주겠습니다.

다시 비주얼스튜디오로 돌아가서 터미널을 열어줍니다.
터미널 경로는 다음과 같이 back폴더로 들어가있는 상태입니다.
위에서 복사한 코드를 명령어로 넣어줍니다.

그러면 다음과 같은 초록색 글씨가 뜹니다. 여기서 골뱅이 앞에 보이는 ubuntu는 계정을 의미하고, 골뱅이 뒤에는 주소값을 의미합니다. 인스턴스와 잘 연결된 것 같습니다.

ubuntu는 리눅스 운영체제이니 리눅스 명령어를 써야합니다.
제가 오늘 배운 리눅스 명령어입니다.

명령어의미
ls디렉토리 내용 보기(현위치)
ls -al디렉토리 상세하게 보기
pwd내 경로 보기
cd /최상위 디렉토리로 이동
cd ~우리가 작업할 디렉토리

여기서 $ ls -al을 통해서 디렉토리 상세보기를 하면 다음과 같은 형식의 정보가 나옵니다.
각 정보의 의미는 다음과 같습니다.

d rwx r-x r-x ubuntu ubuntu
x xxx xxx xxx(10글자) 계정명(최고관리자) 계정명(사용자)

이중에서 맨 앞의 스펠링은 다음을 의미합니다.

d: 디렉토리(폴더)
l: 바로가기(바탕화면 바로가기같은거)
아무것도 없으면(-) : 파일

그리고 차례대로 아래 코드를 터미널에 입력해줍니다.

💥앞으로 패키지를 깔때마다 y or n에 대한 질문들이 종종 나오는데 모두 y로 하면 됩니다!💥

1) node.js패키지 설치🔧

back_aws 터미널

$ sudo apt-get update
$ sudo apt-get install -y build-essential
$ sudo apt-get install curl
$ curl -sL http://deb.nodesource.com/setup_14.x | sudo -E bash --
$ sudo apt-get install -y node.js

sudo의 su는 super를 의미하며 sudo는 최고관리자를 의미합니다.

위의 코드들을 다 입력하면, node.js와 npm 패키지가 깔립니다.
확인하는방법은
node -v, npm -v를 쳐보면 깔려있는 버전이 뜹니다.

2) mariadb 패키지 설치🔧

이제 마리아디비 패키지를 깔아줄겁니다.
다음 링크로 들어가서
https://downloads.mariadb.org/mariadb/repositories

Ubuntu 선택 -> 20.04 선택 -> 10.6선택

그리고 다음 3줄의 코드를 복붙하여 터미널에 입력합니다.

그리고 아래의 두줄 코드를 순서대로 터미널에 입력해줍니다.

back_aws 터미널
$ sudo apt-get install mariadb-server
$ sudo apt-get install mariadb-client

마지막으로 $ mariadb --version을 쳐서 마리아디비가 잘 깔렸는지 확인을 해봅니다.

잘 깔렸다면 버전정보가 나옵니다!

이제 비밀번호를 설정해줄것입니다.

back_aws 터미널

$ sudo su
$ mysql_secure_installation

위 코드를 입력하면 password를 입력하라고 나옵니다.

password는 입력하면 바로 사라져서 창에 남아있지 않으니 한타자 한타자 신중히 치시는게 좋습니다.

password를 입력하고 나면 어쩌구 저쩌구 yes or no 선택하라고 나오는데
모두 yes하고 넘어갑니다.

그리고, sudo su 상태에서 패스워드를 변경해줄것입니다!
최고관리자에서 패스워드를 변경해줘야 우분투계정상태에서 mysql을 바로 접속할 수 있기때문에

$ mysql -uroot를 입력하여 mysql로 접속합니다.

$ show databases; 해보면 4개의 데이터베이스가 나오는데 그중에서 mysql을 사용할 것입니다. $ use mysql; 해줍니다.

그리고 테이블 목록을 한번 보면 user가 있는 것을 확인할 수 있습니다.

이제 $ SELECT user, host, plugin, password from user를 통해 root의 plugin과 password를 확인합니다!!
plugin은 mysql_native_password로 잘 되어있는지 확인!
아니라면 바꿔줘야 합니다.
그리고 password값이 저희가 설정한 값이 아니라 복잡한 값으로 바뀌어져있는데 이걸 바꿔줘야 ubuntu계정에서도 바로 mysql로 접근이 가능하기때문에
지금처럼 sudo su로 mysql을 접근하여서 바꿔줘야합니다!!

패스워드를 바꾸기 위해 UPDATE구문을 다음과 같이 사용하고싶었지만
$ update user set password = password('jh951128') where user='root';을 사용하고 싶었지만

이런 오류가 나서 사용할 수 없었습니다.
교수님께 여쭤보니 뷰테이블은 가상테이블이라서 바로 Update구문을 적용할 수 없다고 합니다.
그리하여 아래의 코드를 사용하여 password를 바꿔주었습니다.

$ set password for 'root'@'localhost' = password('jh951128');

그리고

$ FLUSH privileges; 를 입력해줍니다.

FLUSH privileges란❓❓❓

INSERT나 UPDATE, DELETE문을 이용해서 MySQL의 사용자를 추가,삭제하거나, 사용자 권한 등을 변경하였을 때, MySQL에 변경사항을 적용하기 위해서 사용하는 명령어가 flush privileges 입니다.

root계정에서 나오기 위해서는 exit을 입력해주면 됩니다.
이제 ubuntu 계정에서 mariadb에 들어가기 위해서 아래와같이 코드를 입력하면 ubuntu계정에서 바로 들어갈 수 있습니다.

mysql -uroot -p비밀번호

이제 local용 back터미널에서 경로를 다음과 같이 하고 패키지를 깔아주겠습니다

back_local 터미널

$ npm init
$ npm i express

그리고 back 폴더 안의 server.js파일을 만들고

const express = require('express')
const app = express()

app.get('/',(req,res)=>{
    res.send('hello aws!')
})

app.listen(3000,()=>{
    console.log('start server port 3000')    
})

위 코드를 작성하고 서버를 켜서 잘 작동되는지 확인해봅니다.

그리고 가상서버와 개인PC를 연결할 깃허브 레포지토리를 하나 만들어주고
다시 local용 back 터미널로 돌아와서 다음 순서대로 코드를 작성합니다.

back_local 터미널

$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add origin 깃주소
$ git push -u origin master

aws용 back 터미널로 돌아가서 local용 back터미널에서 연결한 깃주소를 클론해줍니다

back_aws 터미널

ls -al을 통해 상태를 확인해보면 클론한 레포지토리명인 aws_test가 있는것을 확인할 수 있습니다.
cd .. aws_test를 쳐서 폴더로 들어가서 ls -al로 상태를 한번 더 확인합니다. 원래 node_modules가 없으면 깔아줘야하는데 저는 존재합니다.

그래도 aws_test에 들어가있는 상태에서 $ npm install을 통해 npm을 다시한번 깔아줍니다.

이제 여기서 서버를 켜보면 local서버를 켰을때와 똑같이 콘솔이 찍히는 것을 확인할 수 있습니다.

이제 가상서버를 통해 저희가 보낸 값을 잘 가져오는지 확인할 것입니다.
AWS 사이트로 돌아가서 해당 인스턴스의 퍼블릭 IPv4 값을 가져옵니다.

그런데 다음 주소를 복사해서 창에 넣어보면 다음과 같이 사이트를 연결할 수 없다는 창이 뜹니다.

그 이유는 우리가 local서버에서 3000포트를 이용하였는데 가상서버에서 허용된 서버는 80번포트와 443번 포트이기 때문입니다. 따라서 저희는 가상서버 터미널에서 3000번 포트를 80번 포트로 변경해줘야합니다.

$ vi server.js

vi server.js를 치면
다음과 같이 local서버의 server.js파일의 내용들이 나옵니다.

빨간색 표시해놓은 곳에 커서를 놓고 i 버튼을 누르면 다음과 같이 INSERT표시가 나타나게 됩니다. 그러면 상태값 변경이 가능하게 되는데
여기서 포트번호를 80으로 바꿔줍니다.

80으로 바꿨다면

Esc -> :wq! -> Enter

이렇게 빠져나올 수 있습니다.

그리고 나서

back_aws 터미널

$ sudo node server.js


back_local 터미널

각각의 터미널에서 서버를 키고 퍼블릭 IPv4 값을 주소창에 다시 입력해보면 다음과 같이 로컬파일의 정보를 잘 불러오는 것을 확인할 수 있습니다.

그런데 aws_back터미널에서 서버를 키고 나면 다른 명령어를 입력하지 못하게 됩니다. 이때 백그라운드에 서버를 계속 키는 방법이 있습니다.

아래 코드를 입력하면 됩니다.

$ sudo node server.js &


& 를 입력하면 서버도 돌아가고 다른 명령어도 입력할 수 있는 상태가 됩니다. 제가 $ exit을 써서 ubuntu계정을 나가더라도 계속해서 서버는 돌아가게 되는 것입니다.

서버를 끄는 방법은 $ ps -ef 를 입력하면, 현재 작동되고있는 작업들의
목록이 쭉 뜨게 됩니다.

여기서 저희가 켰던 sudo node server.jsnode server.js
돌아가고 있는 것을 볼 수 있습니다.

돌아가고있는 작업을 강제로 종료하는 방법도 있습니다.

$ sudo kill -9 [PID]

백그라운드에서 서버가 돌아가게 하는 방법에는 &를 쓰는 것 말고 pm2를 이용하는 방법도 있습니다.

3) pm2 패키지 설치🔧

pm2 사용이유

먼저 알아야 할 사실은 Node.js는 기본적으로 싱글 스레드(thread)라는 점입니다. Node.js 애플리케이션은 단일 CPU 코어에서 실행되기 때문에 CPU의 멀티코어 시스템은 사용할 수 없습니다. 만약 보유하고 있는 서버의 사양이 8코어이며 하이퍼스레딩을 지원한다면 최대 16개 코어를 사용 할 수 있는데요. 모든 코어를 사용해 최대 성능을 내지 못하고 오직 한 개의 코어만 사용해야 한다면 주어진 자원을 제대로 활용하지 못하는 꼴이 됩니다. Node.js는 이런 문제를 해결하기 위해 클러스터(Cluster) 모듈을 통해 단일 프로세스를 멀티 프로세스(Worker)로 늘릴 수 있는 방법을 제공합니다. 그렇다면 우리는 클러스터 모듈을 사용해서 마스터 프로세스에서 CPU 코어 수만큼 워커 프로세스를 생성해서 모든 코어를 사용하게끔 개발하면 됩니다.

애플리케이션을 실행하면 처음에는 마스터 프로세스만 생성되는데요. 이때 CPU 개수만큼 워커 프로세스를 생성하고 마스터 프로세스와 워커 프로세스가 각각 수행해야 할 일들을 정리해서 구현하면 됩니다. 예를 들어 워커 프로세스가 생성됐을 때 온라인 이벤트가 마스터 프로세스로 전달되면 어떻게 처리할지, 워커 프로세스가 메모리 제한선에 도달하거나 예상치 못한 오류로 종료되면서 종료(exit) 이벤트를 전달할 땐 어떻게 처리할지, 그리고 애플리케이션의 변경을 반영하기 위해 재시작해야 할 때 어떤 식으로 재시작을 처리할 지 등등 고민할 게 많습니다. 이런 것들은 직접 개발하기에 번거로운 작업입니다. 따라서 이런 문제를 간편하게 해결할 수 있는 무언가가 있으면 좋겠다고 생각할 수 있는데요. 다행히 이런 고민이 녹아있는 PM2라는 Node.js의 프로세스 매니저가 존재합니다. 이 PM2를 간단히 살펴보고, 서비스에 PM2를 적용해 어떻게 Node.js 애플리케이션을 무중단으로 운영할 수 있는 지에 대해서 알아보겠습니다.

출처: LINE Engineering[ PM2를 활용한 Node.js 무중단 서비스하기]

back_local 터미널

$ npm install -g pm2

pm2를 -g를 써서 전체파일에 설치해줍니다.
그리고 pm2 명령어를 하나씩 사용해보면

# 1 npx pm2 start server.js(파일명)
로컬에서 백그라운드로 서버를 실행시킵니다.

# 2 npx pm2 monit
프로세스리스트와 서버로그를 확인 가능합니다.
monit상태를 종료하려면 Ctrl-C를 누르면 됩니다.

# 3 npx pm2 list
백그라운드에서 pm2로 실행되고 있는 서버리스트를 보여줍니다.

# 4 npx pm2 stop server.js(파일명)
해당 서버 실행을 멈추지만, 리스트에는 남아있습니다

# 5 npx pm2 kill
pm2로 실행되고 있는 서버를 아예 삭제해버립니다. 따라서 리스트에 남아있지 않습니다.

PM2명령어의미
npx pm2 start [파일명]백그라운드에서 서버 실행시켜줌
npx pm2 stop [파일명]서버 실행 멈춰줌, 리스트에는 남아있음
npx pm2 monit프로세스리스트와 서버로그를 확인
npx pm2 killpm2로 실행되고 있는 서버를 아예 삭제
npx pm2 list백그라운드에서 pm2로 실행되고 있는 서버리스트

이제는 back_aws 터미널에서도 작업할 것입니다.

back_aws 터미널
ls -al로 디렉토리들을 확인하고 aws_test로 들어갑니다.
그리고 aws_test로 들어간 상태에서 sudo npm install -g pm2
입력하여 pm2를 깔아줍니다.

$ sudo npm install -g pm2


그리고 sudo npx pm2 start server를 입력하면 오류가 나는 것을 볼 수 있습니다. 이미 node로 서버를 켰던 이력이 있기 때문에 오류가 나는 것입니다.

💥sudo를 앞에입력하는 이유는 ubuntu계정에서는 80번포트는 최고관리자 자격으로 서버를 켜야하기 때문

그러므로 ps -ef로 들어가서 이미 실행되고 있는 서버들을 지워주겠습니다. 먼저 pid를 확인하고

sudo kill -9 [pid]코드를 써서 죽여줍니다.

sudo npx pm2 start server.js

둘다 pm2를 사용해서 서버를 잘 켰기 때문에 브라우져에서 hello aws!가 보이는 것을 확인할 수 있습니다!!

안녕하세요!😊 국비지원으로 개발쪽 공부를 시작한 학생입니다!
혹시나 제가 잘못된 정보를 제공하고 있다면 댓글 부탁드립니다! 💚
글 읽어주셔서 정말 감사합니다🙇‍♀️

profile
성실함은 최고의 무기

0개의 댓글