はじめに
linuxサーバーでnodeで作ったsiteを公開していたら、pm2のlogが溜まっててストレージを食いつぶしていたのでこれをなんとかしたくなりました。
サーバースペック
OS: Ubuntu18.04
あとの情報は今回の記事には関係なさそうなので割愛
サーバーのストレージがやばい!
ある日、サーバーを監視していると、どうやらファイルの変更などができなくなっていました。
ファイルを変更しようとしたりすると、以下のようなメッセージが。
Can not change file: No space left on device
というわけで、対処していきます。
状態の確認
とりあえず、状態を確認します。
df -aTh
あたりで実行します。
原因ファイルの特定
ストレージがやばいことは分かったので、原因ファイルを探します。du
コマンドをいじってみます。
du -sh * | sort -nr
とか
du -d1 -h <ディレクトリ>
あたりを確認しました。
user: $ du -d1 -h ~/
XM /home/user/hoge
XK /home/user/fuga
:
:
:
X0G /home/user/.pm2
XXG /home/user
user: $ du -d1 -h ~/.pm2
X0G /home/user/logs
(略)
ろぐ。。。???
もう少し詳しく確認したところ、あるnodeアプリケーションの起動中のエラーログが溜まりに溜まって、何十GBにも膨れ上がっていました。
原因の撲滅
とりあえず当該ファイルを削除します。
あと、この際にdbとかが停止していることがあるので、その場合は再起動しておきましょう。
再発防止
エラーが出ないようなコーディングをすることは当然として……
pm2のログが必要以上に溜まらないようにしましょう。
そこで登場するのがpm2-logrotateです。こいつを使って、一定以上の容量を超えたログファイルを削除するようにします。
pm2-logrotateの導入
pm2-logrotateって
https://www.npmjs.com/package/pm2-logrotate
とりあえず全部止めておこう
pm2 stop all
インストールします
pm2 install pm2-logrotate
起動
rootじゃないとだめならsudoしましょう。
sudo pm2 logrotate -u user
確認
ここで起動できているはずなので確認します。
pm2 report
なんか動いていたら成功です。
設定
とりあえず以下のコマンドで確認できるはずです。
pm2 get pm2-logrotate
最大ファイルサイズ
pm2 set pm2-logrotate:max_size 1G
単位は何も書かなければBとなり、K/M/Gまで設定できます。
retain数
pm2 set pm2-logrotate:retain 50
デフォだと20になっています。ここで指定した数だけログファイルが生成されると思っておけばよいでしょう。
この数を超えると更新が古いものから順に消えていきます。
all
としておけばアプリケーションの分だけ残るはずです。
その他の設定
┌────────────────┬─────────────────────┐
│ key │ value │
├────────────────┼─────────────────────┤
│ max_size │ 10M │
│ retain │ all │
│ compress │ false │
│ dateFormat │ YYYY-MM-DD_HH-mm-ss │
│ workerInterval │ 30 │
│ rotateInterval │ 0 0 * * * │
│ rotateModule │ true │
└────────────────┴─────────────────────┘
この左の部分が設定内容になります。
上のような感じで設定できます。
詳しくは公式ドキュメントを読みましょう(英語ですが)。
pm2の再起動
最初に止めたものはこの段階で再起動しましょう。
なんか消えていれば、以下を実行すれば何とかなるかもしれません。
たいてい何とかなります。
pm2 resurrect
まとめ
logファイルだと思って油断していると、思わぬほど容量を食うことがあります。
それを防ぐためには、logrotateが有効です。