비밀번호

커뮤니티2

  • 맑음속초23.9맑음북춘천22.1구름조금철원21.0구름조금동두천21.0구름조금파주20.5구름조금대관령17.5맑음춘천21.8맑음백령도18.5맑음북강릉24.0구름조금강릉24.9구름조금동해22.7맑음서울20.9구름조금인천17.9맑음원주21.5구름조금울릉도18.1맑음수원20.8맑음영월21.0맑음충주22.2맑음서산19.1구름조금울진18.1맑음청주22.6맑음대전22.3맑음추풍령21.3맑음안동22.2맑음상주23.1맑음포항23.8맑음군산19.4맑음대구23.3맑음전주21.4맑음울산20.0맑음창원22.1맑음광주22.5맑음부산19.1맑음통영20.1맑음목포19.6맑음여수20.1맑음흑산도19.4맑음완도22.4맑음고창20.8맑음순천22.3맑음홍성20.7맑음서청주21.1맑음제주20.6맑음고산18.6맑음성산20.7맑음서귀포20.7맑음진주22.6구름조금강화18.0구름조금양평22.0맑음이천22.2구름조금인제20.8맑음홍천21.5맑음태백20.3구름조금정선군23.1구름조금제천20.6맑음보은21.5맑음천안21.8맑음보령18.3맑음부여21.5맑음금산21.0맑음세종22.2맑음부안21.3맑음임실21.2맑음정읍21.8맑음남원22.5맑음장수20.8맑음고창군21.8맑음영광군20.7맑음김해시20.6맑음순창군22.3맑음북창원23.6맑음양산시22.0맑음보성군23.2맑음강진군23.0맑음장흥22.5맑음해남21.7맑음고흥22.6맑음의령군24.2맑음함양군23.1맑음광양시23.1맑음진도군19.5맑음봉화21.3맑음영주21.2맑음문경22.0맑음청송군22.5맑음영덕22.6맑음의성23.0맑음구미24.4맑음영천23.5맑음경주시24.8맑음거창23.6맑음합천24.9맑음밀양24.4맑음산청24.5맑음거제20.0맑음남해22.5맑음북부산20.8
  • 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