관련 내용
[리눅스 인프라/Ubuntu] - VirtualBox NAT network 고정 IP 할당하기
[네트워크] - NAT DHCP 목적, 구조와 동작 방법
터미널이 종료해도 동작하는 스프링 서비스 만들기(PM2, Linux service)
개요와 목적
이번 글에서는 Spring Server의 무중단 배포를 위한 Nginx 로드 밸런싱 사용법에 대해서 알아본다.
NginX 적용 전
Nginx 적용 전에는, UI 서버와 API 서버에 접속 할 때, 각각의 개별 IP를 통해서 접속이 가능하다. 그래서 Clinet1과 2가 UI 접속하는 IP 정보가 다르고, UI 서버들이 API 서버와 접속하는 IP가 다르다. API2가 문제가 생기게 되면, API2 개별 IP로 접속하는 UI 2에 통신 장애로 이어진다.
Nginx 로드 밸런싱을 통해, 1. 하나의 IP로 두 개의 서버 접속하기 와 2. 하나의 서버가 문제가 생겨도 다른 서버가 커버할 수 있는 환경(무중단 배포 환경)을 만들어 보자.
Nginx 사용 - 원하는 환경
1 하나의 IP 여러 서버 접속 가능
클라이언트와 UI 서버 사이에 Nginx을 두어서, 10.0.2.3:80 (호스트 PC에서는 포트 포워딩을 통해 127.0.0.3:80) 하나의 IP 주소로 접속하면, 요청이 두 UI 서버로 분산 된다.
그리고 그리고 URL 패턴에 따라 10.0.2.3:80/api/~ 로 시작하는 URL은 전부 10.0.2.5:5511 또는 10.0.2.6:5511 API 서버로 올 수 있게 설정이 가능하다.
2 무중단 배포 서비스 가능
Nginx의 IP 하나로 여러 서버에 연결되기 때문에, 하나의 서버를 업데이트를 위해 잠시 꺼두어도, 요청이 살아 있는 서버로 가게 된다. 그래서 무중단 배포 서비스가 가능하다.
개발 환경
- SpringBoot(gradle) - 2.7.5
- Ubuntu - 20.04
Nginx, 로드 밸런싱 개념
Nginx가 제공하는 로드 밸런싱이란, 트래픽을 분산하는 기술이다. Nginx가 클라이언트와 서버 사이에 위치하여서, 클라이언트는 Nginx IP로 요청을 하면 Nginx는 요청들 고르게 서버들에게 분산한다.
만약 한 서버가 고장이 나거나, 업데이트를 위해 서버가 꺼져도, 꺼진 서버에게 온 요청을 Nginx가 작동하는 서버로 보내기 때문에, 장애 대응과 무 중단 배포가 가능해진다.
Nginx에서 제공하는 종류는
- Round Robin: 서버들을 차례대로 선택해서 트래픽을 보낸다. 경로는 보장되지 않지만, 모든 서버로 균등하게 분산된다.
- Least Connected: 접속 트랙픽이 가장 적은 서버를 선택한다. 경로는 보장되지 않지만, 모든 서버로 균등하게 분산된다.
- Ip Hash: Hashing key를 사용해서 IP별로 입장할 서버를 지정한다. 경로 보장이 되지만, 균등하게 분산하기는 어렵다.
Nginx 설치, 설정
위에서 설명한 Nginx 동작을 실행 할 수 있는 설치와 설정 방법에 대해서 알아보자.
Nginx 설치
sudo apt-get update
sudo apt install nginx -y
sudo systemctl start nginx
//기존 apache2가 80번 포트를 사용하고 있어서 에러 발생
sudo service apache2 stop
sudo systemctl restart nginx
//+Nginx 완전한 삭제 /etc/nginX 디렉토리 파일 까지 제거하는 방법
sudo apt-get remove --purge nginx nginx-full nginx-common
NginX 설정
//root 권한으로 전환
sudo su
//sites-availabe 디렉토리에 가서 delivery.conf 작성
cd /etc/nginx/sites-available
vi delivery.conf
vi delivery.conf 세부 내용
upstream ui{
server 10.0.2.5:8081;
server 10.0.2.6:8081;
}
upstream api{
server 10.0.2.5:5511;
server 10.0.2.6:5511;
}
server {
listen 80;
listen [::]:80;
server_name 127.0.0.3;
location / {
proxy_pass <http://ui>;
}
location /api {
proxy_pass <http://api>;
}
}
location /api {
proxy_pass http://api;
}
설정을 통해 10.0.2.3:80/api 로 시작되는 요청 API 서버들로 트래픽이 갈 수 있게 설정을 했다.
//delivery.cof 파일 sites-enable 디렉토리에 옮기기 전에
//기존의 있던 default 삭제 후 이동
sudo rm /etc/nginx/sites-enabled/defualt
sudo ln -s /etc/nginx/sites-available/delivery.conf /etc/nginx/sites-enabled
//Nginx서버 재시작
sudo systemctl restart nginx
Nginx 사용
환경 설명
Nginx를 테스트 하기 위해, 각 우분투 서버마다 고정 아이피를 설정해 두었다.
VirtualBox Nat Network의 고정 아이피 설정 방법은 아래 블로그 글에서 확인 가능하다.
[리눅스 인프라/Ubuntu] - VirtualBox NAT network 고정 IP 할당하기
PM2를 사용해서, spring sub5 서버에는 10.0.2.5:5511 API 서버와 10.0.2.5:8081UI 서버를 작동 시키고, spring sub6 서버에는 10.0.2.6:5511 API 서버와 10.0.2.6:8081UI 서버를 작동 시켰다.
PM2를 사용하는 방법과 사용 이유에 대해서는 아래 블로그 글에서 확인 가능하다.
터미널이 종료해도 동작하는 스프링 서비스 만들기(PM2, Linux service)
작동
- 같은 api 주소지만, URL 패턴에 따라서 호출하는 서버가 다르다
/api~ 로 시작하면 API서버가 응답하고 나머지는 UI 서버가 응답한다.
- 10.0.2.5 서버의 ui를 끄고 10.0.2.6의 api를 끄기
동작 O
- 다시 10.0.2.5 ui를 다시 키고 10.0.2.6 ui끄기
동작 O
- 10.0.2.6의 api를 다시 키고 10.0.2.5 api를 끄기
동작 O
Reference
https://velog.io/@u-nij/Spring-Boot-Nginx-연동해서-배포하기
https://newwisdom.tistory.com/105
https://velog.io/@damiano1027/Nginx-Nginx와-SpringBoot-내장-Tomcat-연동