섹션 8. 생애 최초 배포하기

김민지·2025년 4월 1일

서버 기초 강의

목록 보기
8/12

EC2에 접속하는 두가지 방법

1. 앞서 다운로드 받은 키 페어 활용

  • 준비물
    • 우리가 접속하려는 EC2의 IP주소
    • 다운로드 받은 .pem 파일 형식의 키 페어
    • 접속하기 위한 프로그램 (git bash or mac terminal)
  1. 앞서 다운로드 받은 .pem 파일 형식의 키 페어를 현재 조작하고자 하는 프로젝트 파일의 root 디렉토리에 붙여넣고, (예: 지금 프로젝트의 경우 library-app 에 붙여넣기) .gitignore 에 추가해주기
  2. 인스턴스 > 연결 버튼을 누르면 나오는 화면에서 SSH 클라이언트 버튼을 누른 후 아래와 같이 실행

    chmod 400 "sshkey.pem" 를 입력해서 키를 공개적으로 볼 수 없도록 설정하기 (보안 문제)

2. AWS Console 로 접속

  • 인스턴스 > 연결 버튼을 누르면 나오는 화면에서 연결 버튼을 한번 더 누르기

기본 linux 명령어 알아보기

  • mkdir <생성하고자하는 폴더이름> : <생성하고자하는 폴더이름>의 폴더를 만듦
  • ls : 현재 위치에서 폴더나 파일을 확인하는 명령어
  • cd : 위치 이동 명령어 (.. 로는 한 단계 뒤로 갈 수 있고, cd 뒤에 이동하고자 하는 폴더명을 붙여서 사용하면 해당 폴더로 이동함)
  • rmdir <제거하고자하는 폴더이름> : <제거하고자하는 폴더이름>의 폴더를 제거

배포를 위한 프로그램 설치하기

  • Git (git clone 으로 코드를 가져오기 위해), Java (서버를 작동시키기 위해), MySQL (데이터베이스의 역할을 수행하기 위해) 을 설치해야 함
  1. sudo yum update : 관리자 권한으로 (sudo), yum (리눅스 패키지 관리 프로그램)을 업데이트해주자
  2. sudo yum install git : Git 다운로드
  3. sudo yum install java-11-amazon-corretto : Java 다운로드
  4. MySQL 설치: 아래와 같이 강의에서 진행한 URL(wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm)을 입력 시 현재는 지원이 종료되어서 존재하지 않는 버전이라 잘못된 요청을 뜻하는 400번대 오류가 발생함.
    따라서, https://dev.mysql.com/downloads/repo/yum/에 접속해서 정확한 최신 정보를 확인해야 한다는 것을 확인함

    최신 정보 확인 결과, 아래와 같으므로 wget https://dev.mysql.com/get/mysql80-community-release-el6-11.noarch.rpm 로 다시 설정해서 다운로드 시도를 해봄

    그러면 아래와 같아진다. 이 때, 실행 파일이 설치완료된 것이 아니라 mysql80-community-release-el6-11.noarch.rpm라는 설치파일이 설치된 것이므로 해당 파일을 실행해서 설치해줘야 한다.

    sudo rpm -ivh mysql80-community-release-el6-11.noarch.rpm 을 입력해서 설치해주면 아래와 같이 설치된다.

    마지막으로, sudo yum install mysql-community-server 를 입력해서 설치하려고 했음에도 실패함.

원인

  • 설치를 시도한 MySQL 패키지들은 el6 즉, Red Hat Enterprise Linux 6 용이지만, 현재 OS인 Amazon Linux 2023은 RHEL 9 계열 기반이다.
  • 즉, MySQL 패키지들에서는 libssl.so.10, libcrypto.so.10 같은 오래된 라이브러리(EL6 기반) 를 요구하고, 현재 OS에는 libssl.so.3, libcrypto.so.3 같은 최신 라이브러리만 설치돼 있어서 충돌이 발생함

해결방법

  • cat /etc/os-release 로 현재 OS 종류 및 버전 확인
    ▷ EL6용 MySQL 패키지를 설치하려고 해서 OS와 맞지 않은 것을 확인함
  • sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm : MySQL RHEL 9용 repo 설치하기
    ☞ RHEL 9 기반인 Amazon Linux 2023과 호환됨
  • sudo dnf clean all, sudo dnf makecache : 메타데이터 삭제
  • sudo dnf install -y mysql-community-server --nogpgcheck : MySQL 8 설치 (GPG 키 인증 생략)
  • sudo systemctl status mysqld 로 설치 확인

    ✩ Amazon Linux 시스템에서는 MySQL 서비스 이름이 mysqld라고 함!
  1. MySQL 재시작하기: sudo systemctl restart mysqld
  2. MySQL 임시 root 비밀번호 확인: sudo grep 'temporary password' /var/log/mysqld.log
  3. MySQL 접속하기: mysql -u root -p 로 접속 후 6번에서 확인한 비밀번호 넣기
  4. 임시 비밀번호 변경하기: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<비밀번호>';
    비밀번호 규칙: 8자리 이상, 대문자 소문자 숫자 특수문자 전부 포함 필수

    이 때, application.yml 파일의 MySQL 비밀번호 설정도 함께 업데이트해야 함
  datasource:
    url: "jdbc:mysql://localhost/library"
    username: "root"
    password: "<비밀번호>"
  1. 아래와 같이 테이블 생성 쿼리 입력해주기
use library;
create table user
(
    id   bigint auto_increment,
    name varchar(25),
    age  int,
    primary key (id)
);
create table book
(
    id   bigint auto_increment,
    name varchar(255),
    primary key (id)
);
create table user_loan_history
(
    id        bigint auto_increment,
    user_id   bigint,
    book_name varchar(255),
    is_return tinyint(1), -- 0이면 대출중, 1이면 반납됨
    primary key (id)
)

빌드와 실행, 그리고 접속

  • git clone https://github.com/SpringPeeps/study.git 으로 클론해서 가져오기

  • SWAP 설정: 현재 대여해서 사용하고 있는 free tier 서버는 성능이 그렇게 좋지 않아서 빌드나 실행 시 렉이 많이 걸릴 수 있음. 따라서, 메모리가 부족한 경우에는 디스크를 사용해서 실행할 수 있도록 설정해줘야 함!

  • 즉, 원래 프로그램은 RAM에서 실행됨. 그러나 우리가 free tier로 구매한 RAM은 1GB 정도밖에 안됨. 그러므로 RAM이 부족해서 터지는 상황을 방지하기 위해서 메모리가 부족한 경우에는 디스크에서도 실행할 수 있도록 설정함.

# swap 메모리를 할당
sudo dd if=/dev/zero of=/swapfile bs=128M count=16

# swap 파일에 대한 권한 업데이트
sudo chmod 600 /swapfile

# swap 영역 설정
sudo mkswap /swapfile

# swap 파일 사용 가능하도록 하기
sudo swapon /swapfile

# swap 성공 확인
sudo swapon -s
  1. 위의 명령어를 입력해서 아래와 같이 실행된 것을 확인함
  2. chmod +x ./gradlew, ./gradlew build -x test 명령어로 build를 진행해야 함
  3. 아래와 같이 폴더 구조를 확인해보면 library-app-0.0.1-SNAPSHOT.jar로 서버를 시작한다. (해당 파일이 개발한 소스코드를 하나로 합쳐둔 아티펙트에 해당함)
  4. java -jar build/libs/library-app-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev 로 서버 시작
  • SpringBoot에는 Tomcat이 내장되어있으므로 .jar 파일만 실행해도 서버가 바로 시작되는 것임!
    Tomcat: Web Application Server(WAS)의 한 종류로, 요청이 들어오면 요청을 약속된 형식에 맞추어서 스프링에 전달해줌. SpringBoot 이전, Spring을 사용할 때에는 Tomcat과 따로따로 분리되어 있었음.
    ☑︎ SpringBoot = Spring + Tomcat
  1. 인스턴스 > 보안으로 이동하면 확인할 수 있는 인바운드 규칙이 바로 서버에 접속할 수 있는 포트 번호를 의미함! 지금은 22번 포트만 열려있으므로 규칙을 편집해줘야 함.

    보안그룹에 접속해서 아래와 같이 인바운드 규칙 편집 클릭하기

    아래와 같이 규칙을 추가해준 후 저장하기
  2. http://<publicIP>:8080/v1/index.html로 접속해서 확인하기
  • 서버 종료를 위해서는 Ctrl + C 로 종료하면 됨!


    위와 같이 터미널에서 sql 로그도 확인 가능
  • 만약 빌드 파일을 지우고 싶다면 ./gradlew clean 으로 삭제해주기

현재 배포된 서버의 문제점
우리가 EC2에 접속을 끊으면 서버도 함께 종료됨

종료되지 않는 실행

  1. nohup <명령어> & : 리눅스에서 해당 프로그램을 background에서 동작하도록 하는 명령어
    즉, 우리의 서버를 background에서 실행하려면, <명령어> 자리에 서버 시작 명령어를 넣어서, nohup java -jar build/libs/library-app-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev & 를 입력하면 됨!
  • nohup.out : 현재 background에서 실행중인 서버의 로그가 화면에 찍히는 대신, 이 폴더에 저장되게 됨.
  • ps aux : 현재 실행중인 프로그램(서버) 목록 확인
    • ps aux | grep java : 현재 실행중인 프로그램(서버) 목록 확인
  • kill -9 <프로그램번호>: 위의 사진에서는 74322, 즉 두번째로 나오는 번호가 프로그램의 번호이다.
  1. nohup.out 파일의 내용물 확인하기
  • 방법 1: 파일에 직접 들어가서 내용 읽기
    vi nohup.out : vi는 리눅스 편집기인 vim을 사용하여 파일을 연다. vim 편집기에서 나가는 방법: Esc + :q + Enter
  • 방법 2: 파일에 들어가지 않고, 현재 접속한 터미널에서 내용 확인
    cat nohup.out : cat 은 파일에 있는 내용을 전부 다 출력하는 명령어이다.

    이 때, 지금은 간단한 프로그램이고 실행한지 얼마 되지 않아서 로그가 얼마 되지 않지만 만약 로그의 양이 아주 많은 큰 서버라면? cat 으로 전체 출력해버리면 한참을 출력만 해야할 것이고, 최신 로그를 확인하기 위해 또 한참을 위로 올려야 할 것이다. 이를 방지하기 위해 tail nohup.out 명령어를 사용해서 최신 몇줄만 출력할 수 있다.

    이 때, 실시간으로 업데이트되는 로그를 계속 끝부분만 확인하고 싶다면? tail -f nohup.out 이라고 옵션을 줘서 실행하면 된다.

    실행한 후 웹 UI에서 몇가지 기능을 클릭해보며 실시간 로그를 확인해본 화면이다.

가비아를 이용한 도메인 구입, DNS 적용

  1. 화면에서 DNS 관리툴 버튼을 눌러주기.
  2. 우측의 설정 버튼 클릭
  3. 레코드 수정 버튼 클릭
  4. 상태에서 확인 버튼 클릭 후 저장 버튼 클릭
  5. http://www.backendbase.site:8080/v1/index.html 로 접속하면 들어가져야 함

Section 7 정리 (리눅스 명령어 정리)

  • mkdir : 폴더를 만든다.
  • ls : 현재 위치에서 폴더나 파일을 확인한다.
  • ls -l : 조금 더 자세한 정보를 확인할 수 있다.
  • cd : 폴더 안으로 들어간다.
  • cd .. : 상위 폴더로 올라간다.
  • pwd : 현재 위치를 확인한다.
  • rmdir : 비어 있는 폴더(디렉토리)를 제거한다.
  • sudo yum update : 관리자의 권한으로 설치되어 있는 여러 프로그램을 최신화한다.
  • sudo yum install 프로그램_이름 : 관리자의 권한으로 프로그램을 설치한다.
  • sudo systemctl status 프로그램 : 프로그램의 상태를 확인한다.
  • sudo systemctl restart 프로그램 : 프로그램을 재시작한다.
  • chmod : 파일이나 폴더의 권한을 변경한다.
  • ctrl + c : foreground로 실행 중인 프로그램을 중단하는 신호이다.
  • nohup [명령어] & : 명령어를 background로 실행시킨다.
  • rm : 파일을 제거한다.
  • vi : 리눅스 편집기인 vim을 이용해 파일을 연다.
  • cat : 파일에 있는 내용물을 모두 출력한다.
  • tail : 현재 파일의 끝부분을 출력한다.
  • tail -f : 현재 파일의 끝부분을 실시간으로 출력한다.
  • ps aux : 현재 실행 중인 프로그램 목록을 확인한다.
  • ps aux \| grep java : java가 들어가는 프로그램 목록을 확인한다.
  • kill -9 프로그램_번호 : 해당 프로그램을 종료시킨다.
  • ./gradlew build : 프로젝트를 빌드한다.
  • ./gradlew build -x test : 프로젝트를 빌드하는데, 테스트는 생략한다.
  • ./gradlew clean : 현재 빌드된 결과물을 제거한다.

0개의 댓글