[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
    반응형

    댓글