404 오류를 모니터링하는 Bash 스크립트 만들기

웹사이트를 운영하면서 가장 중요한 것 중 하나는 사용자가 원활하게 사이트를 이용할 수 있도록 하는 것입니다.

하지만 때로는 사용자가 존재하지 않는 페이지에 접근을 시도하여 404 오류가 발생할 수 있습니다. 이러한 오류는 웹사이트의 사용성에 영향을 미치고, SEO(검색 엔진 최적화)에도 부정적인 영향을 줄 수 있습니다. 따라서, 이러한 오류를 신속하게 감지하고 대응하는 것이 중요합니다.

이번 글에서는 최근 5분 동안 발생한 400 또는 404 HTTP 응답 코드의 수를 계산하여, 이 수가 15개를 초과할 경우 경고 메시지를 기록하는 Bash 스크립트를 소개하겠습니다. 이 스크립트는 웹사이트 관리자가 문제를 신속하게 인지하고 대응할 수 있도록 도와줍니다.

이번 글에서 작성한 스크립트는 개인 환경에 따라 수정이 필요하며 커스터마이징을 할 수 있게 하나하나 설명드리겠습니다.


400, 404 에러란?

HTTP 400 Bad Request 에러

HTTP 400 에러는 “Bad Request”를 의미합니다. 이 오류는 클라이언트(웹 브라우저 또는 요청을 하는 다른 클라이언트)가 서버에 보낸 요청이 잘못되었거나 서버가 이해할 수 없을 때 발생합니다. 이러한 상황은 다음과 같은 경우에 발생할 수 있습니다:

  • 요청 메시지의 구문이 잘못된 경우
  • 요청에 포함된 URL이 잘못 형식화된 경우
  • 요청 헤더가 너무 크거나 잘못된 경우
  • 클라이언트가 요구하는 요청 방식을 서버가 지원하지 않는 경우

HTTP 404 Not Found 에러

HTTP 404 에러는 “Not Found”를 의미합니다. 이 오류는 클라이언트가 요청한 리소스(웹 페이지, 이미지, 파일 등)를 서버에서 찾을 수 없을 때 발생합니다. 404 에러는 웹사이트나 웹 애플리케이션에서 매우 흔하게 발생하며, 다음과 같은 상황에서 나타날 수 있습니다:

  • URL이 잘못 입력되었을 경우 (예: 오타가 있는 경우)
  • 요청한 리소스가 서버에서 삭제되었거나 이동된 경우
  • 서버 설정 오류로 인해 요청한 리소스에 접근할 수 없는 경우




스크립트 작성하기

해당 스크립트는 현재 블로그에도 적용 중인 스크립트입니다.

#!/bin/bash

LOG_FILE="/opt/bitnami/apache2/logs/access_log"
ERROR_LOG="/home/bitnami/auto/Web_404-error"

CURRENT_TIME=$(date '+%d/%b/%Y:%H:%M')
FIVE_MIN_AGO=$(date --date='-5 min' '+%d/%b/%Y:%H:%M')

COUNT=$(awk -v start="$FIVE_MIN_AGO" -v end="$CURRENT_TIME" '($4 > "["start) && ($4 < "["e
nd) && ($9 ~ /^(400|404)$/)' "$LOG_FILE" | wc -l)

FORMATTED_CURRENT_TIME=$(date '+%Y_%m_%d-%H:%M')

if [ "$COUNT" -gt 15 ]; then
  echo "$FORMATTED_CURRENT_TIME [5Min < $COUNT CountOver] ERROR" >> "$ERROR_LOG"
else
  echo "$FORMATTED_CURRENT_TIME [5Min = $COUNT]" >> "$ERROR_LOG"
fi
~  
  • LOG_FILEERROR_LOG 변수는 각각 Apache 접근 로그 파일과 사용자 정의 에러 로그 파일의 경로를 저장합니다.
LOG_FILE="/opt/bitnami/apache2/logs/access_log"
ERROR_LOG="/home/bitnami/auto/Web_404-error"
  • LOG_FILE : Apache 웹 서버의 접근 로그 파일 경로입니다.
  • ERROR_LOG : 사용자 정의 에러 로그 파일의 경로입니다. 이 파일에는 스크립트의 결과가 기록됩니다.


  • 현재 시간과 5분 전 시간 설정:
   CURRENT_TIME=$(date '+%d/%b/%Y:%H:%M')
   FIVE_MIN_AGO=$(date --date='-5 min' '+%d/%b/%Y:%H:%M')

date 명령어를 사용하여 현재 시간(CURRENT_TIME)과 5분 전 시간(FIVE_MIN_AGO)을 설정합니다. 이러한 시간 포맷은 대부분의 Apache 로그 파일의 시간 포맷과 일치합니다.


  • 로그 파일에서 조건에 맞는 로그의 수 계산:
 COUNT=$(awk -v start="$FIVE_MIN_AGO" -v end="$CURRENT_TIME" '($4 > "["start) && ($4 < "["end) && ($9 ~ /^(400|404)$/)' "$LOG_FILE" | wc -l)

awk를 사용해서 주어진 시간 범위(FIVE_MIN_AGO부터 CURRENT_TIME까지) 내에서 HTTP 응답 코드가 400 또는 404인 로그 엔트리의 수를 계산합니다. 로그 파일에서 각 로그 엔트리의 날짜는 4번째 필드($4)에 있고, 상태 코드는 9번째 필드($9)에 있습니다. 계산된 로그 엔트리의 수는 COUNT 변수에 저장됩니다.

  • 현재 시간의 포맷 변경:
 FORMATTED_CURRENT_TIME=$(date '+%Y_%m_%d-%H:%M')

여기서는 date 명령어를 다시 사용하여 현재 시간을 다른 포맷(년_월_일-시간:분)으로 변경하고, 이를 FORMATTED_CURRENT_TIME 변수에 저장합니다. 이 포맷은 로그 메시지를 기록할 때 사용됩니다.

  • 조건에 따라 로그 파일에 메시지 기록:
   if [ "$COUNT" -gt 15 ]; then
   echo "$FORMATTED_CURRENT_TIME [5Min < $COUNT CountOver] ERROR" >> "$ERROR_LOG"
   else
   echo "$FORMATTED_CURRENT_TIME [5Min = $COUNT]" >> "$ERROR_LOG"
   fi

이 부분은 COUNT 변수(최근 5분 동안 400 또는 404 응답 코드를 받은 로그 엔트리의 수)가 15를 초과하는지 확인합니다. 만약 초과한다면, 현재 시간과 함께 “[5Min < $COUNT CountOver] ERROR” 메시지를 ERROR_LOG 파일에 추가합니다. 이는 최근 5분 동안 에러 응답이 15개를 초과했음을 나타냅니다. 만약 15개 이하라면, “[5Min = $COUNT]” 메시지를 같은 파일에 추가하여, 최근 5분 동안의 에러 응답 수를 기록합니다.

웹 서버의 건강 상태를 모니터링하고, 특정 시간 동안 발생한 특정 유형의 오류가 임계값을 초과하는지 여부를 판단하는 데 유용합니다.

By Low ahn

리눅스를 처음 접하시는 분들은 위한 다양한 리눅스 정보를 공유합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다