일본 서버에서 서비스를 운영하다 보면 예상치 못한 트래픽 급증이 발생할 수 있습니다. 신제품 출시, 미디어 노출, 이벤트 시작 등으로 평소 대비 수십 배의 트래픽이 몰리면 서버가 다운될 수 있습니다. 이 글에서는 트래픽 급증에 대비하는 스케일링 전략을 안내합니다.

서버 한계 파악하기

스케일링 전략을 세우기 전에 현재 서버의 병목 지점을 파악해야 합니다.

# CPU 사용률 확인
top
htop

# 메모리 사용률 확인
free -h

# 디스크 I/O 확인
iostat -x 1

# 네트워크 트래픽 확인
iftop
nethogs

# Nginx 접속 수 확인
nginx -V 2>&1 | grep -o with-http_stub_status_module
curl http://localhost/nginx_status

전략 1: 수직 확장 (Scale Up)

현재 서버의 리소스를 늘리는 가장 간단한 방법입니다.

  • VPS 업그레이드: 더 높은 vCore, RAM 플랜으로 변경
  • 전용서버 업그레이드: 더 높은 사양의 전용서버로 이전

장점: 설정 변경 없이 즉시 성능 향상 단점: 물리적 한계 존재, 비용 증가, 업그레이드 시 재시작 필요

TCP-80.NET은 서버 업그레이드 문의를 텔레그램으로 빠르게 처리합니다.


전략 2: 캐시 최적화 (가장 효과적)

서버를 업그레이드하기 전에 캐시를 잘 활용하면 동일한 서버에서 몇 배 더 많은 트래픽을 처리할 수 있습니다.

Nginx FastCGI 캐시 (PHP 서비스)

http {
    fastcgi_cache_path /tmp/nginx_cache
        levels=1:2
        keys_zone=MYAPP:100m
        max_size=1g
        inactive=60m
        use_temp_path=off;
}

server {
    fastcgi_cache_key "$scheme$request_method$host$request_uri";

    location ~ \.php$ {
        fastcgi_cache MYAPP;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;

        add_header X-FastCGI-Cache $upstream_cache_status;
    }
}

Redis 오브젝트 캐시

데이터베이스 쿼리 결과를 Redis에 캐싱하면 DB 부하를 크게 줄입니다.

apt install redis-server -y
# Nginx Proxy 캐시 (Node.js/Python 앱)
proxy_cache_path /tmp/proxy_cache levels=1:2 keys_zone=PROXY:10m;

location / {
    proxy_cache PROXY;
    proxy_cache_valid 200 5m;
    proxy_pass http://localhost:3000;
}

전략 3: CDN 활용

정적 파일(이미지, CSS, JS, 폰트)을 CDN에서 제공하면 서버 부하를 크게 줄일 수 있습니다. 일반적으로 웹 트래픽의 60~80%는 정적 파일 요청입니다.

Cloudflare 설정

  1. Cloudflare에 도메인 등록
  2. DNS를 Cloudflare로 변경
  3. 캐싱 정책 설정:
    • Browser Cache TTL: 1일 이상
    • Cache Level: Standard
    • Rocket Loader: JavaScript 비동기 로드

Cloudflare의 일본 PoP(도쿄 등)에서 정적 파일을 제공해 서버 부하를 줄이고 응답 속도를 높일 수 있습니다.


전략 4: Nginx 연결 수 최적화

# /etc/nginx/nginx.conf
worker_processes auto;  # CPU 코어 수에 맞게 자동 설정
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

http {
    keepalive_timeout 30;
    keepalive_requests 1000;
    client_body_timeout 10;
    client_header_timeout 10;
    send_timeout 10;
}

전략 5: 데이터베이스 최적화

트래픽 급증 시 DB가 가장 먼저 병목이 됩니다.

슬로우 쿼리 찾기

-- MariaDB 슬로우 쿼리 로그 활성화
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;

인덱스 최적화

-- 자주 조회되는 컬럼에 인덱스 추가
CREATE INDEX idx_user_email ON users(email);
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

Read Replica 분리

읽기 쿼리가 많은 서비스는 별도 읽기 전용 DB 서버를 두어 부하를 분산합니다.


트래픽 급증 전 체크리스트

  • Nginx 설정 최적화 완료
  • Redis 캐시 설정 완료
  • CDN 연동 완료
  • DB 인덱스 최적화 완료
  • 모니터링 설정 (CPU/RAM/DB 알림)
  • 서버 업그레이드 옵션 확인

마치며

트래픽 급증은 좋은 신호이지만, 대비가 없으면 서비스 장애로 이어집니다. 먼저 캐시 최적화로 최대한 버티고, 필요하면 서버 업그레이드를 진행하세요. TCP-80.NET은 긴급 업그레이드와 기술 지원을 텔레그램 @tcp80net으로 신속하게 처리합니다.