[AWS] AWS에 배포하기 (ubuntu, mysql, pm2)

728x90
반응형

 

[AWS] AWS에 배포하기 (ubuntu, mysql, pm2)

무료 기준으로 프론트, 백엔드 서버 만드는 것을 설명 하겠습니다.

 

 

AWS에 서버 추가

  • 회원가입 -->
  • EC2대시보드 -->
  • 인스턴스 시작 -->
  • 프리티어(무료) 중 하나 선택 -->
  • ubuntu 선택 -->
  • 보안그룹에서 http, https 규칙 추가 -->
  • 키 페어 선택 / 없다면 새 키페어 생성 -->
  • 인스턴스 생성 후(프론트/백엔드) 인스턴스 메뉴로 이동 -->
  • [웹]  인스턴스(서버) 실행 -->
  • [깃헙]  프로젝트를 github repository에 등록  (깃을 통해서 서버에서 다운로드 위해서) -->

  
git init
git remote add origin 깃헙 주소
git add .
git commit -m '커밋 메세지'
or
git commit -am '커밋 메세지'
git push origin main

 

*키 페어

EC2 서버 접속에 필요한 파일다.

권한 설정 및 사용방법에 대해서 알아야하는데 https://wookim789.tistory.com/34 이 블로그를 참고하면 좋다.

 

  • [공통] 키 페어 참고해서 ssh로 ec2에 접속(ubuntu@ip-xxx) (프론트, 백 서버 각가 다른 터미널에서 다 해줘야 한다) -->
  • [공통]  ec2서버에 깃 레포지 다운 ( git clone 깃헙 주소 ) --> 
  • [공통]  필요한 폴더로 이동 (우선 front) -->
  • [공통]  npm i를 해줘야하는데 이를 위해 필요한게 우분투에 노드 설치하기 (https://thebook.io/080334/0037/) 여기를 참고해도 된다 -->

 

* 깃헙 레포지 다운


  
*깃헙 레포지 다운
git clone 깃헙 주소
*명령어
ls : 내부 폴더 및 파일들 보여줌
ls -al : 더 자세하게 보여준다.
pwd : 현재 폴더 경로 보여줌

 

*우분투에 노드, mysql 설치하기


  
sudo apt-get update // 업데이트
sudo apt-get install -y build-essential // 이걸 받아야 bycript같은거 설치할때 에러 안나게해줌
sudo apt-get install -y curl
curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash --
sudo apt-get install -y nodejs
// mysql을 설치해야한다면
sudo apt-get install -y mysql-server
// 확인
node -v
npm -v

 

 

  • [공통]  우분투에 노드를 설치 했다면 npm i  -->
  • [back] 백엔드 서버에서 mysql 설치하기 -->
  • [back]  sudo su해서 root 계정으로 전환 -->
  • [back]  root로 넘어와서 mysql_secure_installation 명령어 입력 -->
  • [back]  2 (strong)  선택 / password 설정 / 모두 y 선택 -->
  • [back]  mysql -uroot -p 명령어 입력 후 패스워드 입력 (mysql 접속) -->

  
// mysql 설치되어있는지 확인
dpkg -l | grep mysql-server
// 명령어는 MySQL 데이터베이스 서버를 보다 안전하게 설정하기 위한 스크립트입니다.
// 이 스크립트를 사용하면 데이터베이스 서버의 보안 관련 여러 설정을
// 간단하게 변경할 수 있습니다.
// MySQL을 처음 설치한 후에 실행하는 것이 일반적입니다.
// 스크립트는 특히 공개적으로 접근 가능한 서버를 운영할 때 매우 유용합니다.
// 이를 통해 데이터베이스의 기본적인 보안 설정을 강화하고,
// 잠재적인 보안 취약점을 줄일 수 있습니다.
// 이 스크립트는 터미널 또는 명령 프롬프트에서 실행할 수 있으며,
// 몇 가지 간단한 질문에 답하면서 진행
mysql_secure_installation
// 아래가 바로 몇 가지 간단한 질문
2 (strong) 선택 / password 설정 / 모두 y 선택
mysql -uroot -p // mysql 접속

 

*MySQL 접속 오류가 났을때 

[ ERROR 1045 (28000): Access denied for user 'root@'localhost' (using password: NO) 오류가 떠서 밑의 방법으로 해결하였으니 참고바란다. ]

 

로그인 오류 

유형 1) ERROR 1045 (28000): Access denied for user 'root@'localhost' (using password: NO)
- 사용자의 비밀번호가 없을 경우 나타나는 오류 문구, 아래 해결 방법에 있는 명령어들 중 하나를 선택해 입력.
[해결 방법]
1. mysql -u 사용자
2. mysql -u 사용자 -p 비밀번호
3. mysql -u 사용자 -p
Enter password : 비밀번호 입력

위 세 가지 방법 중에서 하나 선택 (3번 방법을 추천, 3번은 명령어 실행 후에 비밀번호 입력 필요함.)

 

유형 2) ERROR 1045 (28000): Access denied for user 'root@'localhost' (using password: YES)
- 사용자의 비밀번호가 틀렸을 경우 나타나는 오류 문구, 아래 해결 방법에 나와있는 명령어들을 입력.
[해결 방법]
mysql > use mysqlmysql > update user set password=password('비밀번호') where user='사용자'; // 비밀번호 변경mysql > flush privileges; // 변경사항 적용

 

 

비밀번호 재설정

[해결 방법]
mysqld --skip-grant // 인증 없이 mysql 진입
위의 유형 2번처럼 비밀번호 재설정

 

[ root 계정이 아닌 MySQL 유저 계정 생성 ]

1. root  계정으로 MySQL 접속

2. [유저생성] 콘솔창에 create user '아이디'@'%' identified by '비밀번호'; 입력하기
[ host를 '%'로 주면 모든 외부 IP에서 접속할 수 있다. / 특정 IP 대역에서만 접속하게 설정하려면 'IP.%'로 입력해준다.]
ex) '132.132.%' -> 132.132.xxx.xxx 에서만 접속 가능

3. [DB 권한 주기] 콘솔창에 grant all privileges on *.* to '아이디'@'%'; 입력하기

4.[최종 권한 적용] 콘솔창에 FLUSH PRIVILEGES; 입력하기

 

 

 

 

  • [back]  완료 후 exit으로 나오기 -->
  • [back]  package.json에 start 명령어 추가 후 깃헙 업데이트/받기 후 npm start ( .dotenv 에러 발생 ) --> 
  • [back]  .dotenv 만들어주기 -->

 


  
// vim이라는 에디터로 .env파일 만들어주기
// a or i 입력 후 insert모드에서 필요한 정보 입력 후
// esc클릭 후 :wq 입력 후 저장/나오기
// 파일 만들기
vim .env
// 등록
COOKIE_SECRET = xxx
DB_PASSWORD = xxx

 

  • [back]  mysql -uroot -p 로 mysql 접속 -->

 


  
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀번호';
exit -->
// 리액트 노드버드 db생성
npx sequelize db:create

 

  • [back]  npm start ( 실행 확인 ) -->
  • [back]  포트변경 3065 -> 80 -->
  • [back]  포트를 80번으로 바꾸고나서 부터는 root나 sudo를 통해서만 서버를 켤 수 있으니 주의 --> 

 

*코드에 업데이트를 했다면?


  
로컬 프로젝트에서
git commit -am '커밋 내용'
git push origin main // 깃헙 레포지에 보내주기
이후 ec2서버로 돌아와서 (ubuntu@ip-xxx)
깃헙 업데이트 내용 받아주고 git pull
필요하다면 npm i
빌드해주고 npm run build
프로젝트 실행하기 npm start

 

* npm run build할때 메모리 부족으로 멈춰지는 경우가 있다 이럴때는

https://ldgeao99-developer.tistory.com/600 해당 블로그 참조!

 

위에서 나오는 코드 업데이트 이후의 과정이 번거롭다면
대신해주는 서비스가 있다. CI/CD 툴 ( 젠킨스, 깃헙 액션 )

 

 

*만약 서버를 또 추가한다면?

서버 추가하고, 노드 깔아주고, 깃 클론하고, 등등 아주 귀찮고,

백엔드는 트래필 몰리면 여러서버로 늘려준느 스케일링도 하고 이럼또 위에 작업 이어지고

이럴대 편하게 해주는게 doker가 있다.  

 

 

*aws할때 주의할 점?

원격으로 접속되어있는 서버들 (프론트, 백)

서버들을 접속해 있는 터미널 or shell을 꺼버리면 (로컬로 돌아오면)

서버가 멈춰버린다. 이게 참 애매하다.

이러한 이유는 node app으로 실행하면 foreground process이기 때문이다.

그러면 background process를 사용하면 터미널을 끄고 다른 작업을 하더라도, 기존의 서버는 계속 켜져있다.

  • foreground process = 터미널 끄면 같이 꺼짐 (node app)
  • background process = 터미널 꺼도 안 꺼짐

이를 위한게 명령어 뒤에 $붙이는게 있는데 (sudo node app $) 이건 비추한다.

pm2 설치를 추천


  
npm i pm2
명령어
npx pm2 start 파일명(.js 꼭 붙여야함) // 시작
npx pm2 monit // 로그 확인
npx pm2 kill // 서버 끄기
npx pm2 list // 서버 리스트 보기
npx pm2 reload all // 모든 서버 재시작
npx pm2 logs // 로그 보기
npx pm2 logs --error // 에러 로그 보기
장점이 에러나면 로그를 기록해주고, 자동으로 재실행한다.
같이 사용하기 (80포트)
sudo npm start && sudo npx pm2 monit
특정 포트로 실행되고 있는지 확인
(sudo) lsof -i tcp:포트번호

 

 

  • [back]  pm2 설치 -->
  • [back]  package.json 가서 명령어를 pm2로 수정 (pm2 start app.js) -->
  • [back]  npm run start로 pm2로 켜지는거 확인 -->
  • [back]  이러면 터미널을 사용하면서 서버는 계속 켜두도록 할 수 있다. (background process) -->
  • [back]  백엔드 배포용으로 수정 --> 

 

/app.js


  
back서버 운영용으로 수정
npm i pm2 cross-env helmet hpp
cross-env // 노드에서도 환경 변수 사용할 수 있게 해줌
const hpp = require('hpp');
const helmet = require('helmet');
// 운영용 빌드
if (process.env.NOD_ENV === 'production') {
// 로그볼 수 있게 해주는 것
app.use(morgan('combined'));
// 보안에 도움되는 패키지들
app.use(hpp());
app.use(helmet());
} else {
// 로그볼 수 있게 해주는 것
app.use(morgan('dev'));
}
app.use(
cors({
// true or * // access-control-allow-origin가 true된다. --> 다른 도메인끼리 api 요청
origin: ['http://localhost:3000', 'nodebird.com', '13.125.119.94'],
// access-control-allow-credential가 true된다. --> 다른 도메인끼리 쿠키 전달
credentials: true,
})
);

 

/package.json


  
"scripts": {
"dev": "nodemon app",
"start": "cross-env NODE_ENV=production pm2 start app.js"
},

 

 

  • [back]  커밋 후 푸쉬 -->
  • [back]  (sudo) git pull 후에 npm i로 모듈 설치 -->
  • [back]   sudo npm start (실행 확인) -->
  • [front] pm2 설치 (background process위해서) -->
  • [front] 로컬에서 사용했던 백엔드 ip 수정하기 (작업 후 깃푸쉬, 깃풀) -->
  • [front] package.json에서 실행포트 80으로 변경 -->

파일 만들고 필요한데다가 불러서 사용으로 수정

백엔드 url은 고정하지 않는 이상 계속 바뀌기 때문에 정리해줘야 한다.

 

/config/config.js


  
export const backUrl = 백엔드 주소;

 

 

/package.json


  
"scripts": {
"dev": "next dev",
"build": "cross-env ANALYZE=true NODE_ENV=production next build",
"start": "cross-env NODE_ENV=production next start app.js -p 80"
},

 

  • [front] 바뀐 내용이 있다면 꼭! sudo npm run build -->
  • [front] 시작명령어를 pm2로 npm start실행 -->
  • [front]  (sudo) npx pm2 start npm -- start -->
  • 백엔드에선 프론트 주소, 프론트에선 백엔드 주소를 넣어줘야 보안 이슈 (cors)에 안걸린다 -->

 

/package.json


  
(sudo) npx pm2 start npm -- start

 

 

 

 

 

 

 

 

참조!

제로초님의 react-nodebird

https://www.inflearn.com/course/lecture?courseSlug=%EB%85%B8%EB%93%9C%EB%B2%84%EB%93%9C-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%A6%AC%EB%89%B4%EC%96%BC&unitId=49014&tab=curriculum&category=questionDetail&q=1261452

 

학습 페이지

 

www.inflearn.com

https://bj-turtle.tistory.com/33

 

AWS EC2 인스턴스에 MySQL 구축

🟨 목 차 🟨 1. 데이터베이스 관리 시스템[DBMS]의 필요성 2. 데이터베이스 관리 시스템이란 3. 데이터베이스 관리 시스템의 기능 4. 데이터베이스 관리 시스템의 장점 및 단점 5. MySQL[ DBMS ] 선택

bj-turtle.tistory.com

 

728x90
반응형

댓글