nginx 대역폭 제한 설정하기 - limit_rate 완벽 가이드
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
일반적인 문제 해결
- 설정이 적용되지 않는 경우
# nginx 프로세스 확인 sudo ps aux | grep nginx # 포트 사용 확인 sudo netstat -tlnp | grep :80
- 너무 느린 속도 제한
# 최소 속도 보장 location / { limit_rate_after 1M; limit_rate 100k; # 최소 100KB/s 보장 }
결론
nginx의 limit_rate
와 limit_rate_after
지시어를 사용하면 효과적으로 대역폭을 제한할 수 있습니다. 핵심 인사이트는 다음과 같습니다:
- 점진적 제한:
limit_rate_after
로 초기 다운로드는 빠르게, 이후 속도 제한 - 파일 타입별 차별화: 미디어 파일과 일반 파일에 서로 다른 제한 적용
- 실시간 모니터링: 로그 분석을 통한 대역폭 사용량 추적
다음 단계로는 nginx Plus의 고급 대역폭 제어 기능이나 동적 모듈을 활용한 더 세밀한 제어를 고려해볼 수 있습니다.