본문 바로가기
Python

Python - HTTPX/Requsets Connection reset by peer 문제 해결하기

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

Connection reset by peer 오류는 서버와의 연결이 끊어졌을 때 발생하는 일반적인 오류이다. httpx에서 이 오류가 발생하는 경우 다음과 같은 몇 가지 해결 방법을 시도해 볼 수 있다.

여기에서는 HTTPX 를 이용하지만, Requests 라이브러리에서도 동일하게 조치가 가능하다.

서버 환경 설정등 확인해야 할 것이 많지만, 기본적으로 확인해야 하는 요소는 다음 3가지이다.

timeout
keep-alive
연결 재시도

 

1. 연결 시간 제한 확인

timeout 매개변수를 사용하여 연결 시간 제한을 늘리면, 서버가 처리하지 못하는 상황에 보다 대기시간을 가져서 처리를 할 수 있다.

httpx

import httpx

client = httpx.Client(timeout=10)  # 연결 시간 제한을 10초로 설정

try:
    response = client.get("https://www.example.com")
except httpx.HTTPError as e:
    if e.response is not None:
        print(e.response.status_code)
    else:
        print(e)

requests

import requests

try:
    response = requests.get("https://www.example.com", timeout=10)  # 연결 시간 제한을 10초로 설정
except requests.exceptions.ConnectionError as e:
    print(e)

2. keep-alive 연결 사용

Keep-alive를 사용하면 기존 연결된 세션을 재활용할 수 있어서 세션 연결에 대한 서버 부담을 줄여줄 수 있다.

httpx의 경우 keep-alive 설정을 Limit 설정을 통해서 진행 할 수 있다.

기본값은 max_keepalive_connections=20, max_connections=100, keealive_expiry=5 이므로 본인 서버에 맞게 조정하면 된다.

httpx

import httpx
httpx_keepalive = httpx.Limit(max_keepalive_connections=50, max_connections=250, keealive_expiry=10)
client = httpx.Client(limits=httpx_keepalive)

try:
    response = client.get("https://www.example.com")
    # ...
    response = client.get("https://www.example.com/other-page")
except httpx.HTTPError as e:
    if e.response is not None:
        print(e.response.status_code)
    else:
        print(e)

requests

import requests

session = requests.Session()
session.keep_alive = True

try:
    response = session.get("https://www.example.com")
    # ...
    response = session.get("https://www.example.com/other-page")
except requests.exceptions.ConnectionError as e:
    print(e)

 

3. 연결 재시도 하기

서버에서 연결을 끊었을 때 자동으로 재시도를 진행하도록 하면, 연결 가능이 보다 올라가게 된다.

httpx

import httpx

httpx_trans = httpx.HTTPTransport(retries=5)
client = httpx.Client(transport=httpx_trans)

try:
    response = client.get("https://www.example.com")
    # ...
    response = client.get("https://www.example.com/other-page")
except httpx.HTTPError as e:
    if e.response is not None:
        print(e.response.status_code)
    else:
        print(e)

 

requests

import requests

session = requests.Session()
session.retries = 3

try:
    response = session.get("https://www.example.com")
except requests.exceptions.ConnectionError as e:
    print(e)
반응형