[ 작업 환경 ]

 

Centos 7.8

Python 3.6

Flask 1.1

 

 

 

 

 

 [ 문제 상황 ]

 

 필자의 경우, 서버에서 가동중인 Flask 서버가 간혹 비정상화되어 이 문제에 대한 임시 조치로 Flask 서버를 모니터링하는 shell script를 작성해 동시에 가동하였습니다.

 그러나 Falsk 서버에 행이 발생해 API가 비정상인데도 불구하고 약 5분 정도 후에나 Flask 서버가 재가동되는 것을 확인했습니다.

 

 

 

 

 

 [ 문제 원인 ]

 

필자가 작성한 Shell Script는 아래와 유사합니다.

target="https://test.growingsaja.co.kr"
check=`curl -s $target`

 curl 명령어를 사용하여 도메인으로 요청을 보내 Health Check를 확인하는 형태라고 보시면 됩니다.

 기본적으로 curl 커맨드는 Response가 돌아올 때 까지 기다리는데, DEFAULT_CONNECT_TIMEOUT 은 5분으로 설정되어있습니다.

define DEFAULT_CONNECT_TIMEOUT 300000 # milliseconds == five minutes

 이 부분을 모르면 이해할 수 없는 현상이지만, 기존 timeout 시간이 5분이기 때문에 그동안 약 5분 정도 후에나 Flask 서버가 재가동되었음을 알 수 있습니다. 

(출처:github.com/curl/curl/blob/master/lib/connect.h#L43)

 

 즉, Request를 했으나 Response로 비정상이다라고 알려준다면 바로 재가동을 하지만, 서버에 행이 걸린 경우 Response가 오지 않기 때문에 계속 해당 script process가 Response를 기다리고, 현재 설정상 5분으로 되어있기 때문에 약 5분 후 timeout으로 curl 요청이 stop되면서 그제서야 서버를 재가동하는 것입니다.

 

 

 

 

 

 [ 문제 해결 ]

 

 여러가지 해결 방법이 있겠지만, 위와 같이 행 발생으로 인한 서버 비정상화 case를 대비해 connect-timeout 시간을 curl command 옵션으로 직접 요쳥해주었습니다.

target="https://test.growingsaja.co.kr"
check=`curl -s $target --connect-timeout 10`

 위와 같이 작성할 경우, timeout 시간은 10초이고, 10초 이내에 response가 오지 않으면 관리자가 알 수 있도록 작성해주었습니다.

 이외에 --retry 옵션이나 --max-time 옵션을 활용하는 것도 방법이 될 수 있겠습니다.

 

 

 

 

+ Recent posts