비밀번호

커뮤니티2

  • 맑음속초19.8맑음북춘천14.3맑음철원14.1맑음동두천14.1맑음파주14.3맑음대관령12.1맑음춘천16.0맑음백령도13.9맑음북강릉18.6맑음강릉20.1맑음동해20.3맑음서울15.4맑음인천14.0맑음원주16.6맑음울릉도14.6맑음수원14.8맑음영월15.2맑음충주13.0맑음서산14.0맑음울진19.0맑음청주16.0맑음대전14.5맑음추풍령15.6맑음안동14.4맑음상주16.5맑음포항19.8맑음군산13.6맑음대구18.8맑음전주14.8맑음울산16.8맑음창원15.1맑음광주15.6맑음부산16.0맑음통영16.2맑음목포15.0맑음여수17.6맑음흑산도14.9맑음완도14.9맑음고창12.4맑음순천11.0맑음홍성14.6맑음서청주13.3맑음제주15.6맑음고산13.9맑음성산13.5맑음서귀포15.1맑음진주13.8맑음강화13.7맑음양평15.8맑음이천15.5맑음인제12.9맑음홍천13.9맑음태백13.1맑음정선군11.7맑음제천11.9맑음보은13.5맑음천안13.7맑음보령14.2맑음부여13.2맑음금산14.2맑음세종13.5맑음부안13.9맑음임실11.6맑음정읍12.8맑음남원13.1맑음장수10.4맑음고창군12.4맑음영광군12.7맑음김해시15.8맑음순창군13.2맑음북창원16.7맑음양산시14.9맑음보성군13.3맑음강진군12.8맑음장흥11.7맑음해남11.1맑음고흥15.6맑음의령군15.9맑음함양군15.6맑음광양시16.8맑음진도군11.6맑음봉화11.1맑음영주17.2맑음문경15.2맑음청송군12.0맑음영덕19.1맑음의성12.6맑음구미16.8맑음영천17.2맑음경주시14.6맑음거창12.4맑음합천15.4맑음밀양15.7맑음산청16.3맑음거제16.6맑음남해18.7맑음북부산14.9
  • 2024.05.09(목)

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

[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

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