웹서버/nginx
Nginx의 버퍼(Buffer)와 타임아웃(Timeout) 설정으로 성능 최적화
janggos
2025. 3. 16. 14:11
서버의 하드웨어보다는 요청의 특성에 따라 조정되어야 하며, 기본값을 그대로 사용하는 것도 권장됩니다.
1. 버퍼(Buffer) 설정
버퍼는 데이터를 디스크에 쓰기 전에 **메모리(RAM)**에 일시적으로 저장하는 영역입니다.
적절한 버퍼 크기 설정은 디스크 I/O를 줄이고 성능을 향상시킵니다.
1. client_body_buffer_size
- 목적: 클라이언트의 POST 데이터(예: 폼 제출)를 메모리에 버퍼링합니다.
- 기본값: 8k 또는 16k (서버 설정에 따라 다름)
- 권장값: 10k (10KB)
client_body_buffer_size 10k; # 10KB로 설정
- 주의사항:
- 너무 작으면 디스크 사용 증가 → 성능 저하
- 너무 크면 메모리 낭비
2. client_header_buffer_size
- 목적: 클라이언트의 헤더 데이터를 메모리에 버퍼링합니다.
- 기본값: 1k
- 권장값: 1k (1KB)
client_header_buffer_size 1k;
3. client_max_body_size
- 목적: 허용할 최대 POST 데이터 크기를 제한합니다.
- 기본값: 1m (1MB)
- 권장값: 8m (8MB)
client_max_body_size 8m; # 8MB로 설정 (413 에러 방지)
- 초과 시: 413 Request Entity Too Large 오류 반환
2. 타임아웃(Timeout) 설정
타임아웃은 클라이언트와의 연결 지연을 방지하기 위해 최대 대기 시간을 설정합니다.
1. client_body_timeout & client_header_timeout
- 목적: 클라이언트가 데이터 전송을 완료할 때까지 대기 시간을 설정합니다.
- 기본값: 60s
- 권장값: 12ms (밀리초 단위)
client_body_timeout 12ms; client_header_timeout 12ms;
- 주의사항: 너무 길면 악의적인 클라이언트가 자원을 점유할 수 있음
2. keepalive_timeout
- 목적: 클라이언트와의 연결 유지 시간을 설정합니다.
- 기본값: 75s
- 권장값: 10s ~ 30s
keepalive_timeout 20s; # 20초로 설정
- 장점: 여러 요청을 단일 연결로 처리 → 효율성 증가
- 단점: 너무 길면 연결 풀 고갈 가능성
3. send_timeout
- 목적: 클라이언트가 응답을 받을 때까지의 대기 시간을 설정합니다.
- 기본값: 60s
- 권장값: 30s
send_timeout 30s;
- 초과 시: 연결 강제 종료
3. 고성능 전송 최적화
정적 파일 전송 성능을 극대화하기 위한 설정입니다.
1. sendfile
- 목적: 디스크의 파일을 직접 네트워크로 전송 (버퍼 사용 안 함)
- 기본값: off
- 권장값: on
sendfile on;
2. tcp_nopush
- 목적: 패킷 크기를 최적화하여 네트워크 효율성 증가
- 기본값: off
- 권장값: on (반드시 sendfile on과 함께 사용)
tcp_nopush on;
4. 결론 & 권장 설정 예시
http {
# 버퍼 설정
client_body_buffer_size 10k;
client_header_buffer_size 1k;
client_max_body_size 8m;
# 타임아웃 설정
client_body_timeout 12ms;
client_header_timeout 12ms;
keepalive_timeout 20s;
send_timeout 30s;
# 고성능 전송
sendfile on;
tcp_nopush on;
}
5. 주의사항
- 무조건적인 변경 금지: 기본값이 대부분의 경우 최적화되어 있습니다.
- 점진적 조정: 변경 후 성능 모니터링 필수 (예: nginx -t, 로그 분석)
- 특수 상황에 맞춤 설정: 대용량 파일 업로드, 실시간 스트리밍 등 특수 요구 시 조정
이 설정들을 이해하면 Nginx를 더 효율적으로 튜닝할 수 있습니다!