LinuxなどのOSでは、Cronなどの仕組みを使ってログのローテーションをします。しかし最近nginxのログローテーションがうまく動かず、アクセスログが空になっている時があることに気づきました。これは問題です。というのも、nginxのログからレスポンスタイムを分析しているため、ログが取得できないとグラフがおかしくなってしまうのです。

そこでMonitを利用して対症療法を取ることにしました。

具体的に何をしたのか

Monitの機能の一つに、「ファイルが一定時間更新されていなければ、任意のコマンドを実行する」というものがあります。このブログは60秒間隔で正常なレスポンスを返すか確認を受けている状態のため、必ず60秒に一度はアクセスが有ります。そこで、この機能を利用することにしました。

具体的には、monitの設定ファイルに以下を追加しました:

check file nginx-blog with path /var/log/nginx/front_proxy.access.log
    if timestamp > 2 minutes for 5 cycles then exec "/etc/init.d/nginx restart"

要するに、2分以上更新されないのが5回繰り返されたら、nginxを再起動します。

しばらくしていると、ログローテーションのタイミングでまたログにうまく書き込まれない自体が発生しました。このことをMonitが検知、nginxを再起動してくれました。

Slack

最後でPIDの変更を検知していて、nginxが再起動していることがわかります。

これでまた安心して寝ていられます。本格対応に向けた調査はこれから頑張っていこうと思います。