비밀번호

커뮤니티2

  • 맑음속초14.4구름많음북춘천6.7맑음철원7.2구름많음동두천6.8구름많음파주7.9맑음대관령7.9구름많음춘천5.9황사백령도11.5황사북강릉14.9맑음강릉15.1맑음동해16.5황사서울9.3황사인천9.2맑음원주6.3황사울릉도13.2맑음수원8.1맑음영월6.4맑음충주6.5맑음서산7.5맑음울진12.7황사청주7.3황사대전7.5맑음추풍령7.0황사안동7.0맑음상주7.6황사포항10.7맑음군산7.8황사대구10.7황사전주8.2황사울산10.3황사창원12.0황사광주9.5구름많음부산12.6구름많음통영11.9황사목포8.9황사여수9.8황사흑산도10.7흐림완도9.6맑음고창7.1구름많음순천9.6황사홍성8.0맑음서청주5.6황사제주11.0구름많음고산10.8구름많음성산12.5구름많음서귀포18.2구름많음진주10.3맑음강화10.6맑음양평6.1맑음이천7.4구름많음인제6.7맑음홍천5.6맑음태백10.7맑음정선군6.1맑음제천5.2맑음보은3.9맑음천안6.0맑음보령8.3맑음부여5.8맑음금산5.8맑음세종5.4맑음부안8.4맑음임실4.4맑음정읍8.2맑음남원6.4맑음장수2.7맑음고창군7.4맑음영광군7.3구름많음김해시12.0맑음순창군5.4구름많음북창원11.6구름많음양산시14.2구름많음보성군8.2구름많음강진군8.0구름많음장흥7.5구름많음해남7.5구름많음고흥8.0구름많음의령군9.2맑음함양군6.8구름많음광양시9.3구름많음진도군9.2맑음봉화6.4맑음영주6.2맑음문경7.1맑음청송군7.8맑음영덕9.8맑음의성7.0맑음구미10.3맑음영천10.2맑음경주시11.4맑음거창7.1맑음합천7.7맑음밀양11.8맑음산청8.3구름많음거제12.8구름많음남해11.4맑음북부산13.5
  • 2026.04.21(화)

데이터 엔지니어링데이터 엔지니어링

[Nginx, FastAPI, gunicorn] gunicorn timeout 트러블슈팅

 

AWS ElasticBeanstalk로 배포한 FastAPI 앱에서 1분 이상 걸리는 작업을 배포된 AWS Lambda를 통해 진행시키는데, 어느날 해당 API 호출이 실패하며 ElasticBeanstalk에는 아래와 같은 로그가 남아있었다.

2024/03/22 02:57:45 [error] 1112907#1112907: *88 upstream prematurely closed connection while reading response header from upstream, client: x.x.x.x, server: , request: "POST /cross-selling HTTP/1.1", upstream: "http://127.0.0.1:8000/cross-selling", host: "keywordsearch.pluszero.co.kr", referrer: "https://keywordsearch.pluszero.co.kr/crossselling"

 

 

FastAPI 앱을 운영 서버에 배포하면 일반적으로 아래와 같은 구성으로 배포한다

즉 nginx에서 error.log에 남긴 로그는 업스트림 서버(WSGI HTTP Server 또는 Python Application)에서 준 응답 헤더를 읽는 도중 커넥션이 닫혀버렸다는 것이다.

위 현상은 응답까지 오래걸리는 lambda를 사용한 API에서만 발생하기 때문에 timeout 이슈라고 판단했다.

 

그래서 다시 ElasticBeanstalk의 web.stdout.log를 확인해 보니 아래와 같은 로그가 남아있었다.

Mar 22 02:57:44 ip-10-0-3-4 web[1112864]: [2024-03-22 02:57:44 +0000] [1112864] [CRITICAL] WORKER TIMEOUT (pid:1112896)
Mar 22 02:57:45 ip-10-0-3-4 web[1112864]: [2024-03-22 02:57:45 +0000] [1112864] [WARNING] Worker with pid 1112896 was terminated due to signal 9

   

   

해당 요청을 처리하는 gunicorn의 worker가 timeout으로 인해 강제로 종료된 것이다.


gunicorn worker의 timeout 설정을 바로하여 문제를 해결할 수 있었다.

아래는 수정된 ElasticBeanstalk에서 서버를 시작하는 Procfile 내 명령어이다.

   

web: gunicorn --bind 0.0.0.0:8000 -k uvicorn.workers.UvicornWorker main:app --timeout=180

   

   

 

api별로 응답 timeout 시간을 설정할 수 있다면 좋겠지만, FastAPI가 아닌 WSGI gunicorn 서버에서 발생하는 오류이므로 전역으로 설정할 수 밖에 없는 문제였다.

전체댓글0

검색결과는 총 26건 입니다.    글쓰기
1 2