logo

파이썬으로 웹사이트 상태 체크하기

Python March 20, 2019

최근에 관리하던 서버 중 데이터베이스 서버가 주말간에 죽어버리는 상황이 발생했습니다.

호스팅 서버 자체는 문제가 없었지만 데이터베이스쪽이 다 죽어버려서 데이터베이스 접근요청이 되는 페이지에서 전부 500 에러를 뱉으며 에러페이지가 속출했습니다.

주말간 클라이언트에게 메일세례는 기본이고 비상연락망 대처, 서버에 대한 대처에 대해 갑자기 아침부터 너무 정신없었네요.

 

원체 이런문제에 대해서는 직접 찾거나 인편을 통해 상황을 보고 받고 서버관리자에게 해결요청을 요청하다보니 당연히 대응책은 늦게 제시될 수 밖에 없고 이번 처럼 모든 근무자가 퇴근하는 주말간에 이런 사태가 일어나니 정말 말도아닐 정도더군요.

 

원래 서버가 살아있는지 onTime 체크를 하는 서비스는 참 많습니다. 당장 인터넷에 사이트 상태 조회 이런 키워드로 찾아보면 웹상에서 바로 기능을 지원해주는것도 있고 적용한 방법도 참많죠.

 

그러나 아직 우리 회사는 자체적으로 모니터링 하는 프로그램을 만든적이 없답니다. 뭐 프로그램이란게 특별한가요? 그냥 필요할 때 만들어 쓰면되는겁니다.

 

그래서 자사 호스팅 서버에 대해 http 요청을 시도해서 http response state code 를 이용해 홈페이지 상태를 조회하고 만약에 200 Ok 이외의 데이터가 수집되면 SMS 발송기능을 통해 대처 가능한 담당자에게 문자알림을 보내는 시스템을 구축하기로 했습니다.

 

 

크게 프로그램간 로직은 아래처럼 이루어집니다.

1. 상시 온라인인 PC에서 파이썬을 통해 매 10분마다 호스팅서버 특정 사이트에 HTTP 요청을 실시합니다.
2. Response 된 상태코드를 사내 인프라넷 시스템으로 전송(GET 요청)합니다.
3. 인프라넷 시스템에서 데이터를 전송받을때마다 로그데이터를 기록합니다.
3-1. 만약에 전송받은 상태코드가 200 이외의 데이터라면 지정된 담당자에게 SMS 발송작업을 진행합니다.
4. 인프라넷 시스템에서 한 달 주기로 로깅된 데이터를 통계와 리스트로 제공한다.

 

3번 이후부터는 각 시스템에서 알맞게 관리 소스코드를 짜주시면 될 것 같고 여기는 1~2에 대해서 기록을 좀 남깁니다.

 

우선 1~2번 작업을 하기위해서는 파이썬 코드를 작성해야겠죠?

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#-*- coding: utf-8 -*-
import requests
 
url = 'http://erulabo.com/'
 
try:
    response = requests.head(url=url, timeout=10)
    status = response.status_code
except requests.exceptions.Timeout:
    status = 408
except requests.exceptions.TooManyRedirects:
    status = 429
except requests.exceptions.RequestException as e:
    status = 999
 
print(status)
 
cs

 

엄청 직관적인코드입니다. requests 모듈을 이용해 url에 head 데이터 요청을 실시합니다.

페이지 결과팀을 파라미터로 저장하고 로깅을 할 자체 시스템의 페이지를 Get 방식이나 Post 방식으로 요청합니다.

+모니터링 프로그램을 돌리던 도중 서버자체가 죽어버리면 무한요청대기하다가 프로세스가 죽어버리는 문제가 발생했습니다. 해당 문제에 대응하기위해 예외처리 구문을 추가작성했습니다.

 

위 코드를 위해서는 requests 모듈을 설치해야합니다.

 

1
2
$ pip install requests
 
cs

 

이렇게 작업한 파일을 이제 주기적으로 실행시켜야합니다.

윈도우의 경우엔 작업 스케쥴러를 통해 위의 파이썬 파일을 실행시킵니다.

본 포스팅은 Linux 또는 맥 환경을 기준으로 설명드립니다.

 

맥에서는 crontab이라는 기능을 이용해서 실행코드에 대해 스케쥴링을 관리할 수 있습니다.

콘솔, 터미널에 위 명령어를 치면 vi 에디터 형식으로 파일 쓰기가 가능합니다. 거기에 자기가 원하는대로 스케쥴링을 실행할 수 있습니다.

위의 프로그램의 목적은 매 10분마다 위의 파이썬 파일을 실행하는것 입니다.

 

아래처럼 작성을 진행합니다.

 

1
2
3
4
5
6
7
8
9
10
#sudo crontab -e
...
 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
 
*/10 * * * * python /Users/erusya/PycharmProjects/CheckServer/process.py
 
cs

 

위의 4줄은 crontab의 환경변수를 지정해줍니다. 우리가 일반적으로 사용하는 터미널이나 콘솔창은 이미 운영체제 자체에서 환경변수가 다 설정되어있고 그 값을 이용해서 python 등의 명령어를 바로 인식할 수 있습니다만, crontab의 경우에는 해당기능 내부에서 임의의 쉘을 하나 더 띄워서 작업을 한다고 하네요.

 

즉 crontab의 쉘용 변수를 일일히 명시해주어야 합니다. 뭐 문제가 없게 한다면 해당 패키지위치의 경로를 직접 지정해서 python을 호출하면 되긴합니다.

#run-parts 의 아래에는 스케쥴링 실행코드가 관리됩니다. 특이한점은 스케쥴링 파라미터입니다. 띄어쓰기를 기준으로 작성되고 순서대로 "분", "시간", "일", "월", "요일", "실행코드" 입니다.

 

실행코드는 필요에 따라서 뒤에 띄어쓰기로 구분되는 추가 파라미터를 더 입력할 수 있습니다. *의 위치에는 10, 20 등을 입력하면 10분, 20시 등 원하는 설정값을 그대로 적용할 수 있습니다. 저의 경우에는 10분마다 실행이므로 "*/10" 처럼 입력해줍니다. 30분마다 실행이면 */30 이렇게 입력하면 되겠습니다.

 

작성 완료 후 vi 에디터처럼 :wq로 파일저장 후 닫기를 하면 맥의 경우에는 권한요청 컨펌창이 뜹니다. 당연히 동의.

 

이미 설정된 crontab의 정보는 -e 파라미터로 다시 파일수정을 진행하시던지 -l 파라미터로 cat 명령어처럼 스케쥴러 파일을 확인할 수 있습니다.

 

더 자세한 crontab의 사용법에 대해서는 레퍼런스 페이지를 참고해주시면 되겠습니다~