비밀번호

커뮤니티2

  • 맑음속초13.3맑음북춘천1.2맑음철원1.0맑음동두천3.8맑음파주1.8맑음대관령5.0맑음춘천1.6황사백령도10.7황사북강릉12.2맑음강릉11.6맑음동해13.3황사서울7.3황사인천7.6맑음원주2.8황사울릉도10.9맑음수원4.3맑음영월1.2맑음충주1.9맑음서산1.2맑음울진10.1황사청주5.1황사대전3.5구름많음추풍령1.5황사안동4.1맑음상주4.6황사포항8.5구름많음군산3.3황사대구7.5황사전주2.9황사울산7.9황사창원10.5황사광주4.6맑음부산10.7구름많음통영8.9황사목포6.3황사여수8.2황사흑산도6.7구름많음완도5.5구름많음고창1.8구름많음순천6.2황사홍성3.6맑음서청주1.5황사제주8.8구름많음고산9.7구름많음성산9.5구름많음서귀포12.8구름많음진주6.6맑음강화7.0맑음양평3.7맑음이천2.8맑음인제3.9맑음홍천2.1맑음태백6.6맑음정선군1.4맑음제천0.0맑음보은0.6맑음천안0.7맑음보령1.5맑음부여0.7구름많음금산0.9맑음세종1.9구름많음부안3.7구름많음임실0.2구름많음정읍2.4구름많음남원1.5구름많음장수-0.6구름많음고창군2.5구름많음영광군3.5구름많음김해시10.2구름많음순창군1.5구름많음북창원10.3구름많음양산시10.9구름많음보성군5.4구름많음강진군4.5구름많음장흥3.2흐림해남4.7구름많음고흥2.5구름많음의령군3.0구름많음함양군0.8구름많음광양시6.3흐림진도군8.1맑음봉화0.7맑음영주2.6맑음문경2.4맑음청송군1.3맑음영덕7.9맑음의성1.8맑음구미5.0맑음영천5.9맑음경주시7.3구름많음거창0.7흐림합천4.0구름많음밀양8.6구름많음산청3.4구름많음거제10.8구름많음남해10.0구름많음북부산10.8
  • 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