Nginx에서 각 어플리케이션을 클러스터로 관리하기(Nginx, Spring)

slee2·2022년 11월 5일
0

main

목록 보기
2/12

클러스터란?

클러스터란, 각기 다른 서버들을 하나로 묶어서 하나의 시스템으로 관리하는 것이다.
클러스터화된 시스템을 이용하면, 어느 하나의 서버가 장애가 발생하게 되더라도 다른 서버로 연결이 되어 중단되지 않고 사이트를 운영할 수 있게 된다.


이번 글에서는 Spring을 이용하여 어플리케이션을 3개 만들고, 각기 다른 포트로 배포하여 Nginx에서 클러스터로 관리하는 과정을 보여줄 것이다.

이번 글에서 진행할 과정을 그림으로 표현하면 아래와 같다.

Spring 프로젝트 만들기

간단하게 프로젝트를 위한 환경을 만들어준다.

  • Java 11
  • Gradle
  • Spring boot 2.7.5
  • Dependency
    • Spring Web
    • Lombok

application.properties

server.port=8080

3개의 포트를 각각 8080, 8081, 8082로 만들어준다.

healthCheckController

나중에 현재 어플리케이션이 어떤 포트인지 확인하기 위한 healthCheck API를 만들어준다.

import lombok.RequiredArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class HealthCheckController {

    private final Environment environment;

    @GetMapping("/healthCheck")
    public String healthCheck() {
        return "현재 실행중이 포트번호는 " + environment.getProperty("local.server.port") + " 입니다.";
    }
}

로컬에서 테스트하면 아래와 같이 나오게 된다.

이후 서비스 운영까지 과정

  • t2.medium 서버 인스턴스 생성(EC2)
  • 서버 내부에 git, sdkman, Nginx 설치
  • git clone을 이용하여 프로젝트 3번 가져오고, 각각 포트 변경
  • java 11 설치
  • 각 프로젝트 build 후, nohup을 이용하여 서비스 실행

생성관련된 내용은 기재하지 않았다.
인스턴스를 생성하여 서버에 각 어플리케이션을 넣는다.

위와같이 각 포트에 다른 서비스를 운영하고 있다.

Nginx 로드밸런스 설정

본격적으로 클러스터링을 하기 위한 Nginx 설정이다.

먼저, 설정 파일을 따로 만들어서 적용시키기 위해 nginx.conf 설정파일에 경로를 추가해준다.

cd /etc/nginx
sudo vi nginx.conf
http {
	** 상위 각 설정들 **

	# Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/cluster/*.conf; # 추가 부분
    
    ** 이후 설정들 **
}

이후에 따로 설정할 추가파일을 생성한다.

sudo mkdri cluster
cd cluster
sudo vi cluster.conf

해당 설정파일에 로드밸런스 관련 포트설정을 진행한다.

upstream cluster_group_1 {
        ip_hash;
        server 127.0.0.1:8080 weight=2 max_fails=6;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
}
server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        location / {
          sendfile off;
          proxy_pass         http://cluster_group_1;
          proxy_redirect     default;
          proxy_http_version 1.1;
          proxy_set_header   Host              $host;
          proxy_set_header   X-Real-IP         $remote_addr;
          proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
          proxy_set_header   X-Forwarded-Proto $scheme;
          proxy_cache_bypass $http_upgrade;
          proxy_max_temp_file_size 0;
        }
}
  • upstream : 강의 상류를 의미하여, 쉽게 말해 위에서 아래로 뿌려주는 것을 의미한다.
    • 로드 밸런싱 방법 (round-robin과 ip_hash를 많이 이용한다.)
      • round-robin(기본값) : 균등 분배이다. 모든 서버에 균등하게 분배된다.
      • hash : 해시한 값으로 분배. hash <키> 값으로 분배한다.(hash $remote_addr은 ip_hash와 같다.)
      • ip_hash : ip로 해싱해서 분배한다. 하나의 서버만 이용한다.(활성화되어 있는 경우)
      • random
      • least_conn : 연결수가 가장 적은 서버를 선택해서 분배한다.
      • least_time : 연결수가 가장 적으면서 평균 응답시간이 가장 적은 쪽을 선택해서 분배한다.
    • 파라미터
      • weight : 가중치. 2라면, 규칙은 유지하되 2배 더 많이 사용한다.
      • max_conns : 최대 연결 한계를 정한다.
      • max_fails : 최대 실패 한계를 정한다. 해당 횟수에 도달하면 서버가 죽은것으로 판단한다.
      • fail_timeout : 해당 시간을 넘어도 응답하지 않으면 서버가 죽은것으로 판단한다.
      • backup : 이 서버는 백업서버로 간주한다. 다른 메인서버가 죽었을때 동작한다. (hash나 random일때는 무의미하다)
      • down : 이 서버는 사용하지 않는다.
  • proxy_pass : 위에서 설정한 로드밸런스 그룹이름을 선택한다. http://cluster_group_1;

추가적으로 도메인 연결을 하고 싶다면 Https 적용하는 법 을 참고하면 된다.

테스트를 하면 아래와 같은 방식으로 동작하게 된다.

0개의 댓글