AWS와 같은 클라우드 환경에서 로그 관리는 비교적 쉽게 이루어진다. CloudWatch와 같은 서비스를 활용해 실시간으로 모니터링할 수 있기 때문이다. 하지만 이번에 온프레미스 환경에서 직접 Nginx를 구축하면서 로그 파일이 지속적으로 쌓이는 문제를 경험하게 되었고, 이를 해결하기 위해서 간단히 logrotate설정을 추가했다. 이를 위해 도커 컨테이너 내부에서 logrotate를 설정하여 Nginx의 로그를 자동으로 관리하는 방법을 정리하였다. 이 글에서는 로그를 날짜별로 저장하고, 일정 기간이 지나면 자동으로 삭제 및 압축하는 설정 방법을 설명한다.
* 실제 환경에선 더 디테일하게 설정해야함
* 외부접속 차단되어있어서 로그 툴 못쓰는 환경임
1. 도커 환경에서 로그 저장 구조 설계
도커 컨테이너 내부에서 Nginx 로그를 /var/log/nginx/ 경로에 저장하도록 한다. 이를 위해 nginx/logs/ 디렉터리를 마운트하여 컨테이너 외부에서도 접근할 수 있도록 설정한다.
📌 로그 디렉터리 구조 예시
nginx/
├── certs/
├── logs/
├── Dockerfile
├── logrotate-cron.sh
├── logrotate-nginx
├── nginx.conf
이러한 구조를 유지하면서 logrotate를 통해 로그 파일을 자동으로 관리한다.
2. logrotate 설정 파일 작성
컨테이너 내부에서 Nginx 로그 파일을 날짜별로 저장하고 자동 회전되도록 설정한다.
✅ nginx/logrotate-nginx 설정 파일
/var/log/nginx/*.log {
daily # 매일 로그를 회전한다.
rotate 7 # 최근 7일간의 로그를 유지한다.
missingok # 로그 파일이 없어도 오류를 발생시키지 않는다.
notifempty # 로그 파일이 비어 있으면 회전하지 않는다.
compress # gzip 압축을 적용한다.
delaycompress # 하루가 지난 로그부터 압축한다.
dateext # 파일명에 날짜를 추가한다.
copytruncate # 기존 로그 파일을 유지하면서 내용을 비운다.
postrotate # Nginx 프로세스에 로그 변경을 알린다.
kill -USR1 `cat /var/run/nginx.pid`
endscript
}
3. logrotate 자동 실행을 위한 cron 스크립트 추가
컨테이너 내부에서 logrotate가 자동 실행되도록 logrotate-cron.sh 스크립트를 작성한다.
✅ nginx/logrotate-cron.sh
#!/bin/sh
# logrotate 크론 작업 추가
echo "0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx" > /etc/crontabs/root
# 크론 서비스 실행
crond -b -l 2
이 스크립트는 logrotate가 매일 자정에 실행되도록 크론 작업을 등록하고, crond를 백그라운드에서 실행한다.
4. Dockerfile 수정
컨테이너가 실행될 때 logrotate와 cron이 함께 동작하도록 Dockerfile을 설정한다.
✅ nginx/Dockerfile
FROM nginx:alpine
# 필요한 패키지 설치
RUN apk add --no-cache bash logrotate cronie
# Nginx 설정 복사
COPY nginx.conf /etc/nginx/nginx.conf
# logrotate 설정 복사
COPY logrotate-nginx /etc/logrotate.d/nginx
# logrotate 실행을 위한 cron 스크립트 복사
COPY logrotate-cron.sh /usr/local/bin/logrotate-cron.sh
RUN chmod +x /usr/local/bin/logrotate-cron.sh
# 실행 명령어: logrotate cron 실행 및 Nginx 시작
CMD ["sh", "-c", "/usr/local/bin/logrotate-cron.sh & nginx -g 'daemon off;'"]
이제 컨테이너를 다시 빌드하고 실행하면 logrotate가 자동으로 실행된다.
docker-compose build
docker-compose up -d
컨테이너 실행 후 다시 crontab -l을 실행하여 크론 작업이 정상적으로 등록되었는지 확인한다.
5. 정상 실행 확인
✅ 크론작업 등록 확인
크론 작업이 제대로 등록되었는지 확인해보자.
docker exec -it stephow-nginx crontab -l
여기서 0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx가 나와야 정상적으로 설정된 것.
✅ 로그 회전(로테이션) 후 저장되는 위치
예시 (백엔드 로그)
/var/log/nginx/backend/access.log -> /var/log/nginx/backend/access.log-20240227
/var/log/nginx/backend/error.log -> /var/log/nginx/backend/error.log-20240227
logrotate는 기본적으로 같은 디렉터리 내에서 로그 파일을 날짜별로 이름을 변경하여 저장한다.
✅ 7일(rotate 7) 이후 로그는 삭제되나?
- 설정된 rotate 7 옵션에 따라 최근 7일간의 로그만 유지되고, 7일이 지난 로그는 자동으로 삭제됨
- 즉, access.log-YYYYMMDD 형식의 로그 파일이 7개까지만 유지되고, 그 이상된 로그는 삭제됨
✅ 로그가 gzip으로 압축되나?
- compress와 delaycompress 옵션 덕분에 로그 파일이 일정 기간 후 gzip으로 압축됨
예시 (백엔드 로그)
/var/log/nginx/backend/access.log-20240225.gz
/var/log/nginx/backend/error.log-20240225.gz
- delaycompress 옵션으로 최신 로그는 압축되지 않고, 하루 지난 로그부터 압축됨
- 즉, access.log-YYYYMMDD 형태로 하루 저장된 후, 이후에 access.log-YYYYMMDD.gz로 압축됨
6. 보완이 필요한 부분
현재 설정으로도 기본적인 로그 관리(자동 회전, 삭제, 압축)는 가능하지만,
실제 프로덕션 환경에서는 추가적으로 다음을 고려해야 한다.
✅ 보완 항목 | ✅ 해결 방법 |
로그 크기 관리 | size 100M 옵션 추가 (대용량 로그 방지) |
로그 분석 및 검색 | GoAccess 도입 (실시간 대시보드) |
장기 보관 정책 추가 | tar을 이용한 월별 로그 압축 보관 |
긴급 상황 모니터링 | grep, mail을 활용한 자동 알림 |
비정상 트래픽 감지 | awk를 활용한 IP 트래픽 분석 및 차단 |
✅ 이 보완 작업을 추가하면, 온프레미스 환경에서도 완벽한 로그 관리 시스템 구축 가능!
7. 정리
- logrotate를 설정하여 Nginx 로그를 날짜별로 저장하고 관리할 수 있다.
- 크론 작업을 설정하여 매일 자동으로 로그를 회전할 수 있다.
- 일정 기간이 지난 로그는 자동으로 삭제 및 gzip 압축되어 저장 공간을 효율적으로 관리할 수 있다.
'🌀Full-Stack&Beyond' 카테고리의 다른 글
쿠버네티스 아키텍처 완벽 가이드: 컨테이너 오케스트레이션부터 배포 흐름까지 (0) | 2025.03.19 |
---|---|
🐳 Docker 네트워크 충돌 문제 및 해결 방법 (네트워크 개념을 곁들인) (0) | 2025.02.26 |
네트워크 기초 완벽 정리: 패킷, 라우팅, 게이트웨이, 네트워크 인터페이스 (0) | 2025.02.26 |
서브넷 마스크와 네트워크 대역 쉽게 이해하기 (0) | 2025.02.26 |
인터넷에 www.naver.com을 입력하면 무슨 일이 일어날까? 🌍 (0) | 2025.02.23 |
AWS와 같은 클라우드 환경에서 로그 관리는 비교적 쉽게 이루어진다. CloudWatch와 같은 서비스를 활용해 실시간으로 모니터링할 수 있기 때문이다. 하지만 이번에 온프레미스 환경에서 직접 Nginx를 구축하면서 로그 파일이 지속적으로 쌓이는 문제를 경험하게 되었고, 이를 해결하기 위해서 간단히 logrotate설정을 추가했다. 이를 위해 도커 컨테이너 내부에서 logrotate를 설정하여 Nginx의 로그를 자동으로 관리하는 방법을 정리하였다. 이 글에서는 로그를 날짜별로 저장하고, 일정 기간이 지나면 자동으로 삭제 및 압축하는 설정 방법을 설명한다.
* 실제 환경에선 더 디테일하게 설정해야함
* 외부접속 차단되어있어서 로그 툴 못쓰는 환경임
1. 도커 환경에서 로그 저장 구조 설계
도커 컨테이너 내부에서 Nginx 로그를 /var/log/nginx/ 경로에 저장하도록 한다. 이를 위해 nginx/logs/ 디렉터리를 마운트하여 컨테이너 외부에서도 접근할 수 있도록 설정한다.
📌 로그 디렉터리 구조 예시
nginx/
├── certs/
├── logs/
├── Dockerfile
├── logrotate-cron.sh
├── logrotate-nginx
├── nginx.conf
이러한 구조를 유지하면서 logrotate를 통해 로그 파일을 자동으로 관리한다.
2. logrotate 설정 파일 작성
컨테이너 내부에서 Nginx 로그 파일을 날짜별로 저장하고 자동 회전되도록 설정한다.
✅ nginx/logrotate-nginx 설정 파일
/var/log/nginx/*.log {
daily # 매일 로그를 회전한다.
rotate 7 # 최근 7일간의 로그를 유지한다.
missingok # 로그 파일이 없어도 오류를 발생시키지 않는다.
notifempty # 로그 파일이 비어 있으면 회전하지 않는다.
compress # gzip 압축을 적용한다.
delaycompress # 하루가 지난 로그부터 압축한다.
dateext # 파일명에 날짜를 추가한다.
copytruncate # 기존 로그 파일을 유지하면서 내용을 비운다.
postrotate # Nginx 프로세스에 로그 변경을 알린다.
kill -USR1 `cat /var/run/nginx.pid`
endscript
}
3. logrotate 자동 실행을 위한 cron 스크립트 추가
컨테이너 내부에서 logrotate가 자동 실행되도록 logrotate-cron.sh 스크립트를 작성한다.
✅ nginx/logrotate-cron.sh
#!/bin/sh
# logrotate 크론 작업 추가
echo "0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx" > /etc/crontabs/root
# 크론 서비스 실행
crond -b -l 2
이 스크립트는 logrotate가 매일 자정에 실행되도록 크론 작업을 등록하고, crond를 백그라운드에서 실행한다.
4. Dockerfile 수정
컨테이너가 실행될 때 logrotate와 cron이 함께 동작하도록 Dockerfile을 설정한다.
✅ nginx/Dockerfile
FROM nginx:alpine
# 필요한 패키지 설치
RUN apk add --no-cache bash logrotate cronie
# Nginx 설정 복사
COPY nginx.conf /etc/nginx/nginx.conf
# logrotate 설정 복사
COPY logrotate-nginx /etc/logrotate.d/nginx
# logrotate 실행을 위한 cron 스크립트 복사
COPY logrotate-cron.sh /usr/local/bin/logrotate-cron.sh
RUN chmod +x /usr/local/bin/logrotate-cron.sh
# 실행 명령어: logrotate cron 실행 및 Nginx 시작
CMD ["sh", "-c", "/usr/local/bin/logrotate-cron.sh & nginx -g 'daemon off;'"]
이제 컨테이너를 다시 빌드하고 실행하면 logrotate가 자동으로 실행된다.
docker-compose build
docker-compose up -d
컨테이너 실행 후 다시 crontab -l을 실행하여 크론 작업이 정상적으로 등록되었는지 확인한다.
5. 정상 실행 확인
✅ 크론작업 등록 확인
크론 작업이 제대로 등록되었는지 확인해보자.
docker exec -it stephow-nginx crontab -l
여기서 0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx가 나와야 정상적으로 설정된 것.
✅ 로그 회전(로테이션) 후 저장되는 위치
예시 (백엔드 로그)
/var/log/nginx/backend/access.log -> /var/log/nginx/backend/access.log-20240227
/var/log/nginx/backend/error.log -> /var/log/nginx/backend/error.log-20240227
logrotate는 기본적으로 같은 디렉터리 내에서 로그 파일을 날짜별로 이름을 변경하여 저장한다.
✅ 7일(rotate 7) 이후 로그는 삭제되나?
- 설정된 rotate 7 옵션에 따라 최근 7일간의 로그만 유지되고, 7일이 지난 로그는 자동으로 삭제됨
- 즉, access.log-YYYYMMDD 형식의 로그 파일이 7개까지만 유지되고, 그 이상된 로그는 삭제됨
✅ 로그가 gzip으로 압축되나?
- compress와 delaycompress 옵션 덕분에 로그 파일이 일정 기간 후 gzip으로 압축됨
예시 (백엔드 로그)
/var/log/nginx/backend/access.log-20240225.gz
/var/log/nginx/backend/error.log-20240225.gz
- delaycompress 옵션으로 최신 로그는 압축되지 않고, 하루 지난 로그부터 압축됨
- 즉, access.log-YYYYMMDD 형태로 하루 저장된 후, 이후에 access.log-YYYYMMDD.gz로 압축됨
6. 보완이 필요한 부분
현재 설정으로도 기본적인 로그 관리(자동 회전, 삭제, 압축)는 가능하지만,
실제 프로덕션 환경에서는 추가적으로 다음을 고려해야 한다.
✅ 보완 항목 | ✅ 해결 방법 |
로그 크기 관리 | size 100M 옵션 추가 (대용량 로그 방지) |
로그 분석 및 검색 | GoAccess 도입 (실시간 대시보드) |
장기 보관 정책 추가 | tar을 이용한 월별 로그 압축 보관 |
긴급 상황 모니터링 | grep, mail을 활용한 자동 알림 |
비정상 트래픽 감지 | awk를 활용한 IP 트래픽 분석 및 차단 |
✅ 이 보완 작업을 추가하면, 온프레미스 환경에서도 완벽한 로그 관리 시스템 구축 가능!
7. 정리
- logrotate를 설정하여 Nginx 로그를 날짜별로 저장하고 관리할 수 있다.
- 크론 작업을 설정하여 매일 자동으로 로그를 회전할 수 있다.
- 일정 기간이 지난 로그는 자동으로 삭제 및 gzip 압축되어 저장 공간을 효율적으로 관리할 수 있다.
'🌀Full-Stack&Beyond' 카테고리의 다른 글
쿠버네티스 아키텍처 완벽 가이드: 컨테이너 오케스트레이션부터 배포 흐름까지 (0) | 2025.03.19 |
---|---|
🐳 Docker 네트워크 충돌 문제 및 해결 방법 (네트워크 개념을 곁들인) (0) | 2025.02.26 |
네트워크 기초 완벽 정리: 패킷, 라우팅, 게이트웨이, 네트워크 인터페이스 (0) | 2025.02.26 |
서브넷 마스크와 네트워크 대역 쉽게 이해하기 (0) | 2025.02.26 |
인터넷에 www.naver.com을 입력하면 무슨 일이 일어날까? 🌍 (0) | 2025.02.23 |