nginxがunicornに接続できなくなったのでログローテーション設定の見直しをした。

発生したnginxのエラー

プライベートで運営しているメディアのnginxで
以下のエラーが発生し、unicornに接続できなくなりました。

[error] 13645#0: *624 connect() to unix:/tmp/unicorn.sock failed (111: Connection refused) while connecting to upstream

原因はRailsアプリのログローテーション設定の不備

Railsアプリのログのローテート設定に問題があったことにより、
ログのサイズが肥大化し、EBSのディスク使用率が100%になっていました。

当時のログローテーションの設定

/etc/logrotate.d/railsの設定を確認したところ、以下のようになっていました。
RailsのLoggerではローテートの設定をしていません)

# /etc/logrotate.d/rails

# ローテーション間隔: 1週間
weekly 

# 保持世代数: 4
rotate 4

# ローテートしたログは圧縮する
compress

# 必要な箇所だけ抜粋

この設定で問題だったのは、ローテーション間隔が1週間と長すぎたせいで
ローテートする直前のログファイル(1週間分)が肥大化しすぎていたことでした。
ログファイルのgzip圧縮後のサイズが250MB程度だったのに対し、
ローテートされる直前の圧縮されていないログファイルのサイズは4GBを超えていました。

ディスク使用率の推移イメージ(ローテート設定変更前)

f:id:manchose:20161002202620j:plain

上の図はディスク使用率の推移イメージですが、
このように圧縮前のログファイルが大きくなりすぎてオレンジ色の点でディスク使用率が100%になってしまったのです。

これだとdisk使用率の増減が大きすぎるため、ログローテートの設定を変更しました

変更後のログローテーションの設定

以下のようにローテーション設定を変更しました。

  • ローテート間隔を1日にした
  • 保持世代数を14にした
# /etc/logrotate.d/rails

# ローテーション間隔: 1日
daily

# 保持世代数: 14
rotate 14

# ローテートしたログは圧縮する
compress

# 必要な箇所だけ抜粋

これによりローテート直前の未圧縮状態のログファイルサイズが500MB程度に収まり、disk使用率の増減が少なくなったため、
下のグラフのようにdiskの空き容量に常に余裕ができるようになりました。

ディスク使用率の推移イメージ(ローテート設定変更後)

f:id:manchose:20161002203654j:plain

また、同時に4週間保持していたログファイルを2週間保持に変更しました。 今回はRailsアプリのログが問題になりましたが、nginxなどの他のミドルウェアでも同様の問題が起こりうるので一度見直そうと思います。

今回は以上です!