본문 바로가기

[Nginx] Nginx를 로드 밸런서로 사용하기

@bum0w02025. 8. 1. 22:19

로드 밸런서(Load Balancer) 란?

들어오는 네트워크 트래픽(요청)을 여러 서버에 고르게 분산시켜주는 장치 또는 소프트웨어를 말한다.

쉽게 말해, 한 서버에 과부하가 걸리지 않도록 요청을 나눠주는 트래픽 분배기이다.

로드 밸런서의 트래픽 분배 예시

 

  1. 사용자가 웹사이트에 접속 → 로드 밸런서에 도달
  2. 로드 밸런서는 백엔드 서버들 중 하나를 선택해 요청 전달
  3. 서버는 응답을 로드 밸런서에 보내고, 다시 사용자에게 전달
Nginx 또한 대표적인 로드 밸런서 소프트웨어 중 하나로 널리 사용되고 있다.

 

로드 밸런서가 필요한 이유

 

웹 서비스에 접속하는 사용자가 많아질수록 하나의 서버로는 모든 요청을 처리하기 어려워지고, 이로 인해 서버가 느려지거나 다운되는 문제가 발생할 수 있다.

 

이때 로드 밸런서를 사용하면 요청을 여러 서버에 효율적으로 분산시켜 각 서버의 부하를 줄이고, 전체 시스템의 안정성과 성능을 높일 수 있다. 또한 일부 서버에 장애가 발생해도 로드 밸런서는 정상적인 서버로만 요청을 전달하여 무중단 서비스를 유지할 수 있도록 도와준다.

 

블루/그린 배포 시에도 로드 밸런서는 트래픽을 기존(블루) 환경에서 신규(그린) 환경으로 안전하게 전환하는 데 중요한 역할을 한다.

 

 

EC2에 구성한 백엔드 서버 2개에 트래픽을 분산 처리하기

구현하고자 하는 인프라

 

1. EC2에서 Spring Boot 백엔드 서버 2개 실행

 

동일한 애플리케이션이라도 포트만 다르게 설정하면 하나의 인스턴스(EC2)에서 여러 개를 동시에 실행할 수 있다.

application.yml 또는 application.properties 파일에서 포트를 다르게 설정해도 되지만, 이미 EC2에서 프로젝트를 클론하고 빌드까지 완료했기 때문에 같은 JAR 파일을 포트 번호를 8081로 지정하여 실행했다.

$ cd ~/nginx-study/build/libs
$ nohup java -jar NginxBackend-0.0.1-SNAPSHOT.jar --server.port=8081 &

# 각 포트에서 실행 확인
$ lsof -i:8080
$ lsof -i:8081

 

2. Nginx 설정 변경

$ sudo vi /etc/nginx/conf.d/api.nginx.r-e.kr.conf

 

api.nginx.r-e.kr.conf 설정 파일

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=3r/s;

# 백엔드 서버 로드밸런싱 설정
upstream backend {
        server localhost:8080; # 첫 번째 백엔드 서버
        server localhost:8081; # 두 번째 백엔드 서버
}


server {
        limit_req zone=mylimit;
        limit_req_status 429;
        server_name api.nginx.r-e.kr;

        location / {
                # upstream 그룹에서 지정한 백엔드 서버들로 요청 분산 (로드밸런싱)
                proxy_pass http://backend;
        }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/api.nginx.r-e.kr/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/api.nginx.r-e.kr/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

}
server {
    if ($host = api.nginx.r-e.kr) {
        return 301 https://$host$request_uri;
    }


        listen 80;
        server_name api.nginx.r-e.kr;
    return 404;


}
$ sudo nginx -t
$ sudo nginx -s reload

 

3. 로드 밸런싱 확인

 

Health Check API를 호출하여 요청이 어느 서버로 전달되는지 확인한다.

각 서버는 고유한 서버 ID를 반환하므로 해당 ID를 통해 실제 로드 밸런싱이 이루어지는지 확인할 수 있다.

 

GET https://api.nginx.r-e.kr/health

@GetMapping("/health")
public String checkHealth() {
    return "Server ID: " + UUID.randomUUID().toString();
}
로드 밸런싱 테스트를 위해, 각 서버에 고유한 값을 반환하는 Health Check API가 미리 작성되어 있어야 한다.

 

 

서로 다른 서버 ID가 번갈아 나오며 Nginx의 로드 밸런싱이 잘 이루어지고 있음을 알 수 있다.

Nginx는 별도의 설정을 하지 않으면, 기본적으로 라운드 로빈(Round-Robin) 방식을 사용하여 트래픽을 분산하게 된다. 

 

 

 


 

 

 

지금까지 Nginx로 리버스 프록시와 로드 밸런싱을 직접 설정해서 사용해보았다.

 

다만, 실제 운영 환경이라면 인프라가 모두 퍼블릭 서브넷에 있어서 보안 면에서 취약한 점이 있고 Nginx 설정 변경 시 매번 수동으로 처리해야 하는 번거로움과 확장성의 한계도 있을 것 같다.

 

따라서 이후에는 AWS의 Application Load Balancer(ALB)를 활용해 트래픽 분산을 자동화하고, 서버 상태를 자동으로 감지하는 헬스 체크와 오토스케일링을 함께 적용하는 방법을 공부할 계획이다.

 

SSL 인증서도 현재는 Certbot을 이용해 직접 발급하고 갱신하지만, AWS Certificate Manager(ACM)를 통해 인증서 발급과 갱신을 자동화하는 방법도 알아볼 예정이다.

bum0w0
@bum0w0 :: bum0w0 님의 블로그

bum0w0 님의 블로그 입니다.

목차