Nginxのログが記録されなくなった

AWS上に構築したNginxをしばらく経って確認したところ、ログが取れていないことが発覚。
原因の調査から、取り急ぎの復旧までをまとめておきます。

背景

  • サーバの環境構築が終わってしばらくしてみると、Nginxのログが毎日は記録されておらず、ランダムに抜けている日がある。
  • パブリックに公開していたため、攻撃のようなアクセスは毎日来るはず。なんかおかしい…
  • 環境構築が終わってからも、開発やデプロイは何度か行なっていた。
  • 今日のログはというと、アクセスログとエラーログともに0バイトで、今日の未明(2時から4時あたり)のタイムスタンプが付いていた。
  • Nginxの再起動直後などは、特に問題がなくログが書き出される。
  • Nginxはnginxユーザで実行しているが、なぜかログはログインしている一般ユーザが所有しており、グループのみnginxに設定されている状態だった。

環境

  • Amazon Linux release 2 (Karoo)
  • nginx version: nginx/1.12.2

AWSサポートに契約していたことを思い出す

ダメもとで問い合わせてみたところ…

ビジネス以上のプランにて、サードパーティ製ソフトウェアサポートをベストエフォートで行っているため、Nginxに関しては、本来サポート対象外との回答が、、(私のアカウントはデベロッパープランでした)

一方で、原因がnginxではない場合が考えられますので…と、他の可能性についてもご案内いただきました。(優しい)
その回答とは、以下のような内容でした。

しばらく経つとログが出力されなくなる点から、ログのローテーションが行われた場合にファイルのパーミッションが書き換えられている可能性がございます。

なるほど…

ログのローテーション設定も確認してみたが…

以下のような設定になっていました。
(パーミッション設定については、一見問題ないように思える?)

/var/log/nginx/*log {
    create 0644 nginx nginx
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

他に助けを求められる場所はないか

以下の3つを検討しました。

1. AWSのサポートプランをビジネスにする

サポートプランをアップグレードにすることに対する見返りとして、

  • 必ずしも、それで解決できるとは限らない(ベストエフォート)点や、
  • 実際に環境にログインして修正まで行なってもらえる訳ではない点

などから、こちらの選択肢は却下となりました。

関連記事)AWSの有料サポートプランについてまとめ

2. Nginxのサポートに加入する

こちらも、費用に対する見返りとして、

  • 必ずしも、それで解決できるとは限らない点と
  • 現状で英語でしか問い合わせできない(日本語対応準備中とのことです)

などの理由で、こちらも却下となりました。

参考)https://www.nginx.co.jp/support/

3. teratailなど、他のコミュニティサイトで意見を求める

明確な回答は無かったのですが、
こちらに、手掛かりのようなものがあったように思います。

対応方法

私の環境の場合、以下の修正でログがローテーションされた後も
引き続きログが書き出されるようになりました!

/var/log/nginx/*log {
    create 0644 nginx nginx
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
-       /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
+       /usr/sbin/nginx -s reload 2>/dev/null || true
    endscript
}

どちらの記述も、Nginxの設定ファイルを読み込み直す動作のようだ
といったところまでは調査できたのですが、明確な違いについては分からず…

参考)https://nginx.org/en/docs/switches.html

動いたので、一旦はこれで良しとします。