Nginx 로그를 올바르게 백업하기: 기본부터 자동화까지

발행: (2025년 12월 16일 오후 12:18 GMT+9)
7 min read
원문: Dev.to

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 codeHTTP 상태 코드 (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.

로그는 잡음이 아니라 귀중한 데이터입니다. 그에 맞게 다루세요.

Back to Blog

관련 글

더 보기 »