Nginx 성능 튜닝 가이드 — Reverse Proxy 최적화 설정
Nginx는 잘못 설정하면 성능 병목이 되고, 잘 설정하면 서버 부하를 크게 줄여줍니다. 실무에서 자주 쓰는 설정을 모아 정리합니다.
기본 성능 설정
섹션 제목: “기본 성능 설정”# CPU 코어 수에 맞게 설정 (auto = 자동 감지)worker_processes auto;
events { # worker당 최대 동시 연결 수 # worker_processes × worker_connections = 최대 동시 연결 worker_connections 4096;
# 여러 연결을 한 번에 수락 (Linux에서 성능 향상) multi_accept on;
# Linux 고성능 이벤트 모델 use epoll;}
http { # 파일 전송 최적화 sendfile on; tcp_nopush on; tcp_nodelay on;
# Keep-Alive 설정 — 매 요청마다 TCP 연결 방지 keepalive_timeout 65; keepalive_requests 1000; # 연결당 최대 요청 수
# 클라이언트 요청 버퍼 client_body_buffer_size 128k; client_max_body_size 10m; client_header_buffer_size 1k;}Reverse Proxy 최적화
섹션 제목: “Reverse Proxy 최적화”upstream backend { # 로드 밸런싱 알고리즘 (기본: round-robin) # least_conn; — 연결 수가 적은 서버 우선 # ip_hash; — 동일 클라이언트는 동일 서버로
server app1:3000; server app2:3000; server app3:3000;
# 업스트림 Keep-Alive (백엔드 연결 재사용) keepalive 32;}
server { listen 80;
location / { proxy_pass http://backend;
# Keep-Alive 활성화 (upstream keepalive와 함께) proxy_http_version 1.1; proxy_set_header Connection "";
# 타임아웃 설정 proxy_connect_timeout 5s; proxy_send_timeout 60s; proxy_read_timeout 60s;
# 헤더 전달 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
# 버퍼링 설정 proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 8 4k; }}Gzip 압축
섹션 제목: “Gzip 압축”http { gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; # 1(빠름) ~ 9(높은 압축률), 6이 적절한 균형 gzip_min_length 1000; # 1KB 이하는 압축 안 함 (오히려 커질 수 있음) gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript image/svg+xml;}정적 파일 캐싱
섹션 제목: “정적 파일 캐싱”server { # 정적 파일 캐시 (이미지, CSS, JS) location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ { expires 1y; add_header Cache-Control "public, immutable"; access_log off; # 정적 파일 로그 비활성화 (디스크 I/O 절감) }
# API 응답 캐시 (읽기 전용 API) location /api/products { proxy_pass http://backend; proxy_cache_valid 200 5m; # 200 응답 5분 캐시 add_header X-Cache-Status $upstream_cache_status; }}Rate Limiting — 과부하 방지
섹션 제목: “Rate Limiting — 과부하 방지”http { # Rate limit zone 정의 # IP당 초당 10 요청 허용, 메모리 10MB 할당 limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
# 로그인 API는 더 엄격하게 limit_req_zone $binary_remote_addr zone=login:10m rate=3r/m;}
server { location /api/ { limit_req zone=api burst=20 nodelay; # burst=20: 순간 20개까지 허용 # nodelay: 큐에 넣지 않고 즉시 처리 proxy_pass http://backend; }
location /api/auth/login { limit_req zone=login burst=5; proxy_pass http://backend; }}보안 헤더 추가
섹션 제목: “보안 헤더 추가”server { # 보안 헤더 add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block"; add_header Referrer-Policy "strict-origin-when-cross-origin";
# 서버 버전 노출 방지 server_tokens off;}로그 최적화
섹션 제목: “로그 최적화”http { # 로그 포맷 커스터마이징 (응답시간 포함) log_format main '$remote_addr - $request ' '$status $body_bytes_sent ' '$request_time $upstream_response_time';
# 정적 파일 로그 비활성화 access_log /var/log/nginx/access.log main buffer=16k flush=5s;}설정 검증 & 재로드
섹션 제목: “설정 검증 & 재로드”# 설정 문법 검사nginx -t
# 무중단 재로드 (설정 변경 후)nginx -s reload
# 현재 연결 수 확인nginx -s status다음 단계
섹션 제목: “다음 단계”이 가이드를 내 서비스에 직접 적용해 보세요.
TestForge 무료 스캔 시작 →