2 분 소요

서비스 트래픽이 증가하면 단일 서버만으로는 안정적인 운영이 어려워집니다. Nginx는 강력한 로드 밸런서 기능을 내장하고 있어, 여러 백엔드 서버로 요청을 분산시키는 것이 간단합니다.

데이터센터 서버 랙

다수의 서버로 구성된 고가용성 인프라

로드 밸런싱이란?

로드 밸런싱은 클라이언트의 요청을 여러 서버에 분산시켜 단일 서버의 과부하를 방지하고 서비스 가용성을 높이는 기술입니다. Nginx는 Layer 4(TCP/UDP)와 Layer 7(HTTP) 로드 밸런싱을 모두 지원합니다.

upstream 블록 설정

Nginx 로드 밸런싱의 핵심은 upstream 블록입니다.

# /etc/nginx/conf.d/upstream.conf

upstream backend_servers {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

로드 밸런싱 알고리즘

1. Round Robin (기본값)

요청을 순서대로 각 서버에 분배합니다.

upstream backend {
    server 192.168.1.10;
    server 192.168.1.11;
    server 192.168.1.12;
}

2. Least Connections

현재 활성 연결이 가장 적은 서버로 요청을 보냅니다.

upstream backend {
    least_conn;
    server 192.168.1.10;
    server 192.168.1.11;
    server 192.168.1.12;
}

3. IP Hash (세션 유지)

클라이언트 IP 기반으로 항상 같은 서버로 연결합니다.

upstream backend {
    ip_hash;
    server 192.168.1.10;
    server 192.168.1.11;
    server 192.168.1.12;
}

4. Weighted Round Robin (가중치)

서버 성능에 따라 가중치를 부여합니다.

upstream backend {
    server 192.168.1.10 weight=5;  # 요청의 50% 처리
    server 192.168.1.11 weight=3;  # 요청의 30% 처리
    server 192.168.1.12 weight=2;  # 요청의 20% 처리
}

서버 상태 및 헬스체크

upstream backend {
    server 192.168.1.10;
    server 192.168.1.11;
    server 192.168.1.12 backup;    # 메인 서버 장애 시에만 사용
    server 192.168.1.13 down;      # 일시적 비활성화

    # 헬스체크 (Nginx Plus 또는 오픈소스 모듈)
    # max_fails: 실패 횟수 임계값
    # fail_timeout: 실패 카운트 초기화 시간
    server 192.168.1.10 max_fails=3 fail_timeout=30s;
    server 192.168.1.11 max_fails=3 fail_timeout=30s;
}

서버 모니터링 화면

로드 밸런서 상태 모니터링

연결 유지(Keep-Alive) 설정

upstream backend {
    server 192.168.1.10;
    server 192.168.1.11;
    keepalive 32;  # 업스트림과의 연결 풀 크기
}

server {
    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

타임아웃 및 버퍼 설정

server {
    location / {
        proxy_pass http://backend;

        proxy_connect_timeout 5s;    # 연결 타임아웃
        proxy_send_timeout 60s;      # 요청 전송 타임아웃
        proxy_read_timeout 60s;      # 응답 수신 타임아웃

        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
        proxy_busy_buffers_size 8k;
    }
}

헬스체크 엔드포인트 설정

# 로드 밸런서 상태 확인 페이지
server {
    listen 8080;
    server_name localhost;

    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        allow 192.168.1.0/24;
        deny all;
    }
}

SSL 종료(SSL Termination)

upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://backend;  # 내부는 HTTP로 전달
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# HTTP → HTTPS 리디렉션
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

설정 검증 및 적용

# 설정 문법 검사
nginx -t

# 설정 리로드 (무중단)
systemctl reload nginx

# 로그로 로드 밸런싱 동작 확인
tail -f /var/log/nginx/access.log

Nginx 로드 밸런싱을 도입하면 트래픽 급증에도 안정적인 서비스 운영이 가능해집니다. 초기에는 Round Robin으로 시작하고, 세션 유지가 필요하면 IP Hash를, 서버 사양이 다르다면 Weighted Round Robin을 사용하는 것을 권장합니다.

댓글남기기