[Nginx] Timeout
엔진엑스에서의 타임아웃 설정은 크게 클라이언트 / 백엔드 두 가지로 나뉜다.
클라이언트 타임아웃
client_header_timeout
클라이언트가 HTTP 헤더를 서버로 전송하는데 걸리는 최대 시간을 지정한다.
연결이 너무 오래 걸려 서버 리소스를 과도하게 사용하는 연결을 끊어 서버를 보호하고, 의도적으로 헤더를 느리게 전송하는 방식의 공격을 방어한다.
기본 값은 60초이고, nginx.conf의 client_header_timeout 10s; 로 타임아웃 시간을 설정할 수 있다.
client_body_timeout
HTTP 요청 본문을 서버로 전송하는데 걸리는 최대 시간을 지정한다.
header_timeout과 마찬가지로 기본적으로 60초로 설정되고 설정 파일을 통해 수정할 수 있다.
파일 업로드 같은 큰 POST 요청을 처리할 때 중요하고, 네트워크 환경에 따라 적절하게 설정해야 한다.
send_timeout
엔진엑스 서버가 클라이언트에게 HTTP 응답을 전송할 때 걸리는 최대 시간을 지정한다.
클라이언트의 느린 수신 속도, 네트워크 지연으로 응답이 지연될 때 서버가 얼마나 기다릴지를 결정한다.
역시 기본값은 60초로 설정되어있다.
keepalive_timeout
엔진엑스 서버가 클라이언트와의 연결을 얼마나 오래 유지할지를 결정하는 설정이다.
클라이언트와 서버 간 여러 요청을 처리하기 위해 하나의 TCP 연결을 재사용하는데, keepalive_timeout 값을 설정해 정해진 시간까지는 TCP 연결을 한 번 연결해 둔 연결을 재사용해 연결에 사용되는 오버헤드를 줄인다.
기본 값은 75초이고 설정 파일로 조작할 수 있다.
앞서 다룬 다른 설정들과는 다르게 연결을 닫는 것과 관련되지 않고, TCP 연결의 재사용과 관련된다.
클라이언트가 첫 번째 요청을 보낸 후 keepalive_timeout 설정에 따라 연결이 일정 시간 동안 열려 있을 수 있는데, 이 기간동안 클라이언트는 동일한 연결을 재사용해서 추가 요청을 보낼 수 있다.
keepalive_timeout이 100초로 설정되어있고 웹 브라우저가 엔진엑스 서버에 100초에 10번 요청을 보낸다면 이 10번의 요청은 같은 TCP 연결을 재사용해서 처리된다.
lingering_timeout
클라이언트가 데이터 전송을 마치고, 서버가 연결을 닫을 때 아직 서버로 도착하지 않은 데이터가 있을 수 있다. (네트워크 지연)
이런 데이터들을 처리하기 위해 서버가 연결을 유지하는 추가 시간을 설정할 때 사용된다.
기본 값은 30초이고.. 역시 설정 파일로 조작할 수 있다.
resolver_timeout
엔진엑스가 도메인 네임을 IP주소로 변환하는데 필요한 DNS 쿼리에 사용된다.
DNS 서버에 요청을 보내고 응답을 기다리는 최대 시간을 지정하고, 시간이 초과되면 DNS 조회가 실패된 것으로 간주한다.
기본 값은 30초 설정 파일로 조작 가능.
백엔드 타임아웃
proxy_connect_timeout
엔진엑스가 리버스 프록시나 로드밸런서로 작동할 때 upstream 서버 (로드밸런서 뒤에 위치한 실제 백엔드 서버) 에 대한 연결 설정에 적용되는 값으로, 엔진엑스와 백엔드 서버와의 초기 TCP 연결에 걸리는 최대 시간을 설정한다.
백엔드 서버가 과부하 상태이거나 서버가 죽어서 응답하지 않을 때 클라이언트가 무한정 대기하는걸 방지한다.
기본 값은 60초이고, 설정 파일로 변경할 수 있다.
location / {
proxy_pass http://upstream_backend;
proxy_connect_timeout 10s;
...
}
proxy_send_timeout
엔진엑스 서버가 클라이언트의 요청을 받고 백엔드 서버로 전송할 때 걸리는 최대 시간을 설정하는 값이다.
기본 값은 60초이다.
location / {
proxy_pass http://upstream_backend;
proxy_send_timeout 30s;
...
}
엔진엑스가 백엔드에게 데이터를 전송하지 못하면 연결은 종료되고 클라이언트에게는 오류가 반환된다.
proxy_next_upstream_timeout
로드밸런싱 기능과 관련된 타임아웃 설정으로 응답하지 않는 upstream 서버로부터 실패한 후 다른 서버로 전환할 때 걸리는 최대 시간을 지정한다.
한 서버가 과부하 등의 이유로 응답하지 않는 경우 엔진엑스는 다른 서버로 요청을 전환해 서비스 중단을 최소화한다.
location / {
proxy_pass http://upstream_backend;
proxy_next_upstream error timeout;
proxy_next_upstream_timeout 15s;
...
}
keepalive_timeout (backend)
일반적으로는 클라이언트와의 연결을 유지할 때 사용되는 값이지만, upstream 서버와의 연결을 관리할 때도 사용할 수 있다.
upstream backend {
server backend1.com;
server backend2.com;
keepalive 16;
keepalive_requests 100;
}
server {
...
location / {
proxy_pass http://upstream_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}
keepalive 속성에서는 엔진엑스가 upstream 서버와 연결을 유지하고 재사용 할 수 있는 연결의 최대 수를 지정한다.
위의 예시에서는 16으로 설정되어있는데, 이 경우 엔진엑스의 각 워커 프로세스는 upstream 서버와 최대 16개의 keepalive TCP 연결을 유지하고 재사용 할 수 있다.
keepalive_requests 속성에서는 keepalive 연결으로 전송할 수 있는 요청의 최대 수를 지정한다.
예시에서는 한 연결에서 100개의 요청을 처리한 후 연결이 자동으로 닫힌다.
'Computer Science > Network' 카테고리의 다른 글
[Nginx] nginx.conf (1) | 2023.12.28 |
---|---|
[Network] 백엔드 아키텍처 (0) | 2023.12.21 |
[Nginx] 내부 구조와 리버스 프록시 (1) | 2023.12.21 |
[HTTP] HTTP 쿠키와 세션 (0) | 2023.06.12 |
[HTTP] 헤더 / 쿠키와 캐시 (0) | 2022.08.13 |
댓글
이 글 공유하기
다른 글
-
[Nginx] nginx.conf
[Nginx] nginx.conf
2023.12.28 -
[Network] 백엔드 아키텍처
[Network] 백엔드 아키텍처
2023.12.21 -
[Nginx] 내부 구조와 리버스 프록시
[Nginx] 내부 구조와 리버스 프록시
2023.12.21 -
[HTTP] HTTP 쿠키와 세션
[HTTP] HTTP 쿠키와 세션
2023.06.12