[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://bj-turtle.tistory.com/33
'클라우드 플랫ㅍ > aws 서버.' 카테고리의 다른 글
[AWS] Lambda로 이미지 리사이징 하기 (0) | 2024.05.11 |
---|---|
[AWS] S3 연결하기 ( 이미지 업로드 ) (0) | 2024.05.10 |
[AWS] 도메인 연결하기 (가비아) (0) | 2024.05.10 |
댓글