Linux/오류 및 해결 방법

Nginx upstream timed out (110: Connection timed out) 오류 해결 방법

시바도지 2025. 3. 5. 18:08
반응형

nginx가 API 서버의 앞단에서 리버스 프록시 역할을 하고 있을 때, API 서버로 파일을 다운로드 받을 때 다음과 같은 오류가 발생하였다.

 

[warn] a client request body is buffered to a temporary file /var/lib/nginx/tmp/client_body/0000000567, ...
[error] upstream timed out (110: Connection timed out) while reading response header from upstream, ...

 

우선 [warn] 로그는 클라이언트에서 요청을 보낼 때, 요청 body가 크기 제한을 초과해서 Nginx가 이를 임시 파일(/var/lib/nginx/tmp/client_body)에 저장했다.

이는 요청 body 크기가 client_body_buffer_size보다 클 경우에 발생한다.

 

그 이후에 [error] 로그는 Nginx가 백엔드 서버로 요청을 전달했으나 응답을 받지 못하고 타임아웃이 발생했다.

upstream timed out 오류는 백엔드 서비스가 과부하 상태 또는 실행되지 않거나 네트워크 지연이 원인이 될 수 있다.

 

나의 문제는 프록시를 통해서 파일을 다운로드 받으려고 할 때, read 타임아웃이 발생되어 연결이 종료 되면서 발생한 문제였다.

 

 

해결 방법은 간단하다.

 

요청 바디 버퍼 크기를 늘려줘야 한다면


 

1. 다음의 위치로 이동

cd /etc/nginx/conf.d

 

2. 해당 서버의 conf 파일을 수정한다.

vi [server name].conf

 

3. 다음의 내용을 추가 또는 수정한다.

- client_body_buffer_size 값을 늘려서 임시 파일 저장을 최소화한다.

- client_max_body_size를 적절히 설정하여 큰 요청은 차단하도록 한다.

server {
    client_body_buffer_size 16k;  # 기본값보다 크게 설정 (기본: 8k/16k)
    client_max_body_size 10M;     # 최대 요청 바디 크기 제한 증가 (10M)
}

 

4. 수정 후 설정 파일 문법 체크

nginx -t

# 정상이라면 다음과 같이 출력
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

 

5. 설정 적용

# 설정만 리로드
systemctl reload nginx

# nginx 완전히 재시작
# 주의: 완전히 재시작 하면 현재 처리 중인 요청이 중단할 수도 있다.
systemctl restart nginx

 

Upstream 타임아웃 시간을 증가 해줘야 한다면


 

1. 다음의 위치로 이동

cd /etc/nginx/conf.d

 

2. 해당 서버의 conf 파일을 수정한다.

vi [server name].conf

 

3. 다음의 내용을 추가 또는 수정한다.

location {
    # Set proxy timeout
    proxy_send_timeout 60s;      # proxy를 통해서 데이터를 전달할 때 타임아웃
    proxy_read_timeout 60s;      # proxy를 통해서 데이터를 읽을 때 타임아웃
    proxy_connect_timeout 60s;   # proxy를 통해서 연결을 요청할 때 타임아웃
}

 

4. 수정 후 설정 파일 문법 체크

nginx -t

# 정상이라면 다음과 같이 출력
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

 

5. 설정 적용

# 설정만 리로드
systemctl reload nginx

# nginx 완전히 재시작
# 주의: 완전히 재시작 하면 현재 처리 중인 요청이 중단할 수도 있다.
systemctl restart nginx

 

그 외에 백엔드 서버 문제라면?


1. curl을 사용하여 해당 서버가 정상적으로 작동하는지 확인한다.

curl -v "http://127.0.0.1:<포트번호>"

 

반응형