Nginx 로그를 올바르게 백업하기: 기본부터 자동화까지
Source: Dev.to
위 링크에 있는 전체 텍스트를 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다.
(코드 블록, URL 및 마크다운 형식은 그대로 유지됩니다.)
Nginx 로그가 무엇이며 왜 중요한가
Nginx는 처리하는 모든 요청에 대해 로그를 생성합니다. 기본적으로 이 로그는 다음에 저장됩니다:
/var/log/nginx/
가장 중요한 두 파일은:
access.log– Nginx가 제공한 모든 HTTP 요청을 기록합니다.error.log– 요청을 처리하는 동안 Nginx가 겪는 문제를 기록합니다.
액세스 로그
Example entry:
43.202.80.217 - - [16/Dec/2025:02:14:10 +0000] "GET /news/latest HTTP/1.1" 200 5421 "-" "Mozilla/5.0"
알려주는 내용:
| 필드 | 의미 |
|---|---|
| Client IP address | 클라이언트 IP 주소 |
| Date and time | 날짜 및 시간 |
| Requested URL | 요청된 URL |
| HTTP status code | HTTP 상태 코드 (200, 404, …) |
| Response size | 응답 크기 |
| User agent | 사용자 에이전트 (브라우저, 봇, 크롤러) |
사용 용도: 트래픽 분석, 대역폭 추정, 봇 탐지, 페이지‑뷰 분석, 비용 추정 등.
오류 로그
Example entry:
connect() failed (111: Connection refused) while connecting to upstream
사용 용도: 백엔드 오류 디버깅, 잘못된 설정 찾기, 장애 및 성능 문제 진단.
로그 회전이 필수적인 이유
로그는 지속적으로 증가합니다. 관리되지 않으면:
- 디스크 공간이 가득 차서 → 서버 성능이 저하됩니다.
- 과거 데이터가 손실되어 → 귀중한 감사 정보를 잃게 됩니다.
로그 회전:
- 로그를 일별(또는 크기 기반) 청크로 나눕니다.
- 오래된 로그를 압축합니다.
- 매우 오래된 로그를 삭제합니다.
대부분의 Linux 시스템에서는 logrotate가 이를 처리합니다. 일반적인 Nginx 설정 (/etc/logrotate.d/nginx)은 다음과 같습니다:
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
postrotate
invoke-rc.d nginx rotate
endscript
}
이 의미는
- 로그가 매일 회전됩니다.
- 오래된 로그가 압축됩니다 (
.gz). - 14일간의 로그가 보관됩니다.
- 회전 후 Nginx에 알림이 전송됩니다.
회전된 파일은 다음과 같이 나타납니다:
access.log.1
access.log.2.gz
access.log.3.gz
백업 전략
수동 복사 (소규모 프로젝트)
scp user@server:/var/log/nginx/access.log.2.gz .
제한 사항: 수동, 확장성 부족, 손실 위험.
클라우드 스토리지 (권장)
내구성이 높고 비용이 저렴하며 쉽게 복구할 수 있습니다. 인기 옵션:
- Amazon S3
- Google Cloud Storage
- Azure Blob Storage
서버가 AWS에서 실행 중이라면, 동일한 리전의 S3에 로그를 업로드하면 비용이 최소이며 11 nines 내구성을 제공하고 자동 삭제를 위한 라이프사이클 규칙을 사용할 수 있습니다.
권장 S3 레이아웃
s3://nginx-logs/
└── 16-12-2025/
└── ip-172-31-44-115/
├── access.log.2.gz
├── access.log.3.gz
└── error.log.2.gz
- 로그가 날짜별로 그룹화됩니다.
- 다중 서버를 지원합니다.
- 자동화를 간소화합니다.
Source: …
S3에 백업 자동화하기
스크립트를 생성합니다. 예: /usr/local/bin/nginx_log_backup.sh
#!/bin/bash
set -e
LOG_DIR="/var/log/nginx"
BUCKET="s3://nginx-logs"
DATE=$(date +%d-%m-%Y)
HOST=$(hostname)
aws s3 sync "$LOG_DIR" \
"$BUCKET/$DATE/$HOST/" \
--exclude "*" \
--include "*.gz"
실행 가능하도록 권한을 부여합니다:
sudo chmod +x /usr/local/bin/nginx_log_backup.sh
cron으로 스케줄링하기
logrotate가 00:00 UTC에 실행되므로, 그 직후에 백업을 스케줄합니다:
sudo crontab -e
다음 라인을 추가합니다:
30 0 * * * /usr/local/bin/nginx_log_backup.sh >> /var/log/nginx_backup.log 2>&1
동작 설명
- 매일 00:30 UTC에 실행되어 로그가 회전된 후임을 보장합니다.
- 표준 출력과 오류를 모두
/var/log/nginx_backup.log에 기록합니다.
백업 확인하기
# 로컬 회전 로그 목록 보기
ls -lh /var/log/nginx/*.gz
# 스크립트를 수동으로 실행 (테스트용)
sudo /usr/local/bin/nginx_log_backup.sh
# 업로드된 객체 목록 보기
aws s3 ls s3://nginx-logs/$(date +%d-%m-%Y)/$(hostname)/ --recursive
# cron 활동 확인
grep CRON /var/log/syslog
# 백업 로그 확인
tail /var/log/nginx_backup.log
피해야 할 일반적인 함정
| 함정 | 해결책 |
|---|---|
활성 access.log를 회전된 .gz 파일 대신 백업함 | 로그 회전 후에 백업을 실행하세요 (예: 00:30 UTC). |
| 크론과 유사한 환경에서 스크립트를 테스트하는 것을 잊음 | 스크립트를 수동으로 실행하고 로그를 확인하세요. |
| 크론 출력이 캡처되지 않음 | 위와 같이 출력을 로그 파일로 리다이렉트하세요. |
| S3 수명 주기 규칙 누락 | 필요 이상 오래된 로그를 삭제하도록 수명 주기 정책을 구성하세요. |
설정의 장점
- 신뢰할 수 있고 저비용이며 감사 가능한 로그 저장소.
- 트래픽 분석, 비용 추정, 악용 탐지 및 신뢰성 향상을 가능하게 함.
- 최소 스택으로 작동: Nginx → logrotate → 셸 스크립트 → cron → Amazon S3.
로그는 잡음이 아니라 귀중한 데이터입니다. 그에 맞게 다루세요.