CentOS 8 - Apache 로그관리(rotatelogs)
- ◈『WEB-WAS』/Apache-PHP
- 2020. 10. 8.
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 브라우저 버전으로 접속을 했다는 것을 알 수가 있습니다.
이런 정보들을 알고 있다면 로그 분석이 좀 더 용이할 수 있습니다.
'◈『WEB-WAS』 > Apache-PHP' 카테고리의 다른 글
Error - Response header name 'P3P ' contains invalid characters, aborting request (0) | 2023.02.16 |
---|---|
CentOS 8 - Apache 가상호스트 설정(Apache virtual host) (0) | 2020.08.07 |