Nginx 로드 밸런싱 설정 가이드
서비스 트래픽이 증가하면 단일 서버만으로는 안정적인 운영이 어려워집니다. 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을 사용하는 것을 권장합니다.
댓글남기기