(http://www.digimoon.net/)
간만에 팁 하나 작성합니다. ^^
이번엔 아파치 웹서버용 웹로그 분석툴 중 가장 대표적인 Webalizer에 관한 팁을 소개하고자 합니다.
Webalizer를 설치하는 방법에 대해선 인터넷을 뒤져보면 수두룩하게 나옵니다만 저는 좀 더 진보된 기능을 수행하는 Webalizer 설치법을 소개하고자 합니다.
Webalizer에서 국가별 로그 출력하기
(GeoIP C API + Apache mod_geoip module + Webalizer with Geolizer patch)

아마 알만한 분들은 잘 아실 겁니다. Webalizer를 설치하고 나면 웹분석 화면 제일 하단에 국가별 로그를 출력하는 곳이 위 이미지처럼 나오죠. 참 심심하죠. 내 서버에 접속하는 인간이나 로봇(검색 로봇)들의 국가 정보까지 알수 있으면 얼마나 좋을까요? 그런데 오리지날 Webalizer는 골때리게도 기본으로 제공되는 소스로 설치하면 국가 정보가 출력되지 않습니다. 그럼 뭐하러 저 메뉴를 출력하는 것일까요? ^^;;
이번에 소개하고자 하는 팁은 위 옥의 티를 극복하기 위한 방법입니다.
아파치 웹서버의 mod_geoip 모듈과 Geolizer라는 Webalizer용 패치를 조합하는 방법을 이제 소개하고자 합니다.
아파치에 mod_geoip 모듈을 적재하게 되면 아래와 같이 아파치 로그 파일에 발생하는 로그 행마다 국가명 이니셜이 끝에 붙어 나오게 됩니다. 붉게 강조한 부분입니다.
219.254.51.110 - - [08/Jul/2008:00:14:12 +0900] "GET /commu/union/l_0103a.gif HTTP/1.1" 200 427 "http://sh890918.digimoon.net/commu/union/noname5.htm" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)" sh890918.digimoon.net KR
219.254.51.110 - - [08/Jul/2008:00:14:12 +0900] "GET /commu/union/1.gif HTTP/1.1" 200 13823 "http://sh890918.digimoon.net/commu/union/noname5.htm" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)" sh890918.digimoon.net KR
211.224.159.73 - - [08/Jul/2008:00:14:13 +0900] "GET /8th/images/2001img/analysis_shingo.gif HTTP/1.1" 403 312 "http://blog.naver.com/PostView.nhn?blogId=28686&logNo=100051155920&categoryNo=9&viewdate=&cpage=1&postListTopCurrentPage=1" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)" mse9000.digimoon.net KR
211.224.159.73 - - [08/Jul/2008:00:14:13 +0900] "GET /8th/images/analysis_review.jpg HTTP/1.1" 403 304 "http://blog.naver.com/PostView.nhn?blogId=28686&logNo=100051155920&categoryNo=9&viewdate=&cpage=1&postListTopCurrentPage=1" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)" mse9000.digimoon.net KR
219.254.51.110 - - [08/Jul/2008:00:14:19 +0900] "GET /W/Wmc/bn.gif HTTP/1.1" 200 258 "http://sh890918.woweb.net/h/index.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)" sh890918.digimoon.net KR
219.254.51.110 - - [08/Jul/2008:00:14:12 +0900] "GET /commu/union/1.gif HTTP/1.1" 200 13823 "http://sh890918.digimoon.net/commu/union/noname5.htm" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)" sh890918.digimoon.net KR
211.224.159.73 - - [08/Jul/2008:00:14:13 +0900] "GET /8th/images/2001img/analysis_shingo.gif HTTP/1.1" 403 312 "http://blog.naver.com/PostView.nhn?blogId=28686&logNo=100051155920&categoryNo=9&viewdate=&cpage=1&postListTopCurrentPage=1" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)" mse9000.digimoon.net KR
211.224.159.73 - - [08/Jul/2008:00:14:13 +0900] "GET /8th/images/analysis_review.jpg HTTP/1.1" 403 304 "http://blog.naver.com/PostView.nhn?blogId=28686&logNo=100051155920&categoryNo=9&viewdate=&cpage=1&postListTopCurrentPage=1" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)" mse9000.digimoon.net KR
219.254.51.110 - - [08/Jul/2008:00:14:19 +0900] "GET /W/Wmc/bn.gif HTTP/1.1" 200 258 "http://sh890918.woweb.net/h/index.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)" sh890918.digimoon.net KR
위와 같이 수집되는 아파치 로그 파일을 geolizer 패치가 된 webalizer로 수집 분석하면 국가별 접속 정보까지 웹브라우저 화면으로 확인할 수 있는 겁니다. 아래 링크처럼 말이죠. ^^
http://sysd.org/hybrid/stats/
geolizer 패치를 배포하는 사이트에서 제공하는 테스트용 페이지입니다. id: stats, passwd: stats 입니다.
우선 자신의 서버에 이 팁을 적용하기 위해서는 아래 전제 조건을 만족해야 합니다.
1. Apache가 DSO 방식으로 설치되어 있어야 합니다. mod_geoip 모듈을 DSO방식으로 적재하기 위해서입니다. static으로 geoip 모듈을 적재하는 방법을 아직 못 찾았습니다. ㅜ,.ㅜ;;
2. Apache와 PHP가 설치되어 있어야 합니다. 이건 GeoIP와의 관련 문제는 아니고 Webalizer 자체를 사용하기 위함이죠. 대부분 서버에 APM을 설치해서 운용들을 많이 하니 별다른 고민이 필요 없는 사항입니다.
3. PHP에 gd, libpng 라이브러리가 포함되어 있어야 합니다. 대부분 APM 설치할 때 PHP 관련 라이브러리도 여러가지를 함께 깔아 주게 되니 이것 역시 APM만 제대로 설치되어 있다면 크게 고민치 않아도 되겠습니다.
2. Apache와 PHP가 설치되어 있어야 합니다. 이건 GeoIP와의 관련 문제는 아니고 Webalizer 자체를 사용하기 위함이죠. 대부분 서버에 APM을 설치해서 운용들을 많이 하니 별다른 고민이 필요 없는 사항입니다.
3. PHP에 gd, libpng 라이브러리가 포함되어 있어야 합니다. 대부분 APM 설치할 때 PHP 관련 라이브러리도 여러가지를 함께 깔아 주게 되니 이것 역시 APM만 제대로 설치되어 있다면 크게 고민치 않아도 되겠습니다.
일단 아파치에 mod_geoip 모듈을 적재해야죠. 그러기 위해서는 GeoIP C API 라는 녀석을 먼저 설치해 두어야 합니다. 아파치의 mod_geoip 모듈 뿐만 아니라 php 관련 모듈인 geoip.so 를 적재하기 위해서도 마찬가지입니다.
아래 링크를 참고하여 설치하면 되겠습니다.
http://coffeenix.net/board_view.php?bd_code=1638
소스를 받아 설치하는 것입니다. 08년 7월 현재 http://www.maxmind.com/download/geoip/api/c/GeoIP-1.4.4.tar.gz 가 최신버전이로군요. /usr/local/src 디렉토리에 받아놓고 설치해 보겠습니다. 완전 쉽습니다. ^^
# cd /usr/local/src
# wget http://www.maxmind.com/download/geoip/api/c/GeoIP-1.4.4.tar.gz
# tar xvfz GeoIP-1.4.4.tar.gz
# cd GeoIP-1.4.4
# ./configure --prefix=/usr/local/GeoIP
# make
# make install
# wget http://www.maxmind.com/download/geoip/api/c/GeoIP-1.4.4.tar.gz
# tar xvfz GeoIP-1.4.4.tar.gz
# cd GeoIP-1.4.4
# ./configure --prefix=/usr/local/GeoIP
# make
# make install
설치를 마치면 아래 경로에 GeoIP.dat 라는 바이너리 포맷 형식의 파일이 생성됩니다. 아마도 이 파일이 IP 주소 대역에 대응되는 국가 명칭 정보를 담고 있겠죠. ^^
# ls -l /usr/local/GeoIP/share/GeoIP/GeoIP.dat
-rw-r--r-- 1 root root 1.1M 7월 6 14:37 /usr/local/GeoIP/share/GeoIP/GeoIP.dat
-rw-r--r-- 1 root root 1.1M 7월 6 14:37 /usr/local/GeoIP/share/GeoIP/GeoIP.dat
이제 아파치의 mod_geoip 모듈을 설치하면 됩니다. 저는 아파치 2.x 버전에 설치하므로 http://www.maxmind.com/download/geoip/api/mod_geoip2/ 에서 받아 설치해 보겠습니다.
# cd /usr/local/src
# wget http://www.maxmind.com/download/geoip/api/mod_geoip2/mod_geoip2_1.2.4.tar.gz
# tar xvfz mod_geoip2/mod_geoip2_1.2.4.tar.gz
# cd mod_geoip2-1.2.4
# /usr/local/apache/bin/apxs -a -i -L/usr/local/GeoIP/lib -I/usr/local/GeoIP/include -lGeoIP -c mod_geoip.c
# wget http://www.maxmind.com/download/geoip/api/mod_geoip2/mod_geoip2_1.2.4.tar.gz
# tar xvfz mod_geoip2/mod_geoip2_1.2.4.tar.gz
# cd mod_geoip2-1.2.4
# /usr/local/apache/bin/apxs -a -i -L/usr/local/GeoIP/lib -I/usr/local/GeoIP/include -lGeoIP -c mod_geoip.c
그런 다음 아파치 환경 설정 파일인 httpd.conf 안에 아래 내용을 추가 또는 수정해서 적용하면 됩니다.
(위 커피닉스( http://coffeenix.net/ ) URL에 적혀진 LogFormat 참고)
<IfModule mod_geoip.c>
GeoIPEnable On
GeoIPDBFile /usr/local/GeoIP/share/GeoIP/GeoIP.dat
</IfModule>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{Host}i %{GEOIP_COUNTRY_CODE}e" digimoonlog
CustomLog logs/access_log digimoonlog
GeoIPEnable On
GeoIPDBFile /usr/local/GeoIP/share/GeoIP/GeoIP.dat
</IfModule>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{Host}i %{GEOIP_COUNTRY_CODE}e" digimoonlog
CustomLog logs/access_log digimoonlog
로그 파일의 저장 방식이 httpd.conf 에서는 디폴트값으론 common 으로 되어 있습니다. digimoonlog라는 지시자는 임의로 변경 가능합니다. CustomLog 옵션에서 참고하게 됩니다.
httpd.conf 파일을 수정하였으면 아파치를 리스타트합니다. 그러면 이제부턴 access_log에 국가명 이니셜이 뒤에 붙으며 기록되기 시작합니다. 세계 곳곳에서 서버에 접속하는 현황을 실시간 로그로 가만히 보고 있으면 은근히 재미있습니다. 나만 재밌나? ㅡ,.ㅡ
mod_geoip 모듈은 로그에 국가 정보만 기록하는 기능만 하는 것은 아닙니다. 국가 단위로 웹서버 접속을 제한할 수 있는 막강(?)한 기능도 갖고 있죠.
여기까지 진행하였으면 이제 Webalizer 를 설치하기만 하면 됩니다. 오리지날 Webalizer 소스를 받아 여기에 Geolizer 패치를 가한 뒤 컴파일 설치하도록 합니다. /usr/local/src 디렉토리에 안에 아래 링크에서 최신버전을 받아 설치해 보도록 하겠습니다.
http://www.mrunix.net/webalizer/download.html
# cd /usr/local/src
# wget ftp://ftp.mrunix.net/pub/webalizer/webalizer-2.01-10-src.tgz
# tar xvfz webalizer-2.01-10-src.tgz
# wget ftp://ftp.mrunix.net/pub/webalizer/webalizer-2.01-10-src.tgz
# tar xvfz webalizer-2.01-10-src.tgz
Geolizer 패치는 아래 링크에서 받습니다.
http://sysd.org/stas/node/10
# cd /usr/local/src
# wget http://sysd.org/stas/files/active/0/geolizer_2.01-10-patch.20070115.tar.gz
# tar xvfz geolizer_2.01-10-patch.20070115.tar.gz
# wget http://sysd.org/stas/files/active/0/geolizer_2.01-10-patch.20070115.tar.gz
# tar xvfz geolizer_2.01-10-patch.20070115.tar.gz
Webalizer와 Geolizer 소스를 /usr/local/src 디렉토리에 나란히 압축 풀어 두고 패치를 합니다.
# cd /usr/local/src
# patch -p0 < ./geolizer_2.01-10-patch/geolizer.patch
# patch -p0 < ./geolizer_2.01-10-patch/geolizer.patch
이제 패치된 webalizer를 컴파일 설치합니다. 한글모드로 설치해 보겠습니다.
# cd /usr/local/src/webalizer-2.01-10
# ./configure --prefix=/usr/local/webalizer --with-language=korean --with-geoip-inc=/usr/local/GeoIP/include --with-geoip-lib=/usr/local/GeoIP/lib
# make
# mkdir -p /usr/local/webalizer/bin /usr/local/webalizer/man/man1
# ./configure --prefix=/usr/local/webalizer --with-language=korean --with-geoip-inc=/usr/local/GeoIP/include --with-geoip-lib=/usr/local/GeoIP/lib
# make
# mkdir -p /usr/local/webalizer/bin /usr/local/webalizer/man/man1
※ Geolizer로 패치된 Webalizer를 설치하는 방법을 소개하고 있는 웹상의 여러 메뉴얼들을 보면 configure 커맨드 뒤에 --enable-geoip 옵션을 주고 컴파일 환경 설정을 하는 법이 태반입니다. 하지만 Webalizer 2.01-10 에 geolizer_2.01-10-patch.20070115 을 패치하게 되면 이 옵션을 주고 컴파일 설치시 패치가 적용되지 않습니다.
예전 버전의 Geolizer 패치의 경우는 --enable-geoip 을 주어야 사용이 가능했지만 최근 버전으로 와서는 필요가 없어진 것 같네요. 아래 링크 참고 바랍니다.
http://sysd.org/stas/comment/reply/10/27823
그 다음 Makefile 파일을 편집기로 열어 24번째 줄 쯤에 있는 부분을 아래와 같이 수정합니다.
MANDIR = ${prefix}/man/man1
이제 설치합니다.
# make install
설치가 끝났습니다. 이제 설정파일을 조금 수정하여 웹로그 분석을 하는 일만 남았습니다.
Webalizer의 실행파일 경로는 /usr/local/webalizer/bin/webalizer 입니다. 이 실행파일로 아파치 로그를 하나 골라 잡아 분석을 시도하면 되는 겁니다.
아파치를 소스로 설치하면 대개 /usr/local/apache/logs 디렉토리 안에 access_log 라는 파일명으로 로그파일이 위치하게 됩니다.
실행파일을 돌리기에 앞서 access_log 파일을 분석하는 데엔 Webalizer 환경설정 파일이 필요합니다. 지금까지 소개한 내용대로 설치했다면 /etc 디렉토리 안에 webalizer.conf.sample이라는 샘플파일이 위치하게 됩니다. 이 샘플파일을 webalizer.conf라는 이름의 파일로 하나 복사해서 설정해 보도록 하겠습니다.
/etc/webalizer.conf 파일을 vi 편집기로 엽니다. 아래 소개하는 지시자들만 필요한 환경에 맞게끔 수정해서 쓰면 됩니다.
▼ 아래 부분의 주석을 풀어 access_log 파일이 실제 위치하는 경로로 지정하면 됩니다.
#LogFile /var/lib/httpd/logs/access_log
▼ 아래 지시자는 Webalizer로 분석하여 나온 결과가 담긴 내용의 html 파일 및 이미지 파일들이 위치하는 경로를 지정하는 역할을 합니다. 이 디렉토리 경로를 아파치의 가상호스트 설정에 추가해 넣어 도메인으로 웹접속을 해서 로그 결과를 확인할 수 있습니다.
#OutputDir /var/lib/httpd/htdocs/usage
▼ 아래 지시자도 주석을 풀어 활성화시킵니다.
#HistoryName webalizer.hist
▼ 이 지시자는 주석을 풀어 on으로 변경하고 사용토록 합니다. 이렇게 하면 logrotate로 로그 파일의 크기를 나누어 관리하는 경우 현재의 로그 기록이 쪼개어 떨어져 나간 과거의 로그파일 시절에 분석된 데이터에 이어져 누적 기록됩니다.
#Incremental no
▼ 아래 지시자도 통상 활성화해서 사용합니다.
#IncrementalName webalizer.current
▼ Webalizer를 웹에서 접근했을 때의 제목 출력을 담당하는 부분입니다.
#ReportTitle Usage Statistics for
▼ 웹분석 화면에 자신의 도메인을 띄우기 위해서 이 옵션을 활성화하고 도메인을 입력하면 됩니다.
#HostName localhost
▼ 설정파일 제일 하단 쪽을 보면 아래와 같은 지시자가 있습니다. 오리지날 Webalizer를 소스로 설치할 경우엔 없고 Geolizer 패치를 가하면 나타나는 지시자입니다. 주석을 풀고 사용하면 됩니다. GeoIP.dat 파일의 디렉토리 경로가 올바른지 확인합니다.
#GeoIP yes
#GeoIPDatabase /usr/local/share/GeoIP/GeoIP.dat
#GeoIPDatabase /usr/local/share/GeoIP/GeoIP.dat
예)
TopCountries 300
GeoIP yes
GeoIPDatabase /usr/local/GeoIP/share/GeoIP/GeoIP.dat
GeoIP yes
GeoIPDatabase /usr/local/GeoIP/share/GeoIP/GeoIP.dat
▼ 오리지날 Webalizer를 설치한 경우엔 필요없는 설정이나 Webalizer에 Geolizer 패치를 가했을 경우엔 Webalizer가 실행되면서 GeoIP 공유라이브러리인 /usr/local/lib/libGeoIP.so.1 파일을 호출하게 되는데 이 설정을 하지 않으면 공유라이브러리를 찾지 못해 아래와 같은 실행 에러가 납니다. 그래서...
/usr/local/webalizer/bin/webalizer: error while loading shared libraries: libGeoIP.so.1: cannot open shared object file: No such file or directory
/etc/cron.daily 디렉토리 안에 webalizer라는 이름의 스크립트용 파일을 만들고 안의 내용을 아래와 같이 작성합니다.
export LD_LIBRARY_PATH=/usr/local/GeoIP/lib 구문을 통해 라이브러리를 호출하지 못하는 문제를 해결할 수 있습니다.
#!/bin/bash
export LD_LIBRARY_PATH=/usr/local/GeoIP/lib
/usr/local/webalizer/bin/webalizer -c /etc/webalizer.conf
이렇게 /etc/cron.daily 디렉토리 안에 Webalizer 실행 스크립트를 넣어두고 /etc/crontab 파일에서 주기적으로 실행되도록 컨트롤하는 방법으로 웹로그 분석 데이터를 효율적으로 관리할 수 있습니다.export LD_LIBRARY_PATH=/usr/local/GeoIP/lib
/usr/local/webalizer/bin/webalizer -c /etc/webalizer.conf
위 스크립트 소스에 'export LD_LIBRARY_PATH=/usr/local/GeoIP/lib' 구문을 제외하고 실행할 수 있는 방법도 있습니다.
/etc/ld.so.conf 파일 안에 아래 한 줄만 추가해 주면 됩니다.
/usr/local/GeoIP/lib
그 다음 아래 커맨드를 한 번 실행해 주면 됩니다.
# ldconfig
이렇게 한 뒤 스크립트 파일을 수동으로 실행해 보면 로그분석이 이루어지는 것을 확인할 수 있습니다.
# /etc/cron.daily/webalizer
Webalizer V2.01-10-glzr (Linux 2.6.9-67.0.7.ELhugemem) Korean
대상 로그 파일: /usr/local/apache/logs/access_log (clf)
Using GeoIP database /usr/local/GeoIP/share/GeoIP/GeoIP.dat:
GEO-106FREE 20080101 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved
출력 디렉토리: /usr/local/apache/htdocs/weblog
호스트명: 'digimoon.net'
기존 히스토리 정보 해석: webalizer.hist
기존 통계 정보 해석: webalizer.current
(이하 생략)
Webalizer V2.01-10-glzr (Linux 2.6.9-67.0.7.ELhugemem) Korean
대상 로그 파일: /usr/local/apache/logs/access_log (clf)
Using GeoIP database /usr/local/GeoIP/share/GeoIP/GeoIP.dat:
GEO-106FREE 20080101 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved
출력 디렉토리: /usr/local/apache/htdocs/weblog
호스트명: 'digimoon.net'
기존 히스토리 정보 해석: webalizer.hist
기존 통계 정보 해석: webalizer.current
(이하 생략)
/etc/webalizer.conf 파일의 내용을 참고하여 분석데이터를 만듭니다. 이렇게 하면 OutputDir 지시자에 지정해 두었던 디렉토리 경로에 분석 데이터가 저장됩니다. 그런 다음 도메인으로 접속하면 이 경로가 웹페이지 파일로 출력되게끔 아파치 가상호스트 설정을 해 주면 됩니다.
여기까지만 했으면 Webalizer 화면에 국가별 로그 기록이 출력되긴 하나 국가명만 나옵니다. 만국기 아이콘까지 설치해주려면 아래 링크에서 압축파일을 받아 압축을 풀고 로그분석 데이터가 저장되어 있는 경로에 flags 라는 이름의 디렉토리를 하나 만들어 그 안에 아이콘을 넣어 주면 됩니다.
http://flags.blogpotato.de/
