CentOS 8 - Apache 로그관리(rotatelogs)

CentOS 8 - Apache log manage(rotatelogs)

웹호스팅을 운영하다 보면 골칫거리 중 하나가 로그 관리입니다. 가상 호스트로 여러 개의 도메인을 등록하여 이용하다 보니 Access_log Error_log 각 로그에 전부 쌓이기 때문에 시간이 지날수록 용량이 커지는 것을 무시할 수가 없습니다. 커지는 만큼 서버에 사용해야 하는 용량과 리스크(위험) 부담이 생기며 무시할 경우 100% 사용률에 따른 예상치 못한 오류가 발생합니다. 로그를 안 쌓이게 설정할 수도 있지만 간혹 접근 기록, 에러, 웹로그 분석을 위해 확인이 필요한 경우도 있으므로 기본적으로는 쌓이도록 설정하는 게 좋습니다. 그럼 로그를 좀 더 편하게 관리하기 위해 Rotatelogs 사용방법을 알아보도록 하겠습니다.

 

※ Apache 버전은 달라도 로그 관리는 거의 변함이 없으므로 설치만 되어있으면 됩니다.

※ Cronolog는 CentOS7까지만 RPM 지원합니다. CentOS8부터는 제외되었으며 수동으로 설치해도 작동이 되지 않으므로 제외하였습니다. (공식 사이트도 없어졌습니다.)

□ Yum으로 설치할 경우 Apache 로그 경로

[root@localhost ~]# ls -al /etc/httpd/

drwxr-xr-x    2 root root  4096  6월 23 10:10 conf
drwxr-xr-x    2 root root  4096  6월 23 10:16 conf.d

drwxr-xr-x    2 root root  4096  6월 23 09:35 conf.modules.d

lrwxrwxrwx    1 root root    19  6월  8 16:15 logs -> ../../var/log/httpd  (기본 로그 경로/소프트 링크가 걸려있음)
lrwxrwxrwx    1 root root    29  6월  8 16:15 modules -> ../../usr/lib64/httpd/modules
lrwxrwxrwx    1 root root    10  6월  8 16:15 run -> /run/httpd
lrwxrwxrwx    1 root root    19  6월  8 16:15 state -> ../../var/lib/httpd

 

[root@localhost ~]# ls -al /var/log/httpd/  (실제 쌓이고 있는 로그 파일)

-rw-r--r--   1 root root     0  7월 13 08:47 access_log
-rw-r--r--   1 root root  9022  6월 23 10:19 access_log-20200713
-rw-r--r--   1 root root  1376  9월  3 20:52 error_log
-rw-r--r--   1 root root 16339  7월 13 08:47 error_log-20200713

 

□ 기본 로그 경로 중지

[root@localhost ~]# vi /etc/httpd/conf/httpd.conf

 

    179 # ErrorLog: The location of the error log file.
    180 # If you do not specify an ErrorLog directive within a <VirtualHost>
    181 # container, error messages relating to that virtual host will be
    182 # logged here.  If you *do* define an error logfile for a <VirtualHost>
    183 # container, that host's errors will be logged there and not here.
    184 #
    185 #ErrorLog "logs/error_log"   (# 주석처리)

 

    216     #
    217     # If you prefer a logfile with access, agent, and referer information
    218     # (Combined Logfile Format) you can use the following directive.
    219     #
    220     #CustomLog "logs/access_log" combined  (# 주석처리)

 

 

STEP01

Apache log - Rotatelogs 준비

□ 이전 블로그를 보셨다면 기억하시나요? [가상 호스트 세팅 참고]

가상 호스트 세팅할 때마다 각 도메인별로 CustomLog 세팅할 수 있다는 것을, 지금은 주석(#) 처리를 했기 때문에 다로 쌓이지 않습니다. 이럴 경우는 위 기본 경로에 모든 로그가 쌓이게 됩니다.

[root@localhost ~]# vim /etc/httpd/conf/vhost.conf

 

############### foxydog11.com Start ###############

<VirtualHost *:80>
#       ServerAdmin webmaster@dummy-host.example.com

        DocumentRoot /home/test

        ServerName foxydog11.com

        ServerAlias www.foxydog11.com

#       ErrorLog logs/dummy-host.example.com-error_log  ← 주석(#) 처리로 적용 안됨

#       CustomLog logs/dummy-host.example..com-access_log common  ← 주석(#) 처리로 적용 안됨

############### foxydog11.com End #################

 

############### foxydog22.com Start ###############

<VirtualHost *:80> 
#       ServerAdmin webmaster@dummy-host.example.com

        DocumentRoot /home/test

        ServerName foxydog22.com

        ServerAlias www.foxydog22.com

#       ErrorLog logs/dummy-host.example.com-error_log  ← 주석(#) 처리로 적용 안됨

#       CustomLog logs/dummy-host.example..com-access_log common  ← 주석(#) 처리로 적용 안됨

############### foxydog22.com End #################

 

 

STEP02

호스팅 도메인마다 로그를 쌓기 위해 각 디렉토리를 생성

[root@localhost ~]# mkdir /home/test/weblog

[root@localhost ~]# mkdir /home/test2/weblog

 

 

STEP03

Rotatelogs 세팅

[root@localhost ~]# vim /etc/httpd/conf/vhost.conf

 

############### foxydog11.com Start ###############

<VirtualHost *:80> 
#  ServerAdmin webmaster@dummy-host.example.com

DocumentRoot /home/test

ServerName foxydog11.com

ServerAlias www.foxydog11.com

ErrorLog "|/usr/sbin/rotatelogs /home/test/weblog/webtest11-error_log.%y%m%d 86400"

CustomLog "|/usr/sbin/rotatelogs /home/test/weblog/webtest11-access_log.%y%m%d 86400" combined

############### foxydog11.com End #################

 

############### foxydog22.com Start ###############

<VirtualHost *:80> 
#       ServerAdmin webmaster@dummy-host.example.com

        DocumentRoot /home/test

        ServerName foxydog22.com

        ServerAlias www.foxydog22.com

ErrorLog "|/usr/sbin/rotatelogs /home/test2/weblog/webtest22-error_log.%y%m%d 86400"

CustomLog "|/usr/sbin/rotatelogs /home/test2/weblog/webtest22-access_log.%y%m%d 86400" combined

############### foxydog22.com End #################

 

□ 예시 화면

[참고]

※ |/usr/sbin/rotatelogs

앞에 | ← 이 표시는 파이프라는 문장이다, shift+\ 하면 됩니다.

제대로 입력하지 않을 경우 아파치 시작 에러가 날 수 있습니다.

 

※ %y%m%d는 각각 년/월/일 표시이다. (대소문자 구분할 것)

access_log.%y → access_log.2020

access_log.%y%m → access_log.202009

access_log.%y%m%d → access_log.20200904

 

※ %H%M%S 는 각각 시/분/초 표시이다. (좀 더 세부적인 시간을 표시할 경우)

access_log.%y%m%d-%H → access_log.20200904-01

access_log.%y%m%d-%H%M → access_log.20200904-0101

access_log.%y%m%d-%H%M%S→ access_log.20200904-010101

말한 것처럼 정확한 오류분석을 위한 게 아니면 위와 같이 년/월/일 표시가 제일 무난합니다. 

시/분/초 까지 표시하면 복잡하기 때문에 기본적으로 안 하는 것을 권고합니다. 

 

※ 86400(초)=24(시간) 숫자는 웹서버를 시작한 시간을 기준으로 주기적으로 파일을 나누는 역할을 합니다.

-rw-r--r-- 1 root root  426  9월04 17:10 foxydog11-access_log.200946 (최초 실행 접속)

-rw-r--r-- 1 root root  576  9월05 17:10 foxydog11-access_log.200947

-rw-r--r-- 1 root root  576  9월06 17:10 foxydog11-access_log.200948

 

※ 용량 단위로 파일을 나눌 수도 있습니다. [access_log.%y%m%d-%H%M%S 1M" common]

대신 %H%M%S, 시/분/초 설정을 추가해야 정상적으로 나누어집니다.

예시)

CustomLog "|/usr/sbin/rotatelogs /home/test/weblog/foxydog11-access_log.%y%m%d-%H%M%S 1M" common

1.1M    webtest11-access_log.200904-092027

1.1M    webtest11-access_log.200904-092906

776K    webtest11-access_log.200904-100422

 

※ 뒤에 common / combined 방식을 넣어줄 때 CustomLog 에만 넣어주면 됩니다. ErrorLog 에도 넣으면 오류 난다.

 

 

STEP04

적용을 위해 아파치(Apache) 재시작

[root@localhost ~]# systemctl restart httpd

별도로 프로세스가 돌아가는 것을 확인 가능

 

 

STEP05

홈페이지 접속 후 로그가 쌓이는지 확인

아래와 같이 홈페이지 접속 후 세팅한 경로에 로그가 쌓이는지 확인

[root@localhost ~]# ls -al /home/test/weblog/
-rwxr-xr-x 1 root root 1966  9월  4 03:54 foxydog11-access_log.200904
-rwxr-xr-x 1 root root 1379  9월  4 03:51 foxydog11-error_log.200904

 

[root@localhost ~]# ls -al /home/test2/weblog/
-rwxr-xr-x 1 root  root  1068  9월  4 04:41 foxydog22-access_log.200904
-rwxr-xr-x 1 root  root   396  9월  4 03:50 foxydog22-error_log.200904

 

 

■추가내용

로그가 쌓이는 방식이 몇 가지가 있는데 주로 common / combined 두 가지가 있습니다.

[root@localhost ~]# vi /etc/httpd/conf/httpd.conf

 

    191 <IfModule log_config_module>
    192     #
    193     # The following directives define some format nicknames for use with
    194     # a CustomLog directive (see below).
    195     #
    196     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    197     LogFormat "%h %l %u %t \"%r\" %>s %b" common
    198
    199     <IfModule logio_module>
    200       # You need to enable mod_logio.c to use %I and %O
    201       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

           (해당 포멧은 잘 사용하지 않아 제외하였습니다.)
    202     </IfModule>

□ Common 방식으로 세팅 시

[root@localhost ~]# vi /etc/httpd/conf/vhost.conf

        CustomLog "|/usr/sbin/cronolog /home/test/weblog/webtest11-access_log.%y%m%d" common

 

[root@localhost ~]# tail -f /home/test/weblog/webtest11-access_log.201006 (실시간 로그 확인)

다음과 같이 로그 확인 가능(웹 페이지 접속 시)

192.168.122.1 - - [06/Oct/2020:14:13:25 +0900] "GET / HTTP/1.1" 200 75

192.168.122.1 - - [06/Oct/2020:15:15:38 +0900] "GET /index.html HTTP/1.1" 200 75

[참고]

※ 192.168.122.1
서버에 요청을 한 클라이언트(PC, 원격 호스트 등)의 IP 주소입니다. 여기에 나온 IP주소가 실제 사용하는 컴퓨터 주소가 아닐 수 있습니다. 프록시(우회) 서버가 클라이언트 서버 사이에 존재한다면, 원래 컴퓨터 주소가 아닌 프록시(우회) 서버 IP가 기록될 수 있습니다.

※ - (첫 번째)
원래 여기에 올 정보는 클라이언트 컴퓨터의 Identd가 제공할 클라이언트의 RFC1413 신원이다. 일종의 내가 어떤 사람인지 신원을 알리는 역할을 하는 부분인데 이정보는 거의 믿을 수 없는 부분으로 아파치 자체에서 기능이 OFF 되어있으며 정보가 없기 때문에 - 표시

※ - (두 번째)
이는 HTTP 인증으로 알아낸 문서를 요청한 사용자의 USER ID입니다.  이 값 역시 잘 나오지 않는 값으로 정보가 없을 시 - 표시

※ [06/Oct/2020:14:15:38 +0900]
서버가 요청을 받고 처리를 완료한 시간 (접속한 시간이라고도 생각해도 됩니다.)

※ "GET / HTTP/1.1"   [ ("  ") 사이에 하나의 정보를 담고 있음 ]
해당 라인은 중요한 정보를 담고 있는데
GET : 클라이언트가 사용한 메써드(방법)이다, 가장 일반적으로 사용자가 브라우저를 통해 홈페이지를 접속했다는 뜻

/index.html : 클라이언트의 자원(파일)을 요청

HTTP/1.1 :  클라이언트는 HTTP/1.1 프로토콜 방식으로 접속을 하였습니다.

 

※ 75
클라이언트에게 보내는 내용의 크기입니다. 즉 해당 자원(파일)의 크기라고 보시면 됩니다.
파일내용이 없다면 -으로 표시됩니다.

□ Combined 방식으로 세팅 시

[root@localhost ~]# vi /etc/httpd/conf/vhost.conf

        CustomLog "|/usr/sbin/rotatelogs /home/test2/weblog/webtest22-access_log.%y%m%d 86400" combined

 

[root@mail weblog]# tail -f /home/test2/weblog/webtest22-access_log.201006

124.111.208.234 - - [06/Oct/2020:15:26:44 +0900] "GET /index.html HTTP/1.1" 200 75 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/85.0.4183.121 Safari/537.36"

[참고]

앞부분은 똑같으며 뒤에 약간의 옵션이 추가

 

※ 75 뒤 "-" 부분 [\"%{Referer}i\"]
클라이언트가 참조했다고 서버에게 알린 사이트. (즉, /index.html를 링크하였거나 포함한 사이트이다.)
없이 클라이언트에서 서버로 다이렉트로 접근 시도를 하였다면 정보를 표시 ( - ) 하지 않는다.

 

※ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/85.0.4183.121 Safari/537.36"
클라이언트 브라우저가 자신에 대해 알리는 식별정보이다. 예를 들어 위에 정보는
PC 윈도우 10 64비트 , 크롬/85.0.4183.121 브라우저 버전으로 접속을 했다는 것을 알 수가 있습니다.

 

이런 정보들을 알고 있다면 로그 분석이 좀 더 용이할 수 있습니다.

이 글을 공유하기

댓글(0)

Designed by JB FACTORY