콘텐츠로 이동

Nginx 성능 튜닝 가이드 — Reverse Proxy 최적화 설정

Nginx는 잘못 설정하면 성능 병목이 되고, 잘 설정하면 서버 부하를 크게 줄여줍니다. 실무에서 자주 쓰는 설정을 모아 정리합니다.

/etc/nginx/nginx.conf
# 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;
}
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;
}
}
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;
}
}
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;
}
Terminal window
# 설정 문법 검사
nginx -t
# 무중단 재로드 (설정 변경 후)
nginx -s reload
# 현재 연결 수 확인
nginx -s status
visitor count

이 가이드를 내 서비스에 직접 적용해 보세요.

TestForge 무료 스캔 시작 →