【WordOps/Ubuntu】SSDの寿命を諦めない!24時間吐き出されるログを /mnt/ramdisk へ逃がして死守する自動同期&長寿命化ガイド

この記事は約17分で読めます。
この記事が役立ったらブックマーク! あとで読み返したり、環境構築時のリファレンスに活用できます
B! はてなブックマークに追加

WordOpsやUbuntuで自宅サーバーを運用していると、24時間365日休まず吐き出されるNginxやPHP-FPMのアクセスログ・エラーログ。

「たかがテキストファイル」と油断していると、絶え間ない細かいランダム書き込み(Write Amplification)によってSSDのTBW(総書き込み保証量)が削られていきます。

今回は、前回の記事で作成した「RAMディスク自動復旧サービス(ramdisk-init.service)」を拡張し、ログ領域も /mnt/ramdisk へ集約。再起動時の自動復元からストレージへの自動同期・圧縮退避(logrotate)までを完全自動化する手順を解説します。

【 WordOps 極限高速化:後編】 停電・再起動も怖くない! 極限高速化した RAM ディスクを自動復旧させる「起動スクリプト」の作り方
爆速RAMディスク化の唯一の弱点「再起動によるメモリ揮発とフォルダ消失」を完全対策!OSが立ち上がると同時に、WordPress専用の一時フォルダを自動で生成・権限設定まで一発で通す最強の起動スクリプトを伝授します。これで停電時も自動復旧して「ヨシ!」

1. なぜ「ログの連続書き込み」がSSDを殺すのか?

ログファイルは数秒〜数分おきに少量のデータが書き込まれ続ける特性を持っています。
SSDなどのフラッシュメモリは、小さなデータを書き込む際にも内部的に大きなブロック単位でデータの消去・再書き込みを行うため、実際のデータ量以上にSSD内部の素子が劣化する「書き込み増幅(Write Amplification)」が発生します。
書き込み頻度の高い生ログをすべてRAMディスク(メモリ)上で受け止め、ストレージへの書き込み回数を極限まで減らします。

2. 今回の設計方針とフォルダ構成

前回の記事で作成した /mnt/ramdisk の構成に、今回はログ用のディレクトリ /mnt/ramdisk/logs を追加します。

Plaintext
/mnt/ramdisk/
├── php_tmp/   ← (既存) WordPress一時ファイル
├── nginx/     ← (既存) Nginxキャッシュ
├── mysql/     ← (既存) DB一時ファイル
└── logs/      ← 【今回追加!】
    ├── nginx/ ← Nginxアクセスログ・エラーログ
    └── php/   ← PHP-FPMエラーログ
Plaintext
/mnt/ramdisk/
├── php_tmp/   ← (Existing) WordPress temporary files
├── nginx/     ← (Existing) Nginx cache
├── mysql/     ← (Existing) DB temporary files
└── logs/      ← [NEWLY ADDED]
    ├── nginx/ ← Nginx access & error logs
    └── php/   ← PHP-FPM error logs

以下の3ステップで環境を構築します。

  1. Systemdサービスの拡張: OS起動時にWebサーバーが立ち上がるより前に logs/ フォルダを自動生成する
  2. 生ログの出力先変更: Nginx・PHPのログを /mnt/ramdisk/logs/ 以下に変更する
  3. 定期退避(logrotate): 日次で生ログを圧縮し、ストレージ(SSD/HDD)側の保管領域へ退避・世代管理する

3. 【手順1】Systemdサービス(ramdisk-init.service)の更新

前回の記事で作成した ramdisk-init.service に、ログ用フォルダの生成処理と権限付与を追記します。これにより、OS起動時にNginxやPHPが立ち上がるより前に確実にフォルダが生成されます。

① 設定ファイルを開く

Bash
sudo nano /etc/systemd/system/ramdisk-init.service

② 設定コードの差し替え

既存の内容を以下のコードに書き換えます(logs/nginx および logs/php の作成と www-data への権限付与を追加しています)。

INI
[Unit]
Description=Initialize RAM Disk Temp and Log Directories for WordPress, Nginx and MariaDB
DefaultDependencies=no
# RAMディスクを含むローカルファイルシステムがマウントされたら即座に実行
After=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes

# 1. 必要な親フォルダを一括作成(logs/nginx, logs/php を追加)
ExecStartPre=/usr/bin/mkdir -p /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/mysql /mnt/ramdisk/logs/nginx /mnt/ramdisk/logs/php

# 2. WordPress用およびNginx用の子フォルダを作成
ExecStart=/usr/bin/mkdir -p /mnt/ramdisk/php_tmp/main /mnt/ramdisk/php_tmp/tech /mnt/ramdisk/nginx/client_body /mnt/ramdisk/nginx/proxy /mnt/ramdisk/nginx/fastcgi /mnt/ramdisk/nginx/uwsgi /mnt/ramdisk/nginx/scgi

# 3. WordPress・Nginx・ログ用フォルダの権限を www-data に変更
ExecStartPost=/usr/bin/chown -R www-data:www-data /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/logs
ExecStartPost=/usr/bin/chmod -R 775 /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/logs

# 4. MariaDB用フォルダの所有者を mysql に変更
ExecStartPost=/usr/bin/chown -R mysql:mysql /mnt/ramdisk/mysql
ExecStartPost=/usr/bin/chmod -R 750 /mnt/ramdisk/mysql

[Install]
WantedBy=multi-user.target
INI
[Unit]
Description=Initialize RAM Disk Temp and Log Directories for WordPress, Nginx and MariaDB
DefaultDependencies=no
# Execute immediately once local filesystems, including RAM Disk, are mounted
After=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes

# 1. Create parent directories at once (Added logs/nginx and logs/php)
ExecStartPre=/usr/bin/mkdir -p /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/mysql /mnt/ramdisk/logs/nginx /mnt/ramdisk/logs/php

# 2. Create subdirectories for WordPress and Nginx
ExecStart=/usr/bin/mkdir -p /mnt/ramdisk/php_tmp/main /mnt/ramdisk/php_tmp/tech /mnt/ramdisk/nginx/client_body /mnt/ramdisk/nginx/proxy /mnt/ramdisk/nginx/fastcgi /mnt/ramdisk/nginx/uwsgi /mnt/ramdisk/nginx/scgi

# 3. Change ownership and permissions for WordPress, Nginx, and log directories to www-data
ExecStartPost=/usr/bin/chown -R www-data:www-data /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/logs
ExecStartPost=/usr/bin/chmod -R 775 /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/logs

# 4. Change ownership and permissions for MariaDB directory to mysql
ExecStartPost=/usr/bin/chown -R mysql:mysql /mnt/ramdisk/mysql
ExecStartPost=/usr/bin/chmod -R 750 /mnt/ramdisk/mysql

[Install]
WantedBy=multi-user.target

③ 設定のリロードと即時実行

設定ファイルを読み込ませ、即時実行して初期フォルダを作成します。

Bash
sudo systemctl daemon-reload
sudo systemctl start ramdisk-init.service

4. 【手順2】ログの出力先を /mnt/ramdisk へ変更する

ディレクトリが作成されたことを確認し、Nginx と PHP の設定ファイルを書き換えます。

① Nginxのログパス変更

各サイトの設定ファイル(/etc/nginx/sites-available/example.com など)を変更します。複数サイトを運用している場合は、サイトごとにログファイル名を分けます。

Nginx
# アクセスログ (access log)
access_log /mnt/ramdisk/logs/nginx/site1.com_access.log combined buffer=32k flush=5m;

# エラーログ (error log)
error_log  /mnt/ramdisk/logs/nginx/site1.com_error.log;

設定ファイルの構文チェックを行います。

Bash
sudo nginx -t

② PHP-FPMのログパス変更

PHPエラーログを吐き出している設定ファイル(/etc/php/8.3/fpm/php-fpm.conf)を書き換えます。

INI
error_log = /mnt/ramdisk/logs/php/php-fpm.log

設定を変更したら、各種サービスを再起動して反映させます。

Bash
sudo systemctl restart php8.3-fpm
sudo systemctl restart nginx

5. 【手順3】logrotateによるストレージへの圧縮退避設定

RAMディスクのメモリ圧迫を防ぐため、1日1回自動で生ログを圧縮し、不揮発性ストレージ(/var/log/archive/)へ移動・保管する設定を行います。

/etc/logrotate.d/ramdisk-logs を作成します。

Bash
sudo nano /etc/logrotate.d/ramdisk-logs
Plaintext
/mnt/ramdisk/logs/nginx/*.log
/mnt/ramdisk/logs/php/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data www-data
    olddir /var/log/archive
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}

退避先のディレクトリを用意しておきます。

Bash
sudo mkdir -p /var/log/archive

これで、毎日夜間に自動で生ログが圧縮・退避され、RAMディスク側は空っぽにリセットされます。

6. まとめ:SSDの書き込み量の確認手順

設定完了後、smartctl コマンドでSSDの累計書き込み量(Data Units Written)を確認します。

ツールが入っていない場合はインストールします。

Bash
sudo apt update && sudo apt install smartmontools -y

以下のコマンドで書き込み量を確認できます。

Bash
sudo smartctl -a /dev/nvme0n1 | grep "Data Units Written"

【出力例】

Plaintext
Data Units Written:                 84,369,317 [43.1 TB]

💡 評価基準(TBW比較)

表示された右側の数値(例: 43.1 TB)をご使用のSSDの保証スペック(TBW)と比較します。

SSDの容量一般的な寿命目安(TBW)出力例(43.1 TB)の評価
250 GB クラス約 150 TBW約28% 消費
500 GB クラス約 300 TBW約14% 消費
1 TB クラス約 600 TBW約7% 消費

🔍 観察のポイント
今回のRAMディスク化&自動同期の設定を入れた後、数日〜1週間ほど置いてから再度このコマンドを実行してみてください。
24時間絶え間なく続いていたログの連続パケットがすべてメモリ上で処理されるようになるため、「累計書き込み量の増加ペースがほぼストップした」ことを実感できるはずです!

🚀 自宅サーバーの極限長寿命化が完成!

  • MySQL / DBキャッシュ ➔ /mnt/ramdisk(RAMディスク化)
  • Nginx高速キャッシュ ➔ /mnt/ramdisk(RAMディスク化)
  • 24時間ログ領域 ➔ /mnt/ramdisk(RAMディスク化 + 自動圧縮同期)

これで、自宅サーバーにおいて「書き込み摩耗」を引き起こす主要な原因をほぼすべてRAMディスクで吸収する環境が整いました。
静音・高速、そして何年経っても壊れない超長寿命なガチ自宅サーバー環境を目指して、ぜひ導入してみてください!

コメント

タイトルとURLをコピーしました