요청 타임아웃의 정의 및 구조
요청 타임아웃(Request Timeout)은 서버가 클라이언트로부터 완전한 HTTP 요청 메시지를 수신하기 위해 대기하는 최대 시간입니다. RFC 7231 표준에 따르면, 이 시간 내에 완전한 요청을 받지 못할 경우 서버는 408 Request Timeout 상태 코드를 반환하고 연결을 종료합니다.
웹서버 레벨 타임아웃 처리: Apache HTTP Server
Apache는 mod_reqtimeout 모듈을 통해 세 가지 단계별 타임아웃을 제공합니다. TLS 핸드셰이크(handshake), 요청 헤더 수신(header), 요청 본문 수신(body) 각 단계에 독립적인 타임아웃을 설정할 수 있습니다. 기본값은 헤더 20~40초, 본문 20초이며, 데이터 수신률에 따라 타임아웃을 동적으로 증가시키는 MinRate 옵션(예: 500바이트 당 1초 증가)도 지원합니다.
역프록시 레벨 타임아웃 처리: Nginx
Nginx의 업스트림 모듈은 proxy_connect_timeout(연결 수립, 기본 60초), proxy_send_timeout(업스트림으로의 전송, 기본 60초), proxy_read_timeout(업스트림으로부터의 응답 읽기, 기본 60초)을 제공합니다. keepalive_timeout은 유휴 연결의 지속 시간(기본 60초)을 제어하며, proxy_next_upstream_timeout으로 재시도 전체 타임아웃을 제한할 수 있습니다.
실무 아키텍처와 주의점
클라이언트→프록시→서버 구조에서 클라이언트 타임아웃이 프록시 타임아웃보다 짧으면 불필요한 408 응답이 증가하고, 백엔드 처리 시간이 길어질 경우 프록시 타임아웃을 충분히 설정해야 합니다. 특히 느린 업로드나 장시간 처리 작업의 경우 단계별 타임아웃이 아니라 총 처리 시간(timeout-maxtimeout)으로 관리하는 것이 중요합니다.