[C_prg][shell] 아파치 트래픽 분석 방법
——————————————————————————
##쉘 스크립트와 간단한 c프로그램을 이용한 아파치 트랙픽 분석(웹 호스팅 관리)##
——————————————————————————
1.아파치 로그화일(httpd.conf)의 LogFormat 부분에 아래의 내용을 삽입후 아파치를
재실행하면 /usr/local/apache/logs를 확인해 보면 설정한 형식데로 로그화일이
생성되어 있음을 확인할 수 있다.
~~~~~
LogFormat %h %{%m%d}t %b => 설정은 관리자가 필요한 부분을 삽입하면 된다.
~~~~
CustomLog “/usr/local/apache/logs/logfilename” “anyfilename”
~~~~
<VirtualHost xxx.xxx.xxx.xxx> ===> 각 호스트 설정 부분 마다 삽입
ServerAdmin webmaster@seti-school.co.kr
DocumentRoot /home/kbacus/www
ServerName seti-school.com
CustomLog “/usr/local/apache/logs/logfilename” “anyfilename”
ServerAlias seti-school.com www.seti-school.com
</VirtualHost>
2.아래 C프로그램 소스를 컴파일 한다.
#gcc -o logtest logtest.c
3.cron을 이용 하루 호스트별 아파치 화일 전송량을 확인한다.
1)쉘 스크립트 화일을 만든다.
#!/bin/sh
cat /usr/local/apache/logs/log2 | sed -e s/-/0/g | sort -u > /usr/local/apache/logs/log3 && /home/kobis/www/logmail/traflog > logdata
mail -s “서버 살려~~~~” jinee@kobis.net < logdata
> /usr/local/apache/logs/log2
> /usr/local/apache/logs/log3
2)crontab에 실행하고자 하는 시간을 설정 한다.
0 6 * * * /bin/sh /home/kobis/www/logmail/logmail
===>매일 호스트별로 용량을 체크해 메일로 보내준다.(간단하죠…)
——————————————————————————
/*
############ 간단한 아파치 로그 트래픽 분석기 ##############
############ (C) jinee 2001/06/09 ##############
############ mail:jinee97@lycos.co.kr
누구나 자유롭게 수정 배포를 하셔도 됩니다.
참고로 이 프로그램은 책의 일부소스를 변형하여 작성하였음을
밝힙니다.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/wait.h>
#define LOG_FILE “/usr/local/apache/logs/log3” /* 분석 로그 화일*/
/*항시 로그 화일은 sorting이 되어 있어야만 한다.(전송량 합산 엉뚱한 결과나옴)*/
typedef struct{
char iname[30];
char iday[6];
double inbyte;
}T;
T ilog[200000];
struct tm *get; /* 시간 확인 위한 설정*/
char name[30];
char day[6];
int nbyte;
time_t t;
FILE *fp;
main(void)
{
int i,last=0;
t=time(0);
get=localtime(&t);
fp=fopen(LOG_FILE, “rt”);
while(!feof(fp)){ /* 로그화일이 EOF일때까지 */
fscanf(fp,”%30s %s %d”,&name,&day,&nbyte);
count_bn(&last); /* 로그화일의 last값 */
}
fclose(fp);
puts(“ns11번 서버 트래픽”);
puts(“=====================================================================”);
print(last);
puts(“=====================================================================”);
printf(“총 %d개의 도메인 검색\\n”,last); /* 중복을 제외한 호스트명 수*/
printf(“기록일시 : %02d월 %02d일 %02d시 %02d분 %02d초\\n”,get->tm_mon+1,get->tm_mday,get->tm_hour, get->tm_min, get->tm_sec);
}
count_bn(int *p)
{
int i,c=0;
for(i=0;i<=*p;i++)
if(strcmp(name,ilog[i].iname)==0){ /* 중복되는 호스트가 있는지 확인 */
/*호스트 명이 같으면 같은 구조체 첨자배열을 갖는다. */
c=i;
break;
}
if(c==0){
(*p)++;
c=*p;
}
strcpy(ilog[c].iname,name);
ilog[c].inbyte+=nbyte; /* 같은 첨자배열을 합한다. */
}
print(int k) /* 구조체 첨자 배열값 */
{
int i;
for(i=1;i<=k;i++){
if(ilog[i].inbyte>=500000000) /* 제한하고자 하는 트래픽량(byte) */
printf(“%30s %13.1fM : 트래픽 오버\\n”,ilog[i].iname,ilog[i].inbyte/1048576);
else printf(“%30s %13.1fM\\n”,ilog[i].iname,ilog[i].inbyte/1024000);
}
}
~