콘텐츠로 건너뛰기

507 Insufficient Storage 에러의 원인과 대처법|디스크 용량·S3·클라우드 환경

카테고리: 서버·인프라
이 기사는 현재 일본어로만 제공됩니다. 번역본은 순차적으로 공개될 예정입니다.

파일 업로드나 대량 데이터 쓰기 처리 중에 「507 Insufficient Storage」 오류가 발생할 수 있습니다. 이 오류는 서버가 요청을 처리하는 데 필요한 저장소 용량이 부족함을 나타냅니다. 본 문서에서는 507 오류의 발생 원인부터 디스크 용량 확인 방법, 로그 증대 대책, 클라우드 스토리지 용량 관리, 모니터링 설정까지 체계적으로 설명합니다.

디스크 공간 부족에서 507 에러까지 스토리지 부족 → HTTP 507 발생 흐름 원인 로그 비대화 임시 파일 잔류 DB 데이터 증가 S3 버킷 할당량 inode 고갈 df -h: 100% 디스크 가득 HTTP 507 Insufficient Storage 대처: logrotate / tmp 정리 / 모니터링
그림 1: 스토리지 부족에서 507 에러까지의 일반적 흐름

507 에러란 무엇인가

HTTP 507 Insufficient Storage는 RFC 4918(WebDAV 확장)에서 정의된 상태 코드입니다. 서버가 요청을 완료하는 데 필요한 저장 공간을 할당할 수 없을 때 반환됩니다. 원래는 WebDAV 프로토콜의 상태였지만, 현재는 파일 스토리지 관련 일반적인 오류로도 사용되고 있습니다.

이 오류는 종종 일시적인 상태 이상이며 디스크 공간을 확보하면 해결됩니다. 그러나 방치하면 데이터베이스 쓰기 실패, 로그 출력 중단, 애플리케이션 전체 충돌 등 심각한 장애로 이어질 수 있습니다.

관련 상태 이름 차이점
413 Content Too Large 요청 크기가 설정된 상한을 초과함 (서버 용량은 무관)
507 Insufficient Storage 서버 측의 물리적/논리적 스토리지 용량 부족
503 Service Unavailable 일시적인 서비스 중단 (용량 부족이 원인일 수도 있음)

서버의 디스크 용량 확인 방법

507 에러가 발생하면 먼저 서버의 디스크 용량을 확인합니다. 다음 명령어들을 사용하여 어디서 용량을 소비하고 있는지 파악합니다.

# ファイルシステムごとの使用量を確認
df -h

# 出力例:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   47G  3.0G  94% /
# /dev/sdb1       200G  180G   20G  90% /data

# 特定ディレクトリの使用量を確認
du -sh /var/log/
du -sh /var/www/
du -sh /tmp/

# サブディレクトリごとの使用量をソートして表示
du -h --max-depth=1 /var/ | sort -rh | head -20

# inode(ファイル数)の使用状況も確認(容量はあるのにファイルが作れない場合)
df -i

# 大きなファイルを探す(100MB以上)
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -20

# 最近24時間以内に更新された大きなファイルを探す
find /var -type f -mtime -1 -size +50M -ls 2>/dev/null

로그 파일 크기 증가 대책 (logrotate)

디스크 용량 부족의 가장 흔한 원인 중 하나는 로그 파일의 비대화입니다. 액세스 로그, 에러 로그, 애플리케이션 로그가 수 GB로 팽창하는 것은 드문 일이 아닙니다. Linux의 <code>logrotate</code>를 적절히 설정하여 로그 자동 회전을 수행하세요.

# /etc/logrotate.d/nginx の設定例
/var/log/nginx/*.log {
    daily           # 毎日ローテーション
    missingok       # ログファイルが無くてもエラーにしない
    rotate 14       # 14世代分を保持
    compress        # gzip で圧縮
    delaycompress   # 直近1世代は圧縮しない
    notifempty      # 空のログはローテーションしない
    create 0640 www-data adm  # 新しいログファイルの権限
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}
# /etc/logrotate.d/app の設定例(アプリケーションログ)
/var/www/app/storage/logs/*.log {
    daily
    missingok
    rotate 7         # 7日分を保持
    compress
    delaycompress
    notifempty
    create 0644 www-data www-data
    maxsize 100M     # 100MB を超えたら日次以外でもローテーション
    dateext          # 日付をファイル名に付与
    dateformat -%Y%m%d
}

# 手動でローテーションを実行(テスト)
sudo logrotate -f /etc/logrotate.d/app

# ドライラン(実行せずに結果を確認)
sudo logrotate -d /etc/logrotate.d/app

# ログのサイズを即座に確認
ls -lhS /var/log/nginx/ | head -10
ls -lhS /var/www/app/storage/logs/ | head -10

tmp 디렉토리 정리

파일 업로드 시 생성되는 임시 파일, 세션 파일, 캐시 파일이 <code>/tmp</code> 디렉토리에 축적되어 용량을 압박하는 경우도 자주 발생합니다.

# /tmp の使用量を確認
du -sh /tmp/

# 古い一時ファイルの確認(7日以上前)
find /tmp -type f -mtime +7 -ls | head -20

# 古い一時ファイルを削除(7日以上前のファイル)
find /tmp -type f -mtime +7 -delete

# PHPセッションファイルの確認と掃除
du -sh /var/lib/php/sessions/
find /var/lib/php/sessions/ -type f -mtime +1 -delete

# PHPのアップロード一時ファイルが残っていないか確認
ls -la /tmp/php*

# systemd-tmpfiles を使った自動掃除(systemd環境)
# /etc/tmpfiles.d/cleanup.conf に以下を追加:
# d /tmp 1777 root root 7d
# 上記設定は /tmp 内の7日以上前のファイルを自動削除
# cron で定期的に掃除するスクリプト例
# /etc/cron.daily/cleanup-tmp

#!/bin/bash
# 7日以上前のtmpファイルを削除
find /tmp -type f -mtime +7 -delete 2>/dev/null

# アプリケーションのキャッシュを掃除
find /var/www/app/storage/framework/cache -type f -mtime +3 -delete 2>/dev/null

# 容量を記録
echo "$(date '+%Y-%m-%d %H:%M:%S') - $(df -h / | tail -1)" >> /var/log/disk-usage.log

S3·클라우드 스토리지의 용량 제한

클라우드 스토리지를 사용하는 경우에도 용량 관련 제한과 비용에 주의가 필요합니다. AWS S3 자체에는 버킷의 용량 상한이 없지만, 비용 관리와 라이프사이클 정책을 적절히 설정해야 합니다.

# AWS CLI で S3 バケットのサイズを確認
aws s3 ls s3://my-bucket --recursive --summarize --human-readable | tail -2
# 出力例:
# Total Objects: 152345
# Total Size: 85.3 GiB

# CloudWatch メトリクスでバケットサイズを確認
aws cloudwatch get-metric-statistics \
    --namespace AWS/S3 \
    --metric-name BucketSizeBytes \
    --dimensions Name=BucketName,Value=my-bucket Name=StorageType,Value=StandardStorage \
    --start-time 2026-04-13T00:00:00Z \
    --end-time 2026-04-14T00:00:00Z \
    --period 86400 \
    --statistics Average
// S3 ライフサイクルポリシーの設定例
// 古いファイルを自動的にアーカイブ・削除
{
    "Rules": [
        {
            "ID": "archive-old-uploads",
            "Status": "Enabled",
            "Filter": {
                "Prefix": "uploads/"
            },
            "Transitions": [
                {
                    "Days": 90,
                    "StorageClass": "STANDARD_IA"
                },
                {
                    "Days": 365,
                    "StorageClass": "GLACIER"
                }
            ]
        },
        {
            "ID": "delete-temp-files",
            "Status": "Enabled",
            "Filter": {
                "Prefix": "tmp/"
            },
            "Expiration": {
                "Days": 7
            }
        },
        {
            "ID": "cleanup-incomplete-uploads",
            "Status": "Enabled",
            "Filter": {
                "Prefix": ""
            },
            "AbortIncompleteMultipartUpload": {
                "DaysAfterInitiation": 3
            }
        }
    ]
}
클라우드 서비스 용량 제한 1파일당 상한 주의사항
AWS S3 무제한 5TB 비용 관리, 라이프사이클 정책 설정이 중요
Google Cloud Storage 무제한 5TB 객체 버전 관리가 활성화되면 비용 증가에 주의
Azure Blob Storage 무제한 약 4.75TB (Block Blob) 계정별 대역폭 및 IOPS 제한 있음
DigitalOcean Spaces 250GB (요금제에 따라 다름) 5GB 플랜의 용량 제한에 주의하세요

모니터링 설정 (임계값 알림)

507 에러는 예방이 가장 중요합니다. 디스크 사용률이 일정 임계값을 초과하면 알림을 발생시키도록 모니터링을 설정합시다.

#!/bin/bash
# /usr/local/bin/disk-alert.sh
# ディスク使用率監視スクリプト

THRESHOLD=80  # 警告しきい値(%)
CRITICAL=90   # 危険しきい値(%)
MAILTO="admin@example.com"

df -h --output=pcent,target | tail -n +2 | while read usage mount; do
    # パーセント記号を除去
    usage_num=$(echo "$usage" | tr -d '%')

    if [ "$usage_num" -ge "$CRITICAL" ]; then
        echo "CRITICAL: ${mount} のディスク使用率が ${usage}% です" | \
            mail -s "[CRITICAL] ディスク容量警告 - $(hostname)" "$MAILTO"
    elif [ "$usage_num" -ge "$THRESHOLD" ]; then
        echo "WARNING: ${mount} のディスク使用率が ${usage}% です" | \
            mail -s "[WARNING] ディスク容量警告 - $(hostname)" "$MAILTO"
    fi
done

# crontab に登録(5分ごとに実行)
# */5 * * * * /usr/local/bin/disk-alert.sh
# Prometheus + node_exporter でのアラート設定例
# /etc/prometheus/alerts/disk.yml

groups:
  - name: disk_alerts
    rules:
      - alert: DiskSpaceWarning
        expr: (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "ディスク使用率が80%を超えています"
          description: "{{ $labels.instance }} の {{ $labels.mountpoint }} の使用率が {{ $value }}% です。"

      - alert: DiskSpaceCritical
        expr: (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 90
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "ディスク使用率が90%を超えています - 即時対応が必要"
          description: "{{ $labels.instance }} の {{ $labels.mountpoint }} の使用率が {{ $value }}% です。"

      - alert: DiskInodeWarning
        expr: (1 - node_filesystem_files_free / node_filesystem_files) * 100 > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "inode使用率が80%を超えています"
# Python での簡易ディスク監視スクリプト
import shutil
import smtplib
from email.mime.text import MIMEText

def check_disk_usage(path='/', warning_threshold=80, critical_threshold=90):
    """ディスク使用率を確認してアラートを送信"""
    total, used, free = shutil.disk_usage(path)

    usage_percent = (used / total) * 100
    free_gb = free / (1024 ** 3)

    print(f"パス: {path}")
    print(f"使用率: {usage_percent:.1f}%")
    print(f"空き容量: {free_gb:.1f} GB")

    if usage_percent >= critical_threshold:
        send_alert(
            level="CRITICAL",
            message=f"{path} の使用率が {usage_percent:.1f}% です。"
                    f"空き容量: {free_gb:.1f} GB"
        )
    elif usage_percent >= warning_threshold:
        send_alert(
            level="WARNING",
            message=f"{path} の使用率が {usage_percent:.1f}% です。"
                    f"空き容量: {free_gb:.1f} GB"
        )

    return usage_percent

def send_alert(level, message):
    """メールアラートを送信"""
    msg = MIMEText(message)
    msg['Subject'] = f"[{level}] ディスク容量アラート"
    msg['From'] = "monitor@example.com"
    msg['To'] = "admin@example.com"

    with smtplib.SMTP('localhost') as server:
        server.send_message(msg)

if __name__ == '__main__':
    check_disk_usage('/')
    check_disk_usage('/data')

긴급 시 용량 확보 절차

507 에러가 발생하여 서비스가 중단된 경우, 다음 단계에 따라 신속하게 용량을 확보합니다.

# 1. まず現状を把握
df -h
du -h --max-depth=1 / | sort -rh | head -10

# 2. 即座に削除できるファイル
# 古いログファイル(圧縮済み)
rm -f /var/log/nginx/*.gz
rm -f /var/log/syslog.*.gz

# パッケージマネージャーのキャッシュ
apt-get clean          # Debian/Ubuntu
yum clean all          # CentOS/RHEL

# 古いカーネル(Ubuntu)
apt-get autoremove --purge

# 3. 大きな不要ファイルを探して削除
find /var -type f -size +100M -mtime +30 -ls
find /tmp -type f -mtime +1 -delete

# 4. ログの即時ローテーション
logrotate -f /etc/logrotate.conf

# 5. journalctl のログを圧縮(systemd環境)
journalctl --vacuum-size=100M
journalctl --vacuum-time=7d

# 6. 削除後の確認
df -h

이 기사에서 사용할 수 있는 테스트 파일 (무료)

  • → <a href="/ja/files/threshold/png/50mb/" class="text-primary-600 dark:text-primary-400 hover:underline">50MB 경계값 테스트 PNG</a> — 대용량 파일 업로드 동작 확인용
  • → <a href="/ja/files/threshold/png/10mb/" class="text-primary-600 dark:text-primary-400 hover:underline">10MB 경계값 테스트 PNG</a> — 스토리지 쓰기 기본 테스트용
  • → <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">경계값 테스트 파일 목록</a> — 다양한 크기의 테스트 파일
  • → <a href="/ja/files/images/" class="text-primary-600 dark:text-primary-400 hover:underline">테스트 이미지 목록</a> — 업로드 기능 동작 검증용

관련 기사

  • → <a href="/ja/blog/http-413-error/" class="text-primary-600 dark:text-primary-400 hover:underline">413 Request Entity Too Large 에러의 원인과 해결방법</a>
  • → <a href="/ja/blog/http-422-error/" class="text-primary-600 dark:text-primary-400 hover:underline">422 Unprocessable Entity 에러의 원인과 해결방법</a>
  • → <a href="/ja/blog/nginx-upload-config/" class="text-primary-600 dark:text-primary-400 hover:underline">Nginx 파일 업로드 설정 가이드</a>
  • → <a href="/ja/blog/s3-upload-limit/" class="text-primary-600 dark:text-primary-400 hover:underline">AWS S3・CloudFront 파일 업로드 제한 정리</a>