[UMC 3기] AWS EC2 Spring boot 프로젝트 오늘의 짐(GYM) 배포

유보라·2023년 1월 15일
0

UMC 3기

목록 보기
4/5
post-thumbnail

안녕하세요 보라입니다!

오늘은 저번 포스팅에서 만들었던 AWS EC2에 Spring boot 프로젝트를 배포해보겠습니다.

아래 포스팅을 참고하여 진행했습니다!

참고: https://velog.io/@tritny6516/Spring-Boot-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-Nginx-HTTPS-%EC%84%A4%EC%A0%95

EC2 서버에 jdk 설치

$ sudo apt-get update 
$ sudo apt-get install openjdk-11-jdk // 자바 11 설치
$ java -version

Spring boot 프로젝트 Build

먼저 배포하려는 Spring boot 프로젝트를 .jar 파일로 만들어야합니다.

인텔리제이 터미널에서 ./gradlew build 명령어를 입력하여 빌드 하면 자동으로 .jar 파일이 생성됩니다.

이때 application.yml 파일이 .gitignore에 올라가 있다면 잠시 해제하고 빌드해주시면 됩니다.

그렇지 않으면 DB 경로를 설정해주지 않아서 나타나는 에러인 'Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.' 에러가 뜰 수 있습니다!

빌드를 마쳤다면 이렇게 libs 디렉토리 안에 .jar 파일이 생길 것입니다.

WinSCP에서 내 EC2에 .jar 파일 넣기

저는 저번 포스팅에서 WinSCP라는 프로그램을 이용하여 EC2 서버에 SSH 연결을 해놓은 상태입니다.

가상 환경 안에 server라는 이름의 디렉토리를 만들어주었습니다.

위 사진은 WinSCP 프로그램입니다. 왼쪽은 제 로컬 컴퓨터이고, 오른쪽은 ec2 서버의 가상 컴퓨터입니다.

제 로컬 컴퓨터를 나타내는 왼쪽에서 제가 배포하려는 프로젝트 폴더에 들어가줍니다. 그리고 방금 만든 .jar파일이 존재하는 libs에 들어갑니다.

이 파일을 오른쪽 server 디렉토리에 옮겨줄 것입니다.

옮긴 후 터미널에서 확인해보니 잘 옮겨졌습니다.

그리고 우리가 인텔리제이에서 프로젝트를 실행하는 것처럼 다음과 같이 명령어를 입력하여 프로젝트를 실행해줍니다.

$ java -jar 파일이름.jar

잘 실행이 됩니다.

그리고 현재 포트 번호는 8123으로 되어있습니다. 퍼블릭IP:8123을 입력했더니 서버가 돌아가고 있습니다.

Nginx Reverse Proxy

저는 저번 포스팅에서 제 ec2 가상 컴퓨터에 Nginx를 설치해주었고 HTTPS 설정과 도메인을 구입하는 것까지 끝냈습니다.

Ngnix를 설치하지 않으셨다면 다음과 같이 해주시면 됩니다.

$ sudo apt-get update
$ sudo apt install nginx -y
$ nginx -v // Nginx 버전 확인
$ sudo service nginx status // Nginx 상태 확인
$ sudo service nginx start // Nginx 시작

이제 Nginx와 Spring boot 프로젝트를 연결해보겠습니다.

저번에 설정해준 것 때문에 여전히 https://퍼블릭:IP 또는 https://{도메인} 으로 접속했을 때 Nginx 서버가 돌아가고 있는데요.


proxy 설정을 해주겠습니다.

$ sudo mkdir /var/log/nginx/proxy/	
$ sudo vi /etc/nginx/proxy_params

포트번호가 80인 http에서 요청이 오면, Spring Boot 프로젝트에서 8123번 포트를 바라볼 수 있도록 proxy_params에 아래의 코드를 작성해줍니다.

도메인 AWS Route 53

저는 이미 전 포스팅에서 도메인을 구입했기 때문에, 따로 설정만 해주었습니다.

AWS에서 Route 53 검색 > 호스팅 영역 생성

위와 같이 도메인이름 입력 후 호스팅 생성

그럼 이렇게 레코드 생성 버튼이 뜹니다. 눌러줍시다.

값에 내 EC2의 퍼블릭 IP를 입력해주고 레코드 생성!

그럼 이렇게 레코드가 3개가 됩니다. 이 중 유형이 NS인 레코드를 보면 값/트래픽 라우팅 대상에 4개의 주소가 있을 겁니다.

가비아에 들어가보면 내 도메인 관리에서 다음과 같이 네임서버 설정칸이 있습니다. 여기에 위에서 언급한 4개의 주소를 채워주면 됩니다.

우선 도메인 연결은 끝났습니다.

서버 블록 생성

도메인을 이용하기 위해서 서버 블록을 생성해줘야합니다.

$ sudo vi /etc/nginx/sites-available/{domain}

// 실제 입력한 명령어
$ sudo vi /etc/nginx/sites-available/todaysgym.shop

명령어를 입력하여 새로운 파일을 만들어주고 아래와 같이 입력해주었습니다.

이 코드는 제가 구입한 도메인 이름을 지정해주고, proxy_pass 설정을 통해 8123번 포트에 접속해야 볼 수 있는 화면(Spring Boot 프로젝트 화면)을 80번(HTTP) 포트에 접속했을 때 확인할 수 있도록 설정해줍니다. 즉 Reverse proxy의 기능을 하게 하는 코드입니다.

그리고 server_name을 추가할 때 해시 버킷 메모리 문제가 발생할 수 있다고 합니다. 아래와 같이 명령어를 입력하여 설정해줍니다.

$ sudo vi /etc/nginx/nginx.conf

해당 명령어를 입력했을 때 나오는 파일에서 아래 부분 주석 처리를 제거해줍니다.

http { ...
	server_names hash_bucke_size 64;	# 주석 처리 제거
	...
}

서버 블록 활성화

아래 명령어를 입력하여 sites-available 디렉토리와 sites-enabled 디렉토리 간에 링크를 생성해 새로 만든 서버 블록 파일을 활성화 해줬습니다.

$ sudo ln -s /etc/nginx/sites-available/{domain} /etc/nginx/sites-enabled/

//실제 입력한 명령어
$ sudo ln -s /etc/nginx/sites-available/todaysgym.shop /etc/nginx/sites-enabled/

그리고 원래 기본적으로 sites-available 디렉토리와 sites-enabled 디렉토리에는 default 파일이 존재합니다. 이 파일이 존재하면 새로운 서버 블록 연결이 안되기 때문에 삭제해주겠습니다.

$ sudo rm  /etc/nginx/sites-available/default
$ sudo rm  /etc/nginx/sites-enabled/default

이제 정말 끝났습니다!!

Nginx 재시작

Nginx 서버를 재시작 해준 후에 Spring Boot 프로젝트를 실행해보겠습니다!

$ sudo nginx -t // 구문 오류 테스트
$ sudo service nginx reload
$ java -jar {jar 파일명}.jar

오류가 발생하지 않았다면 테스트를 해봅시다!

저는 Spring boot 프로젝트에 배포해놓은 api를 통해 테스트해보겠습니다.

이렇게 퍼블릭IP 주소만 입력하거나, 퍼블릭IP:{port#}를 입력하면 다음과 같은 결과가 나옵니다.

이 api는 미리 연결해놓은 db의 Category라는 테이블의 카테고리 이름들을 모두 보여주는 api입니다.

자 이번에는... 도메인 주소로 요청해보겠습니다. todaysgym.shop/categories 를 입력해줍니다.

두구두구,,, 성공적이네요!

터미널을 종료해도 돌아가도록 배포!

'nohup' 명령어와 '&' 명령어를 이용하여 우분투 터미널의 세션 연결이 종료됐을 때도 해당 서버를 계속 실행할 수 있습니다.

'nohup'은 로그아웃으로 세션이 종료되더라도 프로그램이 종료되지 않도록 해주고, '&'은 사용자 눈에 보이지 않도록 해주는 백그라운드 실행을 나타내는 명령어입니다.

두 명령어를 같이 사용하면 종료 없이 백그라운드에서 실행할 수 있습니다. 즉, 무중단 배포가 가능합니다.

$ nohup java -jar {jar 파일명}.jar &

// 중지시키고 싶을 때!!
$ ps -ef | grep java // 백그라운드 실행 프로세스 확인
$ kill -9 {중지시키려는 PID}

배포 꿀팁

아직 자동화 배포가 설정이 안 되어 있어서 수정사항이 생길 때마다 배포를 직접 해야했는데요,

$ nohup java -jar {jar 파일명}.jar &

실행 명령어를 딱 1번만 입력해 준 후에 잠시 기다려준 다음!! 테스트 해보면 잘 됩니다!

백그라운드로 실행했기 때문에 프로젝트가 실행되는게 눈에 보이지 않기 때문에 (인텔리제이에서도 실행시키면 약 30초 정도 걸리는 것처럼..) 기다려줘야합니다.

바로 서버가 실행될 것이라고 생각하고(바보) 명령어를 한 번 치고 나서 바로 API 테스트를 했더니 테스트가 실패해서 계속 껐다 켰다를 반복했습니다 ㅋㅋㅋㅋ

심지어는 이미 백그라운드에서 실행해놓고, 왜 명령어 쳤는데 실행 안 되지? 하면서 포그라운드에서도 실행시켰네요 ㅋㅋㅋㅋ (덕분에 서버 과부하로 인스턴스 재부팅을 많이 했어요...)

HTTPS 연결

음.. default 파일을 제거해주었더니 저번에 해놓았던 certbot https 연결이 해제되었습니다.
새로 연결할 방법을 찾고 따로 포스팅을 작성해야할 것 같습니다.

다음 포스팅 때 뵙겠습니다!

profile
인하대학교 컴퓨터공학과 학생입니다😀

0개의 댓글