본문 바로가기
nginx

[nginx] Nginx로 무중단 배포 (Maven) - 1

by 상도동개발자 2023. 2. 14.
SMALL

1. 무중단 배포 구조

무중단 배포는 여러 방법이 있는데, 그중 Nginx를 이용해 내부 포트를 바꿔 무중단 배포를 하는 방식에 대해 알아보겠습니다. 테스트를 위해서는 1대의 Nginx와 2대의 Spring Boot jar파일이 필요합니다.

구조는 아래 그림과 같습니다.

8081 포트를 바라보는 nginx

사용자가 80번 포트로 접속하면 Nginx는 기존 버전의 서버 포트인 8081로 전달합니다.

8082 포트는 현재 연결된 상태가 아니므로 어떠한 요청도 받지 못하는 상태입니다.

8082 포트를 바라보는 nginx

- 신규 버전 배포가 필요하면 Nginx와 연결되지 않은 8082번 포트로 변경

- 신규 배포가 정상적으로 완료되면 위 그림과 같이 Nginx에 연결된 포트를 8082로 변경하고 Nginx를 Reload하는데 Nginx Reload는 1초 이내에 실행이 완료됩니다.

프로젝트 설정 - 1
프로젝트 설정 - 2

해당 프로젝트를 Intellij로 열어주고, 아래 API를 추가합니다.

API 추가

그다음 port 변경 시 사용 할 properties를 생성해줍니다.

application-set1.properties

application-set1.properties

application-set2.properties

application-set2.properties

2. API 테스트

API가 정상 동작하는지 테스트를 하기 위해 사용 할 properties를 생성해줍니다.

application-local.properties

application-local.properties

테스트 코드 작성

WebRestControllerTest.class

3. 프로젝트 Build

3-1. Maven > Lifecycle > package 를 클릭하여 빌드

gui를 통한 빌드

3-2. 터미널에서 명령어를 통한 빌드

터미널에서 빌드

4. Jar 업로드 및 실행

4-1. Windows PowerShell 실행

4-2. 파일 보내기

scp [파일명.jar] [리눅스 유저ID]@[IP번호]:[파일 옮길 리눅스 경로]

4-3. JAR 파일 실행

nohup java -jar -Dspring.profiles.active=set1 *.jar &

8081 포트 확인

실제로 적용이 되었는지 8081 포트로 접속해서 확인해보겠습니다.

8081포트 접속

5. Nginx 설정

이제 80포트로 접속했을 때 8081포트에 대한 웹을 보여 줄 수 있도록 Nginx를 설정하겠습니다.

먼저, Nginx를 설치합니다 ( 환경 : Ubuntu 21.10)

sudo apt update

sudo apt install nginx

설치가 완료되면 아래와 같이 nginx의 상태를 확인해봅니다.

service nginx status

status

이제 8081 포트로 프락시 될 수 있게 conf 파일을 설정해야 합니다.

/etc/nginx/nginx.conf 파일을 열어서 확인해보면 아래와 같은 문구를 볼 수 있습니다.

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

해당 내용은 nginx는 /etc/nginx/conf.d/ 에 존재하는 모든. conf 파일과 /etc/nginx/sites-enabled/ 에 존재하는 모든 파일을 include 해온다는 뜻입니다.

여기서 우리가 건드릴 곳은 sites-enabled입니다. 정확히는 sites-available에 설정 파일을 생성하고 그에 대한 심볼릭 링크를 sites-enabled에 생성해야 합니다.

그다음 nginx를 restart 하거나 reload 하면 설정 파일의 내용들이 적용됩니다.

nginx 파일 설정에 대한 이미지

우선, /etc/nginx/sites-available 에 .conf 파일을 생성합니다. 여기서는 server.conf로 생성했습니다.

server {
    listen 80;
    listen [::]:80;

    server_name _;

    include /etc/nginx/conf.d/service-url.inc;
    location / {
         proxy_pass $service_url;
         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;
    }
}

server.conf

 

그리고 /etc/nginx/conf.d/service-url.inc를 아래와 같이 설정합니다.

set $service_url http://127.0.0.1:8081;

service-rul.inc

그 후 아래 명령어를 통해 /etc/nginx/sites-enabled에 심볼릭 링크를 생성해줍니다.

sudo ln -s /etc/nginx/sites-available/server.conf /etc/nginx/sites-enabled

sites-enabled에 연결된 심볼릭 링크는 server.conf 외에는 모두 지워줘야 nginx.conf에 server.conf가 적용됩니다.

심볼릭 링크를 연결한 모습

그다음 nginx를 restart 하거나 reload 해줍니다.

sudo service nginx restart
# 또는
sudo service nginx reload

이제 80번 포트로 접속하여 8081번 포트에 대한 내용을 불러오는지 확인해봅시다.

80번 포트로 접속했을 때 8081 포트 접속 결과 보여줌

6. 신규 버전으로 변경

위의 springboot 프로젝트에서 메서드를 하나 추가 후 빌드하여 리눅스로 옮긴다(위에 방법있음)

getTest 메서드 추가

nohup java -jar -Dspring.profiles.active=set2 *.jar &

신규 jar 실행 후 추가된 8082 포트

그다음 service-url.inc를 8082번 포트로 변경하고 nginx를 reload 합니다.

service-url.inc 변경 후 nginx reload

다시 웹 페이지에 접속해보면 8082번 포트와 연결되어 set2를 보여주는 것을 확인할 수 있습니다.

80번 포트로 접속했을 때 8082번 포트 접속 결과를 보여줌

정상 반영되면 8081번 포트에 대해서는 종료시킵니다.

# 8081번 포트 정보 확인
lsof -i:8081

# 정상 종료
kill -15 {PID 번호}

8081번 포트로 실행되는 jar 종료

 

참고사이트 : https://subin-0320.tistory.com/m/145

728x90
반응형
LIST

댓글