비밀번호

커뮤니티2

  • 맑음속초13.3맑음북춘천3.0맑음철원2.7맑음동두천4.3맑음파주5.3맑음대관령6.4맑음춘천3.1황사백령도10.8황사북강릉11.5맑음강릉13.0맑음동해13.5황사서울7.6황사인천8.1맑음원주4.1황사울릉도12.1맑음수원5.9맑음영월3.0맑음충주3.7맑음서산2.9맑음울진10.3황사청주5.9황사대전5.1맑음추풍령2.5황사안동5.0맑음상주5.4황사포항9.4맑음군산4.6황사대구8.4황사전주4.7황사울산8.7황사창원10.8황사광주6.8구름많음부산11.1구름많음통영8.9황사목포6.8황사여수8.6황사흑산도7.4구름많음완도6.4맑음고창2.8구름많음순천7.0황사홍성5.2맑음서청주3.4황사제주9.7맑음고산10.0구름많음성산10.9구름많음서귀포13.7구름많음진주7.2맑음강화7.5맑음양평4.1맑음이천4.2맑음인제4.5맑음홍천2.9맑음태백9.0맑음정선군3.2맑음제천2.0맑음보은1.4맑음천안2.7맑음보령3.9맑음부여2.3맑음금산1.8맑음세종3.0맑음부안5.0구름많음임실0.9맑음정읍3.8구름많음남원2.6구름많음장수0.0맑음고창군4.5구름많음영광군3.4구름많음김해시10.8구름많음순창군2.7구름많음북창원10.7구름많음양산시11.9구름많음보성군6.4구름많음강진군5.3구름많음장흥4.0흐림해남5.6구름많음고흥4.3구름많음의령군4.3구름많음함양군2.2구름많음광양시6.8흐림진도군7.8맑음봉화2.0맑음영주4.2맑음문경4.3맑음청송군3.1구름많음영덕8.8맑음의성3.4맑음구미6.5맑음영천6.8구름많음경주시8.7구름많음거창2.5구름많음합천4.7구름많음밀양9.3구름많음산청4.7구름많음거제11.8구름많음남해10.0구름많음북부산11.9
  • 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