워드프레스 블로그 방문자 분석도구 만들기 (Apache access log 분석)

By | 2024-01-29

이 블로그는 오라클 클라우드에서 제공하는 평생 무료 서비스에 구축하여 운영중이다. 우분투 리눅스 가상머신 2대를 생성하여 하나의 가상서버에는 아파치 웹서버와 PHP를 설치하였고 다른 하나의 가상머신에 MariaDB DBMS를 설치하였다. 그리고 웹 어플리케이션은 워드프레스(WordPress)를 설치하여 블로그를 구성하였다.

워드프레스 블로그를 구성하고 있는 오라클 클라우드의 가상서버들

www가 웹서버이고 mariadb가 DB서버다.

그리고 ap-svr-01 서버가 바로 오늘의 주제인 워드프레스 블로그의 방문자 분석, 즉 Apache 웹서버의 access log를 분석하고 DB에 업로드하는 웹페이지가 구축되어 있는 서버다.

1. 워드프레스 블로그의 Access log 파일 가져오기 (scp)

먼저 ap-svr-01 서버에서 워드프레스 블로그가 설치되어 있는 www 서버에 원격접속하여 access.log를 가져와야 한다. www 서버에서 직접 분석하고 mariadb 서버에 저장하도록 구성할 수도 있으나 www 서버와 mariadb 서버의 용량 (OCPU 1개, 램 1G)에 비하여 로그파일의 크기가 제법 커서 서버의 부하를 최소화하고자 별도의 서버에 구축하게 되었다.(물론 이 서버도 무료다.)

www 서버의 access.log 파일은 Apache 서버를 설치하면 매일 로테이션 되도록 기본 설정되어 있다. 위치는 /var/log/apache2/logs 디렉토리다. ap-svr-01 서버의 기본계정인 rocky 계정의 crontab에 다음과 같이 매일 새벽 01시에 www 서버에 접속하여 scp 명령을 통해 가져오도록 등록했다.

access.log.copy.sh 스크립트의 내용은 다음과 같다.

#!/bin/bash


# 스크립트에 전달된 인자의 개수 확인
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <hostname>"
exit 1
fi

# 전달된 호스트명을 변수에 저장
HOST=$1

# scp 명령어 실행
cd ~rocky
scp -i ~rocky/.ssh/[PKI인증서파일명] -P [포트번호] [계정명]@$HOST:[로그파일경로및이름] [복사할작업경로명및파일이름]

# 파일의 퍼미션을 666으로 변경
chmod 666 [복사할작업경로명및파일이름]

# 현재 날짜를 YYYYMMDD 형식으로 저장
DATE=$(date +"%Y%m%d")

# 파일명에 날짜 추가
NEW_FILENAME="[복사할작업경로명및파일이름].$DATE"

# 새로운 디렉토리로 복사
cp [복사할작업경로명및파일이름] [복사할타겟경로명]/$NEW_FILENAME

# 복사가 완료되었으면 원본 파일 삭제
if [ -e "[복사할타겟경로명]/$NEW_FILENAME" ]; then
echo "Copy successful. Deleting original file."
rm [복사할작업경로명및파일이름]
else
echo "Copy failed. Original file not deleted."
fi  

이 크론탭 작업에 의해 매일 새벽 1시에 로그파일을 다음과 같이 가져온다. 물론 분석도구는 PHP로 코딩되었기 때문에 Apache 웹서버 데몬이 접근가능하도록 퍼미션이나 selinux 권한이 설정되어 있어야 한다.

2024년 1월 23일 부터 매일 01시 정각에 워드프레스 블로그가 실행중인 웹서버에서 access.log 파일을 가져온 것을 알 수 있다.

2. 워드프레스 블로그의 access log 분석 시 고려할 점

워드프레스 블로그의 방문자 분석을 위해 Access Log를 분석할 때 가장 중요하게 고려해야 할 점은 바로 실제 사람의 접근과 각종 크롤러 및 봇(bot) 들의 접근을 구분하여 사람의 접근만 카운트해야 한다는 점이다.

게다가 악성 광고 댓글을 다는 봇들도 있기에 이런 봇들의 접근을 .htaccess에서 차단하거나 접근은 허용하되 방문자 카운터에서 제외해야 한다는 점이다. 그래서 다음의 다섯가지 항목에 대해 방문 카운트를 하지 않을 키워드를 등록하고 관리할 수 있도록 하였다.

2.1 예외 User Agent 정보 관리

먼저 방문자 카운트를 하지 않을 User Agent 정보다. User Agent는 Access log의 맨 끝에 위치하는데 각종 검색엔진, 예를 들면, 네이버와 구글 같은 검색엔진들이 방문할 때 “누구, 누구 왔다감”이라는 흔적을 남기는 것이라 보면 된다. 크롤러나 봇들이 남기는 흔적을 보고 사람이 직접 방문한 것인지 아닌지를 구분해야 한다.

access log를 분석하다가 너무도 많은 클롤러나 봇들이 방문하고 있다는 것을 알게되었다. 어쨌든 이런 User Agent 키워드들이 포함되어 있는 로그는 방문카운터에서 제외한다.

2.2 예외 URL 관리

또한 접근하는 URL에 따라서도 방문카운터에 포함시킬지 말지 고민해야 한다. 예를들면 블로그에 어떤~어떤 글들이 작성되어 있다고 검색엔진에게 알려주는 rss 주소와 워드프레스 블로그의 주인이 관리를 위해 접속하는 주소가 대표적인 사례다.

Wordpress Log Analysis 12

access log를 꼼꼼히 보다 보면 정상적인 결과코드인 200이 기록된 로그에 꽤 다양한 url이 요청되었음을 알 수 있다. 그 중에서 방문자 수에 포함시키지 않을 URL을 등록하고 관리할 수 있도록 했다.

그 외에도 Referer와 접근한 IP를 기준으로도 방문자 통계에 포함시키지 않을 문구들을 등록하고 관리할 수 있도록 했다.

3. 워드프레스 로그 통계작성 및 DB 저장하기

워드프레스 로그를 분석하기 위해 만든 웹페이지는 매우 단순하다. (꾸밀 줄 모른다. CSS 너무 공부하기 시럿!!!) 일자별 로그를 분석하여 화면에 보여주거나 상세 로그를 보거나 분석한 결과를 DB에 저장하는 기능이 있다.

먼저 가져온 로그파일 경로와 파일명을 입력하고, 그 파일에 포함된 로그의 날짜 또는 로그파일에서 통계를 작성할 특정 일자를 입력한다.

그리고 나서 분석의 결과를 화면으로만 볼 것인지 DB에도 저장할 것인지를 선택한다. “저장안함”을 선택하면 분석한 뒤 화면에만 보여준다.

“분석시작”을 누르면 금새 다음과 같은 화면이 표시된다.

분석DB에 “저장하기”를 선택한 경우 저장할 테이블이 생성되어 있는지 확인하고 그 결과를 출력한다. 테이블이 없으면 생성하며 있으면 저장만 수행한다.

2024년 1월 25일의 로그를 분석한 결과이며 블로그 내 각 포스트의 주소별로 해당일에 방문한 전체 방문수(Page View)와 어떤 검색엔진을 통해 접속했는지를 보여준다. 현재에는 구글, 네이버, 빙의 검색엔진만 분류하며 Referer 주소에 이 블로그의 주소가 있는 경우 Blogger 항목에 카운트가 된다. 이런 경우는 하나의 글을 검색엔진을 통해 접속한 뒤 다른 글로 이동한 경우가 되겠다.

ETC 항목은 그 외의 접근경로인 경우이며 NoReferer는 Referer 주소가 없는 방문카운트다. 이 Referer 주소가 없는 카운트는 Total 카운트에 포함되지 않는다. (구글 어낼리틱스도 마찬가지인 듯.)

그리고 가장 아래에는 합산 결과가 출력된다. 해당일에 방문한 방문자 전체수(Total)와 각 유입경로별 합산 값이 표시된다.

이 블로그(blogger.pe.kr)에 2024년 1월 25일 기준 하루동안 1,154회의 페이지뷰가 일어났으며 구글을 통해서 670회, 네이버 391회의 접근이 있었다. 티스토리에서 독립서버의 워드프레스로 이사하는 과정에서 아차~~실수로 인해 방문자 수가 많이 줄었다. SEO에 영향을 주는 메타태그가 빠진 것을 깜빡~하고 있는 동안 하루에 2~3% 정도씩 검색엔진에서 누락이 일어났던 것으로 보인다.

하지만 회복은 매우 더디다.

그리고 상세 로그를 볼 수도 있다.

위 화면은 블로그의 /1022 포스트에 접근한 로그만 추출한 것이다. 정상적인 사용자의 방문도 있지만 예외 키워드에 포함된 접근들, 즉 각종 Bot(봇)이나 크롤러의 접근도 볼 수 있다. 그리고 Referer 주소가 “-” 인 접근도 볼 수 있다.

그 외에도 각 검색엔진을 통한 접근만 보거나 특정 user agent의 키워드를 입력해 해당 키워드가 있는 접근로그만 볼 수도 있다.

그리고 일자 별 분석결과와 세부로그는 다음과 같이 DB에 저장된다. 먼저 access log다.

access log는 정상응답(200) 로그와 예외처리 로그를 제외한 로그를 각 필드별로 분리하였으며 추가로 유입경로(searchengine) 컬럼을 추가했다. 이는 추후 각종 통계를 작성할 때 식별자로 사용하기 위해서 추가하였다.

다음은 일자 별 통계 테이블이다.

이 테이블에는 일자별 포스트의 유입경로별 통계값이 저장된다.

3. 워드프레스 일별 방문자 수 통계 분석

2주 정도 시간적인 여유가 되어 워드프레스 블로그의 access log를 분석하고 일자 별 통계를 작성하는 웹페이지를 작성해보았다. 그리고 자바스크립트로 구현되는 구글차트를 사용해 워드프레스 블로그의 일별 방문자 통계 차트를 구현해보았다.

하지만 이 통계데이터를 사용하면 유입된 검색엔진별 통계 등 다양한 분석이 가능하다. 추후 기능을 추가할 예정이다.

먼저 검색엔진별로 검색 유입이 어떻게 변화해가는 지를 볼 수 있다. 아래는 지금까지 쌓인 5일간의 분석데이터를 기준으로 검색엔진별, 일자별 검색 유입량 변화를 볼 수 있다.

뿐만 아니라 특정 포스트에 대한 검색 유입의 변화도 볼 수 있다. 아래 화면은 워드프레스 블로그의 /847 포스트에 대한 일자별/검색엔진별 유입 건수를 보여주는 SQL과 그 결과다.

후기)
구글 어낼리틱스에서 이런 상세 분석 결과를 조회할 수 있으면 좋겠지만 구글 어낼리틱스의 사용법은 꽤 어렵다. 그리고 기준선(baseline)이 적용되면서 일자별/포스트별 통계같은 세부 통계 정보는 볼 수 없고 통계에서 빠지는 예외처리되는 접근로그도 볼 수 없다. 이 블로그처럼 직접 서버를 구축하여 운영하는 블로그의 경우 과도하게 접근하는 악성 Bot 들은 차단해야 하나 관련정보를 구글 어낼리틱스에서는 제공해주지 않는다.

그래서 직접 워드프레스 블로그의 access log를 분석하는 코딩을 하게되었고 이 툴을 조금 더 개선해볼 계획이다.

답글 남기기

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