
WordOpsやUbuntuで自宅サーバーを運用していると、24時間365日休まず吐き出されるNginxやPHP-FPMのアクセスログ・エラーログ。
「たかがテキストファイル」と油断していると、絶え間ない細かいランダム書き込み(Write Amplification)によってSSDのTBW(総書き込み保証量)が削られていきます。
今回は、前回の記事で作成した「RAMディスク自動復旧サービス(ramdisk-init.service)」を拡張し、ログ領域も /mnt/ramdisk へ集約。再起動時の自動復元からストレージへの自動同期・圧縮退避(logrotate)までを完全自動化する手順を解説します。

1. なぜ「ログの連続書き込み」がSSDを殺すのか?
ログファイルは数秒〜数分おきに少量のデータが書き込まれ続ける特性を持っています。
SSDなどのフラッシュメモリは、小さなデータを書き込む際にも内部的に大きなブロック単位でデータの消去・再書き込みを行うため、実際のデータ量以上にSSD内部の素子が劣化する「書き込み増幅(Write Amplification)」が発生します。
書き込み頻度の高い生ログをすべてRAMディスク(メモリ)上で受け止め、ストレージへの書き込み回数を極限まで減らします。
2. 今回の設計方針とフォルダ構成
前回の記事で作成した /mnt/ramdisk の構成に、今回はログ用のディレクトリ /mnt/ramdisk/logs を追加します。
/mnt/ramdisk/
├── php_tmp/ ← (既存) WordPress一時ファイル
├── nginx/ ← (既存) Nginxキャッシュ
├── mysql/ ← (既存) DB一時ファイル
└── logs/ ← 【今回追加!】
├── nginx/ ← Nginxアクセスログ・エラーログ
└── php/ ← PHP-FPMエラーログ/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ステップで環境を構築します。
- Systemdサービスの拡張: OS起動時にWebサーバーが立ち上がるより前に
logs/フォルダを自動生成する - 生ログの出力先変更: Nginx・PHPのログを
/mnt/ramdisk/logs/以下に変更する - 定期退避(logrotate): 日次で生ログを圧縮し、ストレージ(SSD/HDD)側の保管領域へ退避・世代管理する
3. 【手順1】Systemdサービス(ramdisk-init.service)の更新
前回の記事で作成した ramdisk-init.service に、ログ用フォルダの生成処理と権限付与を追記します。これにより、OS起動時にNginxやPHPが立ち上がるより前に確実にフォルダが生成されます。
① 設定ファイルを開く
sudo nano /etc/systemd/system/ramdisk-init.service② 設定コードの差し替え
既存の内容を以下のコードに書き換えます(logs/nginx および logs/php の作成と www-data への権限付与を追加しています)。
[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[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③ 設定のリロードと即時実行
設定ファイルを読み込ませ、即時実行して初期フォルダを作成します。
sudo systemctl daemon-reload
sudo systemctl start ramdisk-init.service4. 【手順2】ログの出力先を /mnt/ramdisk へ変更する
ディレクトリが作成されたことを確認し、Nginx と PHP の設定ファイルを書き換えます。
① Nginxのログパス変更
各サイトの設定ファイル(/etc/nginx/sites-available/example.com など)を変更します。複数サイトを運用している場合は、サイトごとにログファイル名を分けます。
# アクセスログ (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;設定ファイルの構文チェックを行います。
sudo nginx -t② PHP-FPMのログパス変更
PHPエラーログを吐き出している設定ファイル(/etc/php/8.3/fpm/php-fpm.conf)を書き換えます。
error_log = /mnt/ramdisk/logs/php/php-fpm.log設定を変更したら、各種サービスを再起動して反映させます。
sudo systemctl restart php8.3-fpm
sudo systemctl restart nginx5. 【手順3】logrotateによるストレージへの圧縮退避設定
RAMディスクのメモリ圧迫を防ぐため、1日1回自動で生ログを圧縮し、不揮発性ストレージ(/var/log/archive/)へ移動・保管する設定を行います。
/etc/logrotate.d/ramdisk-logs を作成します。
sudo nano /etc/logrotate.d/ramdisk-logs/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
}退避先のディレクトリを用意しておきます。
sudo mkdir -p /var/log/archiveこれで、毎日夜間に自動で生ログが圧縮・退避され、RAMディスク側は空っぽにリセットされます。
6. まとめ:SSDの書き込み量の確認手順
設定完了後、smartctl コマンドでSSDの累計書き込み量(Data Units Written)を確認します。
ツールが入っていない場合はインストールします。
sudo apt update && sudo apt install smartmontools -y以下のコマンドで書き込み量を確認できます。
sudo smartctl -a /dev/nvme0n1 | grep "Data Units Written"【出力例】
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ディスクで吸収する環境が整いました。
静音・高速、そして何年経っても壊れない超長寿命なガチ自宅サーバー環境を目指して、ぜひ導入してみてください!



コメント