nginx 대역폭 제한 설정하기

🎯 Summary

nginx에서 대역폭을 제한하는 가장 간단한 방법은 limit_rate 지시어를 사용하는 것입니다. 바로 사용 가능한 설정 예시를 제시합니다.

즉시 적용 가능한 설정

# /etc/nginx/nginx.conf 또는 사이트별 설정 파일
server {
    listen 80;
    server_name example.com;
    
    location / {
        # 500MB 다운로드 후 200KB/s로 속도 제한
        limit_rate_after 500M;
        limit_rate 200k;
        
        # 파일 서빙 설정
        root /var/www/html;
        index index.html;
    }
}

파일 타입별 대역폭 제한

# 동영상 파일 대역폭 제한
location ~* \.(mp4|avi|mkv)$ {
    limit_rate_after 10M;
    limit_rate 500k;
}

# 이미지 파일 대역폭 제한
location ~* \.(jpg|jpeg|png|gif)$ {
    limit_rate_after 1M;
    limit_rate 100k;
}

# 일반 파일 대역폭 제한
location / {
    limit_rate_after 500M;
    limit_rate 200k;
}

설정 적용 명령어

# 설정 파일 문법 검사
sudo nginx -t

# nginx 재시작
sudo systemctl restart nginx

# 또는 설정 리로드
sudo nginx -s reload

📚 상세 설명

배경 및 필요성

nginx에서 대역폭 제한은 서버 리소스 관리와 사용자 경험 최적화를 위해 필수적입니다. 특히 대용량 파일을 서빙하는 경우, 무제한 대역폭 사용으로 인한 서버 과부하를 방지할 수 있습니다.

기술적 세부사항

limit_rate 지시어 상세 설명

  • limit_rate: 클라이언트로의 응답 전송 속도를 제한합니다
  • limit_rate_after: 지정된 크기만큼 전송한 후 속도 제한을 적용합니다
  • 단위: k (킬로바이트), m (메가바이트), g (기가바이트)

동적 대역폭 제한

# 변수를 사용한 동적 제한
map $request_uri $rate_limit {
    ~*\.(mp4|avi)$  500k;
    ~*\.(jpg|png)$  100k;
    default         200k;
}

server {
    location / {
        limit_rate $rate_limit;
        limit_rate_after 1M;
    }
}

사용자별 대역폭 제한

# IP 기반 제한
geo $limit_rate_ip {
    default 100k;
    192.168.1.0/24 500k;  # 내부 네트워크는 더 빠르게
    10.0.0.0/8 1m;        # VPN 사용자는 더 빠르게
}

server {
    location / {
        limit_rate $limit_rate_ip;
    }
}

실제 활용 사례

1. CDN 역할을 하는 nginx 서버

server {
    listen 80;
    server_name cdn.example.com;
    
    # 정적 파일 서빙
    location /static/ {
        root /var/www;
        
        # 큰 파일은 천천히 전송
        location ~* \.(zip|tar|gz)$ {
            limit_rate_after 10M;
            limit_rate 1m;
        }
        
        # 미디어 파일 스트리밍 최적화
        location ~* \.(mp4|mp3|flv)$ {
            limit_rate_after 2M;
            limit_rate 500k;
        }
    }
}

2. API 서버의 대역폭 제한

server {
    listen 80;
    server_name api.example.com;
    
    # API 응답 크기 제한
    location /api/ {
        proxy_pass http://backend;
        
        # 대용량 데이터 응답 제한
        limit_rate_after 5M;
        limit_rate 2m;
        
        # 프록시 설정
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

대역폭 제한 테스트 방법

1. curl을 이용한 테스트

# 다운로드 속도 모니터링
curl -o /dev/null -w "%{speed_download}\n" http://example.com/large-file.zip

# 시간 측정과 함께 테스트
time curl -O http://example.com/large-file.zip

2. wget을 이용한 테스트

# 다운로드 속도 표시
wget --progress=bar:force http://example.com/large-file.zip

# 제한 시간 설정
wget --timeout=30 http://example.com/large-file.zip

3. nginx 로그 모니터링

# 실시간 액세스 로그 확인
tail -f /var/log/nginx/access.log

# 대역폭 사용량 분석
awk '{print $7, $10}' /var/log/nginx/access.log | sort | uniq -c

에러 처리 및 트러블슈팅

설정 검증 스크립트

#!/bin/bash
# nginx 대역폭 제한 설정 검증

echo "=== nginx 설정 문법 검사 ==="
sudo nginx -t

if [ $? -eq 0 ]; then
    echo "✅ 설정 파일 문법 정상"
    
    echo "=== 설정 리로드 ==="
    sudo nginx -s reload
    
    echo "✅ nginx 설정 리로드 완료"
    
    echo "=== 테스트 파일 생성 ==="
    sudo dd if=/dev/zero of=/var/www/html/test.dat bs=1M count=100
    
    echo "✅ 100MB 테스트 파일 생성 완료"
    echo "curl -O http://localhost/test.dat 명령으로 테스트하세요"
else
    echo "❌ 설정 파일에 오류가 있습니다"
    exit 1
fi

일반적인 문제 해결

  1. 설정이 적용되지 않는 경우
    # nginx 프로세스 확인
    sudo ps aux | grep nginx
       
    # 포트 사용 확인
    sudo netstat -tlnp | grep :80
    
  2. 너무 느린 속도 제한
    # 최소 속도 보장
    location / {
        limit_rate_after 1M;
        limit_rate 100k;  # 최소 100KB/s 보장
    }
    

결론

nginx의 limit_ratelimit_rate_after 지시어를 사용하면 효과적으로 대역폭을 제한할 수 있습니다. 핵심 인사이트는 다음과 같습니다:

  • 점진적 제한: limit_rate_after로 초기 다운로드는 빠르게, 이후 속도 제한
  • 파일 타입별 차별화: 미디어 파일과 일반 파일에 서로 다른 제한 적용
  • 실시간 모니터링: 로그 분석을 통한 대역폭 사용량 추적

다음 단계로는 nginx Plus의 고급 대역폭 제어 기능이나 동적 모듈을 활용한 더 세밀한 제어를 고려해볼 수 있습니다.