
WordOpsやUbuntuで自宅サーバーを運用していて、Webサーバー(Nginx / PHP)のログをRAMディスク(/mnt/ramdisk)へ逃がした方……実はそれだけではまだ不十分です!
UbuntuはOSの標準機能として、バックグラウンドで絶え間なくシステムログ(journald・syslog・auth.log)をSSDへ書き込み続けています。SSHのアクセス試行(海外からのブルートフォース攻撃)やサービスの動作ログなど、放っておくと年間で恐ろしい量のTBW(総書き込み量)を消費します。
今回は、Ubuntu本体のシステムログもすべて /mnt/ramdisk へ集約&完全RAM化し、SSDの書き込み摩耗を極限までゼロに近づける「究極の長寿命化テクニック」を解説します!
1. Webログだけじゃない!SSDをこっそり削る「Ubuntuのシステムログ」とは?
NginxやPHPのログをRAMディスク化しても、SSDの書き込み量が思っていたより減らない場合、原因はUbuntu本体(OS層)のログにあります。
主に以下の3つが24時間365日、SSDにアクセスし続けています。
- systemd-journald(システムログ本体): Ubuntuの標準ログ機能。
/var/log/journal/以下にバイナリ形式で大量のログを書き込みます。 - rsyslog(syslog / auth.log 等): SSHのログイン試行(
auth.log)やカーネルメッセージ(syslog)をテキストファイルとして出力します。 - Dockerコンテナの標準出力(※Docker利用時):
/var/lib/docker/containers/以下にJSON形式でコンテナのログが溜まり続けます。
今回は、これらをすべて /mnt/ramdisk(tmpfs)へ呑み込ませることで、OSレベルでのSSD書き込みをほぼゼロに抑え込みます!
2.【STEP 1】Ubuntu本体のシステムログ(journald)をRAM化する
まずは最大の大物である systemd-journald の保存先を、ストレージ(SSD)からRAM(メモリ)上へと切り替えます。
設定ファイル /etc/systemd/journald.conf を編集します。
sudo nano /etc/systemd/journald.confファイル内の [Journal] セクションに以下のように記述(またはアンコメント)します。
[Journal]
# ログの保存先をストレージではなくRAM(メモリ)のみに指定
Storage=volatile
# メモリの使用上限(例: 最大64MBまで)
RuntimeMaxUse=64M
# ログの保持期間(任意)
MaxRetentionSec=3days保存して閉じたら、journaldサービスを再起動して設定を反映します。
sudo systemctl restart systemd-journald💡 これでどうなる?/var/log/journal/ へのSSD書き込みが完全に停止し、以降のシステムログはすべてメモリ上で処理・保持されるようになります!
3.【STEP 2】rsyslog(auth.log / syslog 等)の出力先をRAMディスクへ逃がす
SSHの不正アクセスログ(auth.log)などが書き込まれる rsyslog の出力先も /mnt/ramdisk/logs/system/ へ変更します。
設定ファイル /etc/rsyslog.d/50-default.conf を編集します。
sudo nano /etc/rsyslog.d/50-default.conf主要なログの出力先を /mnt/ramdisk/logs/system/ に書き換えます。
【変更例】
auth,authpriv.* /mnt/ramdisk/logs/system/auth.log
*.*;auth,authpriv.none -/mnt/ramdisk/logs/system/syslog
kern.* -/mnt/ramdisk/logs/system/kern.log
mail.* -/mnt/ramdisk/logs/system/mail.log4.【STEP 3】Dockerのログ膨張を抑制する(※Docker使用者向け)
Dockerを使っている場合、コンテナが出力するログ(STDOUT / STDERR)がストレージを圧迫します。 ログの最大サイズを制限して、無駄な書き込みを防ぎましょう。
/etc/docker/daemon.json を作成・編集します。
sudo nano /etc/docker/daemon.json以下の設定を追記します。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}Dockerサービスを再起動します。
sudo systemctl restart docker5. 【最重要】Systemdサービスへの組み込み & logrotate自動退避
RAMディスク(tmpfs)はサーバーを再起動すると中身がすべて消失するため、起動時にログフォルダを自動生成する処理を、既存の ramdisk-init.service に組み込みます。
① 既存の Systemd サービス(ramdisk-init.service)の更新
前回の記事で作成した ramdisk-init.service を開きます。
sudo nano /etc/systemd/system/ramdisk-init.serviceシステムログ用フォルダ /mnt/ramdisk/logs/system の作成処理を追加した以下のコードに差し替えます。
[Unit]
Description=Initialize RAM Disk Temp and Log Directories for WordPress, Nginx, MariaDB and System
DefaultDependencies=no
# RAMディスクを含むローカルファイルシステムがマウントされたら即座に実行
After=local-fs.target
[Service]
Type=oneshot
RemainAfterExit=yes
# 1. 必要な親フォルダを一括作成(logs/system を追加!)
ExecStartPre=/usr/bin/mkdir -p /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/mysql /mnt/ramdisk/logs/nginx /mnt/ramdisk/logs/php /mnt/ramdisk/logs/system
# 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・ログ用フォルダの権限を設定
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, MariaDB and System
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/system!)
ExecStartPre=/usr/bin/mkdir -p /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/mysql /mnt/ramdisk/logs/nginx /mnt/ramdisk/logs/php /mnt/ramdisk/logs/system
# 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. Set ownership and permissions for WordPress, Nginx, and log directories
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.service
sudo systemctl restart rsyslog② 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
/mnt/ramdisk/logs/system/*.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)
systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}退避用ディレクトリを作成しておきます。
sudo mkdir -p /var/log/archive6. まとめ:Ubuntuログ完全RAM化でSSDの書き込みはこう変わる!
これで、Webアプリケーション(Nginx / PHP)だけでなく、Ubuntu OS本体が吐き出すシステムログまで含めた「完全ログRAMディスク化」が完成しました!
設定完了後、以下のコマンドでSSDの累計書き込み量(Data Units Written)を確認し、数日後の増え方を観察してみてください。
# ※smartctlが入っていない場合は sudo apt install smartmontools でインストール
sudo smartctl -a /dev/nvme0n1 | grep "Data Units Written"【実行例】
Data Units Written: 84,369,317 [43.1 TB]ログのランダム書き込みが消えたことで、SSDの摩耗スピードが目に見えて遅くなることを実感できるはずです。
「大切な自宅サーバーを10年単位で稼働させたい」「SSDのTBWを極限まで節約したい」という方は、ぜひこのOS層ログのRAMディスク化に挑戦してみてください!



コメント