스프링 부트 프로젝트 배포
오늘은 스프링 부트 프로젝트를 배포해 봤다.
먼저 간단하게 그림으로 구조를 그려보면 아래의 그림과 같다.
DB 서버로는 MySQL를 사용하여 Replication 설정을 해주었고, 총 3대의 리눅스 가상 머신을 사용하여 스프링 부트 프로젝트를 배포하였다.
웹 서버로는 nginx 서버로 구성하였고 부하 분산을 위해 스프링 부트 서버를 로드 밸런싱 처리를 해줬다.
하나씩 어떻게 구성하는지 살펴보자.
MySQL DB 구성
먼저 DB 구성부터 살펴보면 이전에 MySQL로 Replication 설정을 정리한 적이 있어서 참고하여 설정했다.
참고로 단방향 Master-Slave로 Replication을 구성하였다.
스프링 부트 프로젝트 설정
Replication 구성이 완료되면 스프링 부트 프로젝트에서 application.yml 파일을 아래와 같이 설정해 주었다.
spring:
datasource:
master:
hikari:
driver-class-name: DB_드라이버
username: 사용자_이름
password: 사용자_비밀번호
jdbc-url: MASTER_DB_URL
slave:
hikari:
driver-class-name: DB_드라이버
username: 사용자_이름
password: 사용자_비밀번호
jdbc-url: SLAVE_DB_URL
기존에는 하나의 DB로 사용했다면 Master와 Slave 총 두개의 DB 서버가 있기 때문에 설정을 추가해 줬고, 해당 yml 파일의 내용은 JPA에서 사용하게 된다.
yml 파일 설정이 완료되면 pom.xml 파일로 이동하여 어떤 형식으로 패키징을 할지 배포 형식을 지정해 주고, 현재 스프링 부트 프로젝트에서 따로 test 코드를 작성한 부분은 없기 때문에 maven.test.skip을 true로 설정하여 빌드할 때 테스트를 스킵해 준다.
<name>ecommerce</name>
<packaging>jar</packaging>
<description>ecommerce</description>
<properties>
<maven.test.skip>true</maven.test.skip>
<java.version>11</java.version>
</properties>
pom.xml 파일 설정을 완료한 뒤 오른쪽에 위치한 maven을 클릭하고 package를 클릭하여 프로젝트 빌드를 시작한다.
프로젝트 빌드가 완료되면 target 폴더에 jar 파일이 생성되는데 해당 파일을 리눅스 가상 머신으로 배포하게 된다.
jar파일을 리눅스 가상 머신으로 옮기기
현재 윈도우 환경에서 만든 jar 파일을 리눅스 가상 머신으로 옮기고 실행시켜야 한다.
여기서 생각해야 되는 부분은 현재 내 PC에서 다른 PC로 옮기는 것이기 때문에 단순히 파일을 폴더로 옮기는 것이 아닌 네트워크 프로토콜을 사용하여 옮겨야 한다.
파일을 다른 PC로 옮길 때 사용하는 네트워크 프로토콜로는 FTP가 있다. 지금은 대표적으로 무료 FTP 서비스인 FileZilla를 사용하여 파일을 리눅스 가상 머신으로 옮겨보았다.
FileZilla를 사용하는 방법으로는 먼저 공식 사이트에서 클라이언트 프로그램을 다운받고 실행시켜 준다.
실행한 클라이언트 프로그램에서 사이트 관리자를 클릭하고 새 사이트를 만들어서 파일을 옮길 리눅스 가상 머신의 네트워크 정보를 작성하고 연결해 준다.
연결이 완료되면 위의 사진과 같이 현재 내 PC의 로컬 사이트와 리눅스 가상 머신의 리모트 사이트가 보이는데 여기서 내가 옮기고 싶은 파일을 더블 클릭해 주면 가상 머신으로 파일을 쉽게 옮길 수 있다.
리눅스 가상 머신에서 jar파일 실행하기
리눅스에서 jar 파일을 실행하기 위해서는 먼저 java 언어가 설치되어야 한다.
현재 스프링 부트 프로젝트에서 사용한 자바 언어와 동일한 jdk를 설치해야 문제없이 실행된다.
yum install -y java-11-openjdk-devel.x86_64
현재 실행할 스프링 부트 프로젝트는 java 11 버전으로 되어있기 때문에 거기에 맞는 jdk를 설치해 준다.
java --version
jdk가 설치되었으면 잘 설치되었는지 버전을 통해서 확인한다.
java -jar [받아온 jar파일]
정상적으로 설치가 완료되었다면 -jar 명령어를 통해서 윈도우 PC에서 받아온 jar 파일을 실행시켜 준다.
jar 파일이 정상적으로 실행되면 위의 사진과 같이 스프링 부트가 시작된다.
처음에 그림으로 확인했던 구조와 같이 위와 같은 방법으로 스프링 부트를 총 3개 실행시켜 준다.
nginx 설정
스프링 부트 프로젝트를 리눅스 가상 머신에서 실행했으면 이제 nginx에서 부하 분산을 설정해줘야 한다.
yum install -y nginx
리눅스 가상 머신을 하나 더 생성하여 기본 네트워크 설정을 진행하고 nginx를 설치해 준다.
vi /etc/nginx/nginx.conf
설치가 완료되면 vi 편집기를 통해서 nginx 설정 파일을 열어서 부하 분산 설정을 진행해 준다.
upstream backends {
39 server 12.12.12.130:8080;
40 server 12.12.12.150:8080;
41 server 12.12.12.160:8080 backup;
42 }
server {
45 listen 80 default_server;
46 listen [::]:80 default_server;
47 server_name _;
48 root /usr/share/nginx/html;
49
50 # Load configuration files for the default server block.
51 include /etc/nginx/default.d/*.conf;
52
53 location / {
54
55 proxy_pass http://backends;
56 proxy_set_header X-Real_IP $remote_addr;
57 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
58 proxy_set_header Host $http_host;
59 }
설정에서 upstream으로 부하 분산한 스프링 부트 서버를 설정해 주고, location을 통해서 proxy 설정을 진행해 준다.
스프링 부트 서버 1대는 backup으로 설정하여 나머지 2대의 서버가 다운되었을 때 실행될 수 있도록 설정을 해주었다.
upstream backends {
server [스프링부트_서버_IP]:[포트번호]
}
upstream 블록은 어떤 서버로 로드벨런싱 할지 정해주는 것으로 먼저 upstream 블록의 이름을 지정해 주고 로드벨런싱 할 서버의 IP주소와 포트번호를 지정하게 된다.
location / {
proxy_pass http://backends;
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;
}
현재 nginx 서버는 프록시 서버로 사용할 것이기 때문에 proxy_pass로 upstream에서 지정한 이름을 http://로 설정해 준다.
location에서 proxy에 설정되는 정보들을 하나씩 살펴보자
$remote_addr: 실제 클라이언트 IP 주소
$proxy_add_x_forwarded_for: 웹 서비스에 사용자의 요청이 경유해 온 게이트웨이 목록을 포함하는 IP 정보로 만약 클라이언트의 요청 헤더에 X-Forwarded-For 필드가 존재하지 않으면 $remote_addr에서 설정된 IP 주소와 동일하다.
$http_host: $host와 같은 값으로 요청 헤더에서 Host 필드를 가져오거나 서버 이름 또는 호스트 이름을 가져온다.
로드 벨런스 테스트
nginx에서 프록시 설정과 로드벨런싱 설정을 완료하고 명령어를 통해서 테스트를 진행해 봤다.
while true;do curl http://12.12.12.140/product/list; echo -e "\n"; usleep 300000; done
0.3초 간격으로 nginx 서버로 요청을 무한 반복 했을 경우에 어떻게 처리되는지 테스트를 했다.
실행 결과를 확인해 보면 nginx에서 설정한 스프링 부트 서버가 정상적으로 로드 벨런싱이 되는 것을 확인할 수 있다.
마지막으로 기존에 실행되고 있던 스프링 부트 서버 2대를 모두 종료하고 전에 backup으로 설정했던 서버가 실행되는지 테스트를 해봤다.
서버를 강제로 종료시키고 확인해보면 backup 서버가 정상적으로 실행되는 것을 확인할 수 있다.
참고 자료
'스프링' 카테고리의 다른 글
소셜 로그인 (1) | 2024.01.04 |
---|---|
스프링 - JWT (0) | 2023.12.28 |
스프링 - 스프링 시큐리티 (0) | 2023.12.25 |
스프링 - 레이어드 아키텍처 (0) | 2023.12.21 |
스프링 - 스프링 프레임워크의 기초 (0) | 2023.12.20 |