본문 바로가기
WIKI 기술 지식 베이스

timeouts

원문 보기 위키 갱신

출처: Caddy 공식 문서

본문

서버 전체의 timeouts전역 옵션과는 별도로, 일치하는 요청에 대한 유휴 읽기/쓰기 타임아웃, 최소 전송 속도, 최대 쓰기 청크 크기를 설정해요.

서버 전체의 read_body_idle과 write_idle 타임아웃처럼, 이 값들은 매 읽기/쓰기가 성공한 후에 리셋되므로 정체(stall)된 연결만 중단해요. 지속적으로 진행되는 느린 클라이언트에는 영향을 주지 않아요.

⚠️ 실험적 기능이에요. 변경되거나 제거될 수 있어요.

문법

timeouts [<matcher>] {
	read_timeout    <duration> [<min_rate>]
	write_timeout   <duration> [<min_rate>]
	max_write_chunk <size>
}
  • read_timeout 은 연결이 중단되기 전에 요청 본문에서 읽기가 얼마나 오래 정체될 수 있는지를 정하는 기간 값이에요. 매 읽기가 성공한 후에 데드라인이 리셋돼요. 기본적으로 이 지시문은 유휴 읽기 타임아웃을 적용하지 않아요.

선택적 <min_rate> 는 클라이언트가 유지해야 하는 초당 바이트 수로, 요청 본문 읽기를 시작한 시점부터 평균을 내요. 이 값을 설정하면 클라이언트는 read_timeout 기간에 더해 지금까지 받은 바이트를 min_rate 속도로 보내는 데 걸리는 시간을 추가로 허용받아요. 이는 정체하지 않을 정도의 데이터만 보내는 클라이언트도 막아줘요.

  • write_timeout 은 연결이 중단되기 전에 클라이언트로의 쓰기가 얼마나 오래 정체될 수 있는지를 정하는 기간 값이에요. 매 쓰기 전에 데드라인이 리셋돼요. 기본적으로 이 지시문은 유휴 쓰기 타임아웃을 적용하지 않아요.

선택적 <min_rate> 는 read_timeout의 것과 같은 방식이지만, 클라이언트로의 쓰기에 적용돼요. 속도가 응답 시작부터 평균을 내기 때문에 쓰기 사이의 멈춤도 계산에 포함돼요. 따라서 서버 전송 이벤트(server-sent events) 같은 오래 지속되는 스트리밍 응답에는 사용하지 않는 게 좋아요.

  • max_write_chunk 는 클라이언트로의 단일 기본 쓰기가 다룰 수 있는 최대 바이트 수예요. 이를 통해 큰 응답에서 write_timeout이 하나의 큰 쓰기 전체가 아니라 청크 사이에 적용되도록 해요. go-humanize가 지원하는 모든 형식을 받아요. write_timeout이 설정된 경우에만 효과가 있어요. 기본값: 64KiB.

서버 전체의 read_body_idle과 write_idle 타임아웃은 기본적으로 활성화되어 있고, 현재 매 읽기/쓰기에 대해 이 지시문의 타임아웃 이후에 적용되므로 우선권을 가져요. 이 지시문의 read_timeout 또는 write_timeout이 적용되게 하려면 timeouts전역 옵션에서 해당 서버 전체 타임아웃을 비활성화해야 해요. 예를 들어 read_body_idle -1s처럼요.

예제

/upload로의 업로드가 10초 이상 정체되거나, 클라이언트가 평균 초당 1 KiB 미만으로 보내면 업로드를 중단하는 예시예요:

example.com {
	timeouts /upload* {
		read_timeout 10s 1024
	}
	reverse_proxy localhost:8080
}

/files에서 클라이언트로의 쓰기가 30초 이상 정체되면 다운로드를 중단하고, 최대 16 KiB 청크 사이로 확인하는 예시예요:

example.com {
	timeouts /files/* {
		write_timeout   30s
		max_write_chunk 16KiB
	}
	root * /srv
	file_server
}

더 알아보기 (Learn more)