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:<포트번호>"