서버 3대장(Nginx, Apache, Tomcat) logrotate 완벽 가이드: 디스크 풀 방지
서론
운영 중인 서버가 갑자기 멈췄을 때, 원인을 찾아보면 로그 파일이 디스크 용량을 모두 차지해버린 경우가 의외로 많습니다. 특히 트래픽이 몰리는 서비스라면 로그 파일 크기는 순식간에 수십 GB를 넘어섭니다. 이번 포스팅에서는 리눅스 표준 도구인 logrotate를 사용하여 주요 서버들(Nginx, Apache, Tomcat)의 로그를 서비스 중단 없이 관리하는 방법을 정리합니다.
logrotate란?
logrotate는 리눅스 시스템에서 로그 파일을 주기적으로 순환(Rotation), 압축(Compression), 삭제(Removal)해주는 시스템 유틸리티입니다. 이를 통해 오래된 로그를 보관하면서도 현재 디스크 사용량을 일정하게 유지할 수 있습니다.
주요 서버별 설정 방법
보통 /etc/logrotate.d/ 디렉토리에 서비스별 설정 파일을 생성하여 관리합니다.
1. Nginx 설정
Nginx는 로그 파일 핸들을 갱신하기 위해 USR1 시그널을 보내야 합니다.
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
2. Apache HTTP Server 설정
Apache는 apachectl graceful 명령어를 통해 기존 연결을 유지하면서 로그 파일을 교체합니다.
/var/log/apache2/*.log {
weekly
rotate 52
compress
delaycompress
missingok
notifempty
sharedscripts
postrotate
/usr/sbin/apachectl graceful > /dev/null
endscript
}
3. Tomcat (Catalina.out) 설정
Tomcat의 catalina.out은 파일이 항상 열려 있어 copytruncate 옵션을 사용하는 것이 안전합니다.
/opt/tomcat/logs/catalina.out {
copytruncate # 원본 파일을 비우고 복사본 생성 (중단 방지)
daily
rotate 7
compress
missingok
notifempty
size 100M # 파일 크기가 100M 초과 시 순환
}
핵심 SEO 포인트: copytruncate와 시그널
- copytruncate: Tomcat처럼 프로세스가 로그 파일을 계속 물고 있는 경우 필수적입니다.
- postrotate 시그널: Nginx와 Apache처럼 로그 파일 경로가 바뀌어도 프로세스가 이를 인지하게 하려면 시그널(USR1)이나 서비스 재로딩이 반드시 필요합니다.
설정 적용 및 테스트
수정한 설정이 정상인지 확인하려면 다음 명령어를 사용합니다.
# 문법 체크 및 강제 실행 테스트 (-d는 디버그 모드로 실제 변경 안 함)
sudo logrotate -d /etc/logrotate.d/nginx
결론
logrotate 설정은 서버 인프라 관리의 기초 중의 기초입니다. 각 서버별 특성에 맞는 옵션을 적용하여 ‘디스크 풀’로 인한 장애를 미리 예방하시기 바랍니다.