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
}