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 브라우저 버전으로 접속을 했다는 것을 알 수가 있습니다.

     

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

    Designed by JB FACTORY