본문 바로가기
Python

Python - Uvicorn/Gunicorn Connection reset by peer를 해결할 수 있는 방법

by 올엠 2024. 2. 19.
반응형

"Connection reset by peer" 오류는 서버와 클라이언트 간의 연결클라이언트 측에서 예기치 않게 종료되었음을 나타낸다. 이는 다양한 원인으로 인해 발생할 수 있으며, 클라이언트 측에서 해결할 수 있는 경우도 있다.

"connection reset by peer" 오류가 발생하는 경우 여러 가지 원인이 있을 수 있다.

가장 일반적인 원인은 다음과 같다.

  • 클라이언트 연결 끊김: 클라이언트가 요청을 완료하기 전에 연결을 끊으면 이 오류가 발생할 수 있다.
  • 서버 과부하: 서버가 너무 많은 트래픽을 처리하느라 바쁜 경우 클라이언트 연결을 끊을 수 있다.
  • 네트워크 문제: 네트워크 문제로 인해 클라이언트와 서버 간의 연결이 끊어질 수 있다.
  • 코드 버그: 응용 프로그램 코드에 버그가 있으면 이 오류가 발생할 수 있다.

이를 가장 많은 부분은 Timeout이 예상 보다 요청보다 작아서 먼저 연결을 끊어버리는 경우 발생하기 때문에 각 네트워크 단계별로 Timeout 값을 맞는 것이 좋다.

그리고 keep alive 역시 connection reset by peer 오류를 해소하는데 큰 도움이 된다.

여기에서는 Timeout 값을 늘릴 수 있는 방법과 keep alive에 대해서 정리해 보겠다.

 

1. 클라이언트 requests/httpx 라이브러리

클라이언트에서 먼저 끊는 상황을 방지하기 위해서는 넉넉하게 타임아웃을 설정하는 것이 좋다.
0으로 설정하면 무한 대기이지만, 소켓 누수 현상이 있을 수 있기 때문에 추천하지는 않는다.
import requests

# 5초 타임아웃 설정
response = requests.get("https://www.google.com", timeout=150)

import httpx

# 5초 타임아웃 설정
async with httpx.AsyncClient(timeout=150) as client:
    response = await client.get("https://www.google.com")

2. 서버 Uvicorn/Gunicorn 설정

Uvicorn/Gunicorn 역시 기본값은 Uvicorn은 keep-alive에 대해 5초로 구성 되어 있고, Gunicorn은 30초라고 하니 이를 보다 여유있게 늘리는 것을 추천한다. 특히 Uvicorn은 keep-alive 를 기본적으로 지원하기 때문에, 이 구성을 늘리는 것을 추천한다.

uvicorn_config = {
    "workers": 3,
    "timeout-keep-alive": 150,
}

gunicorn_config = {
    "workers": 3,
    "timeout": 150,
    "keepalive": 150
}

반응형