본문 바로가기
Server

[AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 2(Lightsail)

by DuncanKim 2022. 10. 5.
728x90

[AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 2(Lightsail)

 

 

이전 편에서는 정말 라이트세일에 가입하고, 서버를 생성하고 기본적인 연결을 해보았다. 이번 편에는 파일질라를 통해 스프링부트 jar 파일을 옮기고, MySQL 서버와 연동하고, ssl, 도메인등록까지 하여 https://(본인 도메인).com 으로 접속했을 때, 데이터베이스를 활용하는 스프링부트 홈페이지를 남들이 볼 수 있게끔 배포를 완성해볼 것이다.

 

내가 사용한 환경은 다음과 같다.

 

로컬 환경 : Mac OS 12.6 / Filezila 3.60.2 / Workbench 8.0.29 / InteliJ

서버 환경 : ubuntu 20.04 / java 17 / mysql 8.0.30 / 

 

 

1. 서버로 파일 전송하고 실행하는 환경 갖추기(파일질라, 서버 내 자바 설치)

 

1) 브라우저 창을 여러 번 열기 귀찮으니 파일질라를 먼저 설치해준다.

 

https://filezilla.softonic.kr/mac

 

FileZilla

안전하고 빠른 FTP 전송

filezilla.softonic.kr

 

2) 서버에 접근한다.

터미널을 열고,

ssh -i (프라이빗 키 파일이름) ubuntu@(공인 ip)

를 실행하여 다음과 같은 창을 띄운다.

 

 

3) 자바를 설치한다.

 

실행문

sudo apt update
sudo apt install openjdk-17-jdk

나는 이미 설치가 되어 되지 않지만, 만약 y/n 가 나온다면, y를 누르고 엔터를 해준다.

 

 

4) 설치한 후 java --version으로 설치가 잘 되었는지 확인한다.

 

잘 설치되었다. 만약 11버전 설치가 필요하다면, sudo apt install openjdk-11-jdk 를 써도 설치가 잘 될 것이다.

 

 

5) 프로젝트 디렉터리 생성

 

mkdir (프로젝트 이름)

 

ubuntu 서버  홈 디렉터리에 프로젝트 이름으로 디렉터리를 생성해준다. 나중에 서버스크립트나 다른 경로를 설정해줄 때 필요하기 때문에, 잘 기억해두어야 헛발질을 안할 수 있다.

 

 

 

2. 시험삼아 jar 파일 생성하고 서버로 전송해보기(Filezila, InteliJ 사용)

 

1) jar 파일 InteliJ에서 생성하기

 

굉장히 쉽다. 나는 그래들로 작업을 했는데, 이 기준으로 설명을 진행할 것이다.

 

오른쪽을 보면 Gradle 탭이 있다. 클릭한다.

 

2) Task - build 디렉터리 안에 있는 bootJar를 더블 클릭한다.

3) 빌드 완료

 

이런 창이 나오면 빌드가 완료된 것이다.

 

 

4) 파일질라로 jar 파일 옮겨 심기

 

파일질라는 로컬 -> 서버 or 서버 -> 로컬로 파일을 전송하기 쉽게 도와주는 하나의 툴이다.

공인IP, 키파일이 있어야 한다. 저번 포스팅을 따라했다면 가지고 있을 것이다.

 

없으면 다시 참고해보자.

2022.09.29 - [IT 지식/Linux, macOS] - [AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 1(Lightsail)

 

[AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 1(Lightsail)

[AWS] ubuntu 서버, MySQL DB 한 번에 배포하기 1(Lightsail) 1. 왜 EC2가 아닌 라이트세일인가?  EC2는 회사에 인프라 관리자가 있거나 자신이 가상 서버, 네트워크, 디스크 볼륨, 보안 그룹 등의 관리를 하

masterpiece-programming.tistory.com

 

 

파일질라를 열고 서버에 접속한다.

Click 부분을 눌러준다.

 

 

프로토콜, 호스트, 로그온유형, 사용자, 키파일을 알맞게 작성해준다.

프로젝트명은 아무거나 해도 상관없는데, 되도록이면 알아보기 쉽게 프로젝트명을 적어주는 것이 좋을 것이다.

 

 

2) 왼쪽이 로컬, 오른쪽이 서버

왼쪽이 로컬이고, 오른쪽이 원격에 있는 서버이다.

아까 터미널로 생성했던 프로젝트 디렉터리가 ubuntu home 디렉터리에 있을 것이다.

 

이 디렉터리에 넣고 우리는 프로젝트를 관리할 것이다.

그렇다면 방금 생성한 jar 파일은 어디에 있는 것일까?

 

 

3) 프로젝트 폴더 - build - libs

이해하기 쉽게 프로젝트 폴더 안의 트리를 보면 다음과 같다.

build 폴더 내 libs 라는 폴더가 있는데, 그 안에 방금 bootjar를 실행한 결과인 jar 파일이 들어가 있는 것을 볼 수 있다.

이 디렉터리를 파일질라의 왼쪽에서 열어주면 된다.

 

본인들이 저장해놓은 폴더를 열면 된다.

 

 

4) 드래그 & 드롭

 

자, 이렇게 하면 jar 파일이 서버로 이동된 것이다. 이제 서버에서 jar 파일을 실행시키기만 하면, 우리가 설정해놓은 공인IP로 누구든지 우리의 서비스를 볼 수 있는 상황이 펼쳐진다.

 

 

5) 실행

 

본인의 프로젝트 디렉터리로 위치를 옮긴 후(cd ...) 아래의 실행문을 입력하면 실행이 된다.

java -jar (jar파일 명).jar

그러나, DB 연결문제 등이 있는 경우, 되지 않을 수도 있다. 그렇기 때문에 아직 완벽하게 띄우지는 못한다.

조금만 더 인내심을 가지고 해보도록 한다...

 

 

 

3. DB 연결 도약을 위한 사전 준비

 

우리는 한 방에 DB까지 연결해서 배포를 성공시킬 것이다. 그렇기 때문에 사전 작업이 굉장히 필요하다.

 

 

1) start.sh / stop.sh (서버스크립트) 작성하기

 

 

(1) start.sh

 

아까 jar 파일을 전송했던 프로젝트 디렉터리로 들어간다. 

vim start.sh

위의 실행문을 입력한다.

(vim이 없으면, install을 해서 진행하면 된다.)

 

#!/bin/bash

JAR=(jar파일 이름).jar
LOG=/home/ubuntu/(프로젝트 디렉터리)/(프로젝트 디렉터리명).log

nohup java -jar -Dspring.profiles.active=prod ./$JAR > $LOG 2>&1 &

이렇게 작성해주고, wq! 를 하고 빠져나온다.

 

간단히 위의 start.sh 를 설명하자면, 터미널 백그라운드 환경에서 jar 파일을 계속 실행시켜놓는 것이다. 중간의 -D 부분이 백그라운드로 실행한다는 것인데, ~~~~active=prod의 경우, 아래의 properties를 새로 입력해주어야 한다. 배포용 properties를 사용한다는 명령어라고 생각하면 되겠다.

 

 

(2) stop.sh

 

마찬가지로 프로젝트 디렉터리에서 작업한다.

sudo vim stop.sh

를 입력한다.

 

#!/bin/bash

(프로젝트명)_PID=$(ps -ef | grep java | grep (프로젝트명)  | awk '{print $2}')

if [ -z "$(프로젝트명)_PID" ];
then
    echo "(프로젝트명) is not running"
else
    kill -9 $(프로젝트명)_PID
    echo "(프로젝트명) stopped."
fi

괄호 프로젝트 명을 모두 지우고, 본인의 프로젝트 영문명을 적으면 된다. 

간략히 이야기하자면, 만약 이 파일이 실행될 경우, 실행되고 있는 프로젝트의 PID 번호를 찾아서 만약, PID가 없는 경우, (프로젝트) is not running이 터미널에 출력되어 나올 것이고, 실행되고 있다면, 프로젝트 PID를 활용하여 kill -9을 하고, (프로젝트) stopped. 라 출력될 것이다.

 

모두 입력했으면, wq! 를 하고 나온다.

 

이제 프로젝트 디렉터리 위치에서 ./start.sh   or   ./stop.sh 실행문 만으로 jar파일 실행과 정지를 할 수 있는 환경을 구축하였다.

 

 

2) properties 개발, 배포 환경 분리

 

우리가 localhost:8080을 주구장창 들어갈 때 사용한 properties가 만약 배포시에도 사용이 되어야 한다면...?

가동중인 서비스에 문제를 파악했을 때,

문제가 있는 파일을 수정하고, 로컬용으로 된 properties를 배포용 properties으로 고치고 빌드를 한 후 다시 properties를 로컬로 바꾸는.... 말도 안 되는 비효율이 발생한다.

 

그렇기에 properties를 분리해야 한다.

 

 

우리는 properties가 어디에 있는지 안다. java springboot 프로젝트의 경우, resources 폴더 내부에 있다.

배포전까지는 application.properties 하나였겠지만, 이제는 application-prod.properties를 하나 더 만들어야 한다.

 

이런식으로 작성을 해주면 된다.

앞으로 있을 진도를 대비해서, DATABASE까지는 모두 입력을 해두자. 아마 여러분들의 원래 properties에 잘 적혀있을 것이다. 적당히 복사하기 붙여넣기를 해두자. 나중에 또 바꿔야 한다.

 

 

3) build.gradle의 버전 설정

 

 

인텔리제이에 온 김에 이야기를 하자면, 우리가 빌드를 할 때 생성되는 파일 이름은 여기에서 결정된다.

version 부분에 무엇인가를 써놓으면, (프로젝트명)-(version).jar 로 파일이름이 자동으로 생성된다.

만약 파일이 생성될 때 자동으로 바꾼 이름을 사용하게 하고 싶다면, 이 부분을 건드려주면 된다.

 

 

 

4) Nginx 설치, 설정, 실행

 

Nginx를 사용하는 이유는 특정 포트를 열어 서비스를 운영하고, ssl 연결을 하기 위함이다.

 

 

(1) 설치

 

설치는 쉽다. 루트 권한으로 설치한다.

sudo apt install nginx -y

 

(2) 설정

 

sites-available, sites-enable 의 설정을 해주어야 한다.

 

먼저 sites-available 폴더로 이동한다.

cd /etc/nginx/sites-available/

 

프로젝트명으로 설정파일을 작성한다.

sudo vim (프로젝트명)

 

내용은 다음과 같이 작성한다.

server {
        listen 80;
        server_name localhost;

        location / {
                proxy_pass http://localhost:8080;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
        }
}

웹 서버를 80포트로 서비스한다는 의미이다. localhost 부분은 도메인 설정할 때 바꿀 것이다.

 

 

+ location 설명

proxy_pass - Nginx 웹서버의 모든 요청을 http://localhost:8080 로 리다이렉트한다.

proxy_set_header - localhost:8080로 실행된 스프링부트 서버에 특정 헤더값을 전달하기 위해서 proxy_set_header를 사용한다. (Nginx를 통해서 스프링부트의 톰캣서버로 요청이 전달되기 때문에 "Remote IP" 헤더값이 실제 값이 아닌 127.0.0.1 처럼 잘못 전달되는 것을 방지하기 위해 사용한다.)

 

 

그다음 sites-enabled 디렉터리의 설정을 바꿔준다.

cd /etc/nginx/sites-enabled/
sudo rm default
sudo ln -s /etc/nginx/sites-available/(프로젝트명)

 

기본 설정된 것을 지우고, sites-available에서 작성한 파일을 링크 걸어주는 것이다.

 

 

(3) 실행

 

sudo systemctl restart nginx

설정파일을 적용하기 위해서는 Nginx를 리스타트 해줘야 한다.

 

리스타트 후에 다음과 같이 test를 해본다.

 

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

아래 두 줄과 같은 출력문이 나오면, 정상적으로 작동되고 있는 것이다.

 

 

5) 도메인 설정

 

도메인 구입은 따로 설명하지 않겠다.

가비아 또는 카페24와 같은 곳에서 도메인을 구입할 수 있으며, 많은 사람들이 포스팅 해놓았다.

시험삼아 도메인을 설정해보고 싶으면 550원짜리 도메인을 구입해보는 것도 나쁘지 않은 선택이 될 것이다.

(단, 1년만 550원이다... 까먹지 말고 해지...)

 

자 만약 도메인을 구입했다면, 아래의 연결방법을 따라하면 된다.

 

 

(1) 라이트세일 홈으로 들어간 후 네트워킹 탭에서 DNS 영역 생성을 누른다.

 

(2) 본인이 구입한 도메인을 입력한 후, DNS 영역 생성을 누른다.

 

 

(3) 레코드 추가를 선택한다.

(4) A 레코드를 선택하고, 하위도메인에는 @를 입력한다. 그리고 확인에는 이전에 등록한 고정아이피를 선택하고, 체크 표시를 누른다.

 

 

(5) 도메인을 구입한 업체에 네임서버 등록하기

 

아래에 네임서버가 있다. 이것을 가비아든 카페24든지 설정을 해줘야 한다.

 

(6) sites-available 디렉터리 파일 수정

 

/etc/nginx/sites-available 폴더 안에 설정 파일을 바꿔준다.

server {
        listen 80;
        server_name (내가구입한 도메인);

        location / {
                proxy_pass http://localhost:8080;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
        }
}

수정을 했으니, 

sudo systemctl restart nginx

를 실행해준다.

 

 

 

4. 정리

 

분량 조절에 실패하였다...

두 편이면 끝날 줄 알았는데, 너무 길어져서, 다음 편에 DB 연결을 하고 마무리를 할 예정이다.

앞으로 남은 것은 DB 연결 / SSL(HTTPS 연결) 이다. 이것만 끝나면, 정말 정상적인 웹 서비스를 배포, 구동할 수 있다.

 

다음 편에서.. 계속...

 

728x90

댓글