대개의 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;
CODE


방문자가 꽤 있다보니 로그 파일이 금방 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
CODE
  • -d, --debug : 디버그 모드, 실제 로그 파일을 변경하지는 않고 처리 과정만 표시합니다.


정상적으로 설정됐다면 /etc/cron.daily/logrotate  파일이 있으므로 별도로 크론에 등록하지 않아도 매일 log 파일 rotate 를 실행됩니다.


같이 보기