IT

Nginx는 어떻게 설정해야 될까?(실전예제2)

마시멜로를찾아서 2025. 4. 1. 12:58
반응형

🧱 1. 현재 서버 구조 요약

항목내용
클라이언트 Vue 관리자 웹 앱
백엔드 API 15MB 응답 포함
웹 서버 Nginx (Windows용)
하드웨어 20코어 CPU, 32GB RAM
네트워크 950 Mbps (약 118 MB/s)

🧠 2. Vue 관리자 사이트 특성상 고려할 점

Vue 관리자 페이지는 일반 사용자 웹사이트보다 다음 특성이 있습니다:

요소설명
대량 API 호출 테이블 필터, 페이지 이동, 대시보드 그래프 등
정적 리소스 크기 JS 번들, CSS, 아이콘 등 수십~수백 KB
대용량 API 엑셀, 리포트 등 JSON or 파일로 5~15MB 응답 발생
유휴 시간 多 요청은 간헐적이지만, 요청 시 burst 형식으로 발생

=> 트래픽은 많지 않지만, 순간적 부하와 응답 최적화가 중요합니다.


🚦 3. 요청 성능 분석

📏 다운로드 기준

  • 네트워크 속도: 950 Mbps = 118.75 MB/s
  • 15MB API 응답 기준 → 약 0.13초면 1명 전송 가능
  • 분산 요청일 경우 수십~수백 명도 가능

🧮 CPU 처리 기준

  • worker_processes auto → 20개 워커 생성 가능
  • worker_connections 4096 → 81920 연결 가능 (20×4096)
  • 각 워커가 논블로킹 I/O 사용 → 적은 리소스로 많은 처리 가능

실질적 동시 사용자 수 (관리자 기준):
100~500명 이상까지 충분히 안정적인 서비스 가능


🔧 4. Nginx 최적 설정 제안

✅ nginx.conf 튜닝 예시

worker_processes auto;  # CPU 코어 수에 맞게 워커 프로세스 자동 설정 (성능 최적화)

events {
    use epoll;               # Linux에서 고성능 비동기 I/O를 위한 이벤트 드라이버(epoll) 사용
    worker_connections 4096; # 워커 하나가 동시에 처리 가능한 최대 연결 수
    multi_accept on;         # 한 번에 여러 연결을 accept (성능 향상, 다수 요청 대응)
}

http {
    sendfile on;             # 파일 전송 시 sendfile() 시스템 콜을 사용 (효율적인 전송)
    tcp_nopush on;           # 헤더를 모두 모아 한 번에 전송 (sendfile과 함께 사용 시 효과적)
    tcp_nodelay on;          # 작은 패킷이라도 바로 전송 (지연 최소화, 실시간성 ↑)
    keepalive_timeout 65;    # keep-alive 연결 유지 시간 (초)
    types_hash_max_size 2048; # MIME 타입 해시 테이블 크기

    client_max_body_size 100M; # 클라이언트 요청 최대 바디 크기 (파일 업로드 등)

    # GZIP 압축 설정 (텍스트 기반 응답 압축으로 트래픽 절감)
    gzip on;                   # GZIP 압축 활성화
    gzip_comp_level 6;         # 압축 수준 (1~9, 숫자가 높을수록 압축률↑, CPU 사용량↑)
    gzip_min_length 1024;      # 1KB 이상일 때만 압축 적용
    gzip_vary on;              # Vary: Accept-Encoding 헤더 추가 (캐시 프록시를 위한 설정)
    gzip_proxied any;          # 프록시 요청에도 압축 적용
    gzip_types                 # 압축할 콘텐츠 타입 정의
        text/plain
        text/css
        application/json
        application/javascript
        text/xml
        application/xml
        application/xml+rss
        text/javascript;

    access_log logs/access.log; # 접속 로그 파일 경로
    error_log logs/error.log;   # 에러 로그 파일 경로

    include mime.types;           # MIME 타입 정의 파일 포함
    default_type application/octet-stream; # 확장자가 없는 경우 기본 콘텐츠 타입

    include sites-enabled/*.conf; # 가상 호스트(server 블록) 설정 파일들 포함
}

📦 5. GZIP 설정 설명

설정의미
gzip on GZIP 압축 활성화
gzip_comp_level 6 압축 수준 (19, 일반적으로 56이 성능/효율 균형)
gzip_min_length 1024 1KB 이상부터 압축 적용
gzip_proxied any 프록시 요청에도 압축 적용
gzip_types 압축 대상 MIME 타입 지정 (JS, CSS, JSON 등)

➕ 효과:

  • Vue의 JS 번들, JSON 응답 등 텍스트 기반 리소스의 전송량 50~80% 감소
  • 15MB JSON 응답 → 5~7MB 수준으로 압축 가능
  • 트래픽 감소 → 병목 줄고 처리량 향상

🔐 6. 추가 성능/안정성 팁

항목설정/도구설명

 

정적 캐싱 expires, cache-control 정적 파일 캐싱 (JS/CSS 등)
API 응답 캐시 proxy_cache, Redis 등 자주 호출되는 응답 캐싱
요청 제한 limit_req, limit_conn 공격성 요청 차단
WebSocket/실시간 proxy_http_version 1.1, upgrade 등 실시간 기능도 지원 가능
응답 압축 gzip, 필요 시 Brotli 추가도 가능  

✅ 결론

항목현재 상태권장 개선
CPU 활용 제한됨 (worker_processes 1) auto로 설정 변경
연결 수 1024 연결 제한 4096 이상으로 확장
API 성능 15MB 응답 발생 GZIP 적용으로 최적화
사용자 수 950Mbps 기준 5~10명 동시 15MB 처리 요청 분산 시 수백 명도 가능

 

반응형