← 블로그로 돌아가기

Spring Boot 웹 애플리케이션 배포하기

Nginx를 활용한 Spring Boot 배포 환경과 간단한 CI/CD 구성 과정을 정리합니다.

Spring Boot 프로젝트를 배포하기 위한 시스템을 구축했습니다. 여러 내용을 찾아보며 진행했기 때문에 전체 과정을 정리해 봅니다.

구축한 시스템의 구성도는 다음과 같습니다.

Spring Boot 웹 애플리케이션 배포 구성도

SSH 인증서를 사용해 Rocky Linux 서버를 구성합니다. Linux에 Nginx를 설치해 요청 도메인에 따라 각 포트로 전달하고, 해당 포트의 Spring Boot가 요청을 처리하게 합니다. 이제 단계별로 설명하겠습니다.

1. Linux에 Java 설치하기

먼저 Linux 서버에 Java가 설치되어 있는지 확인하고, 없다면 원하는 버전을 설치합니다.

# Java 설치 여부 확인
yum list installed | grep java

# 원하는 버전이 아니라면 기존 버전 삭제
sudo yum remove -y [package name]

# yum으로 설치할 수 있는 JDK 버전 확인
yum list java*jdk-devel

# 원하는 버전 설치(여기서는 Java 17)
sudo yum install java-17-openjdk-devel.x86\_64

환경 변수를 설정합니다.

# /etc/profile 편집
sudo vi /etc/profile
# /etc/profile에 추가
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.9.0.9-2.el8_8.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
# 수정한 profile 적용
source /etc/profile

# 환경 변수 확인
echo $JAVA_HOME

2. Maven 설치하기

Spring Boot 프로젝트를 Maven 기반으로 작성했으므로 서버에 Maven을 설치합니다.

Maven 설치 파일

위 링크에서 원하는 Maven 버전의 tar.gz 파일 경로를 복사한 뒤 아래 순서로 설치합니다. 설치 경로는 바뀔 수 있으므로 다운로드 전에 URL을 확인하세요.

wget https://archive.apache.org/dist/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz -P /tmp

# 다운로드한 파일 압축 해제
sudo tar xf /tmp/apache-maven-3.9.6-bin.tar.gz -C /opt

# 편리하게 사용할 심볼릭 링크 생성
sudo ln -s /opt/apache-maven-3.9.6 /opt/maven

Java를 설치할 때처럼 환경 변수를 설정합니다. 이번에는 /etc/profile.d 디렉터리에 maven.sh 파일을 따로 만듭니다. /etc/profile/etc/profile.d의 설정은 모두 불러오므로 이 방식으로 설정해도 됩니다. Linux에서는 가능하면 /etc/profile 자체를 수정하지 않고 /etc/profile.d/에 새 파일을 만드는 것을 권장합니다.

# maven.sh 파일 생성
sudo vi /etc/profile.d/maven.sh
# maven.sh에 추가
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.9.0.9-2.el8_8.x86_64
export M2_HOME=/opt/maven
export MAVEN_HOME=/opt/maven
export PATH=${M2_HOME}/bin:${PATH}

maven.sh에 실행 권한을 부여하고 환경 변수를 적용합니다.

sudo chmod +x /etc/profile.d/maven.sh
source /etc/profile.d/maven.sh

3. Nginx 설치하기

Nginx를 리버스 프록시 서버로 사용해 요청을 도메인별로 분류하고, 대응하는 내부 Spring Boot 서비스로 전달합니다. 먼저 아래 명령으로 Nginx를 설치합니다.

dnf update
dnf module list nginx
dnf install nginx

설치가 끝나면 Nginx 설정 파일을 수정합니다. 기본 설정 경로는 /etc/nginx입니다. 이곳의 nginx.conf가 기본 설정 파일이지만, 여러 서비스를 설정하거나 서비스별 설정 파일을 만들려면 기본 파일의 server 내용을 주석 처리하고 conf.d 디렉터리에 새 설정 파일을 추가합니다.

Nginx 설정 파일 화면

위 그림에서 밑줄 친 설정 덕분에 conf.d 디렉터리에 .conf 확장자의 파일을 만들면 자동으로 읽습니다. 기본 설정은 주석 처리한 상태입니다.

conf.d 아래에 default.conf를 만들었다고 가정해 보겠습니다. 아래 내용은 예시이므로 실제로 작성할 때는 사용하는 도메인과 설정을 충분히 이해하고 적용해야 합니다.

# SSL이 적용된 443 포트로 요청이 들어올 때
server{
        listen 443 ssl;
        server_name     wellsbabo.com; # 도메인에 맞게 변경
        ssl_protocols   TLSv1.2;
        # SSL 파일 이름에 맞게 변경
        ssl_certificate /usr/ssl/wellsbabo.pem;
        ssl_certificate_key /usr/ssl/wellsbabo.key;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 5m;
        ssl_ciphers HIGH:MEDIUM:!SSLv2:!PSK:!SRP:!ADH:!AECDH;
        ssl_prefer_server_ciphers on;
        server_tokens off;
        # 요청 도메인과 경로에 따라 분리
        # wellsbabo.com/aaa/ 요청을 내부 localhost:10001/aaa/로 전달
        location ^~ /aaa/ {
                proxy_pass http://localhost:10001/aaa/;
        }

        location / {
                return 404;
        }
}

# SSL이 적용되지 않은 80 포트로 요청이 들어올 때
server{
        listen 80;
        server_name _;
        server_tokens off;
        location ^~ /aaa/ {
                proxy_pass http://localhost:10001/aaa/;
        }
        location / {
                return 404;
        }
}

설정 파일 작성을 마치면 아래 명령으로 Nginx 서비스를 시작합니다.

systemctl enable nginx
systemctl start nginx
systemctl status nginx # Nginx 상태 확인

4. Git 설치와 간단한 CI/CD 구성

먼저 서버에 Git을 설치합니다.

sudo dnf install git

Git 설치 후 프로젝트 빌드 과정에 맞는 Ansible 스크립트를 작성하고 저장소에 올립니다. 업로드하기 전에는 작성한 Ansible 스크립트의 순서에 따라 직접 빌드와 배포를 진행해 정상적으로 동작하는지 테스트합니다.

테스트가 끝나면 Jenkins에 새 Item을 만들고 앞에서 작성한 스크립트로 빌드를 진행합니다. 여기서는 간단히 정리했지만 자세한 내용은 이후에 보충하겠습니다.