피드로 돌아가기
CPU and DB were bored, yet every site timed out: a slow-read bot that starved Apache's workers
Dev.toDev.to
Infrastructure

Low-and-Slow 공격으로 인한 Apache Worker 고갈 해결 및 구조적 방어 설계

CPU and DB were bored, yet every site timed out: a slow-read bot that starved Apache's workers

Jun2026년 6월 15일6intermediate

Context

Apache prefork 모델 기반의 공유 웹 서버 환경에서 다수 쇼핑몰 서비스 운영 중 발생한 Socket Timeout 장애 분석. CPU 84% Idle 및 DB 부하 저하 상태에서도 MaxRequestWorkers 도달로 인해 모든 서비스가 동시에 중단되는 현상 발생.

Technical Solution

  • Access Log의 %D(응답 시간) 필드 정렬을 통한 17분(1040s) 지속 Slow-read 요청 식별
  • 요청 빈도가 낮은(0.45 req/sec) Low-and-slow 공격 특성으로 인해 기존 Rate Limit(1 req/sec) 무력화 확인
  • Response Body를 매우 느리게 읽어 Apache Worker Process를 강제로 점유하는 Resource Exhaustion 메커니즘 파악
  • iptables를 통한 공격 IP 즉시 DROP 처리로 가용 Worker Slot 확보 및 서비스 복구
  • Apache 앞단에 Response Buffer 역할을 수행하는 CDN 또는 Reverse Proxy 도입을 통한 Worker 해제 시점 단축 설계
  • Response Streaming 중 무응답 상태를 차단하는 Output-side/Idle Timeout 설정 적용

- CPU/DB 리소스 여유에도 Timeout 발생 시 Worker Pool의 Slot 고갈 여부 우선 확인 - 장애 분석 시 Request Count 기반 집계 대신 Time Spent(%D) 기준 정렬로 Stall 요청 탐색 - 로깅 파이프라인의 Regex 설정 오류로 인한 서버 스코프 에러 누락 여부 정기 점검 - Slow-read 공격 방어를 위해 Application Server 전면에 버퍼링 능력을 갖춘 프록시 계층 배치

원문 읽기