nginx log를 rotate 해서 일자별로 관리(logrotate)
대개의 nginx 패키지는 nginx용 log rotate 스크립트를 설치하지 않습니다.
이로 인해 로그가 꽉 차서 서비스가 불능이 되거나 시스템 장애가 발생할 수 있어서 제 블로그에 nginx 용 log rotate 를 설정한 과정을 정리해 봅니다.
전역 로그 설정
nginx 의 가상 호스트 설정에는 다음과 같이 웹 서버의 로그 파일을 기록하도록 설정했습니다.
server { root /var/www/www.lesstif.com; listen 443 ssl http2; server_name www.lesstif.com; charset utf-8; access_log /var/log/nginx/lesstif.com-ssl.access.log combined; error_log /var/log/nginx/lesstif.com-ssl.error.log notice;
방문자가 꽤 있다보니 로그 파일이 금방 G 단위를 넘어가서 다음과 같이 로테이트 설정을 했습니다.
logrotate 설정
먼저 에티터를 열고 /etc/logrotate.d/nginx 파일을 만들고 다음 내용 추가합니다.
- missingok : 로그 파일이 없어도 에러를 내지 않음
- rotate 52: 로그 파일을 52개까지만 보관(53일 이전것은 삭제), 필요한 경우 숫자를 조정해서 로그 보관 일수를 변경
- compress: 압축해서 보관
create 640 nginx nginx: 새로 로그 파일 생성시 640 모드로 생성하고 소유자, 그룹은 nginx
실제 nginx 웹 서버의 구동 계정과 맞춰야 하며 잘못 설정했을 경우 nginx 가 로그를 기록할 수 없습니다.
- notifempty: 빈 로그파일은 로테이트 하지 않습니다.
postrotate: rotate 작업을 마친후에 실행할 스크립트를 적어줍니다. nginx 의 경우 SIGUSR1 을 받으면 로그 파일을 새로 읽으므로 새로 만들어진 로그 파일에 로그를 기록합니다.
이 부분이 제대로 설정되어 있지 않으면 nginx 는 이미 오픈한 로그 파일에 계속 기록합니다. 이로 인해 예전 로그 파일에 내용이 쌓이므로 주의해야 합니다.
정상 설정 여부를 테스트하기 위해 다음 명령어 실행합니다.
logrotate -d -f /etc/logrotate.d/nginx
- -d, --debug : 디버그 모드, 실제 로그 파일을 변경하지는 않고 처리 과정만 표시합니다.
정상적으로 설정됐다면 /etc/cron.daily/logrotate 파일이 있으므로 별도로 크론에 등록하지 않아도 매일 log 파일 rotate 를 실행됩니다.