Skip to content

Apacheのタイムアウトログ(408)にLogwatchが反応する件

Posted in CentOS7

Apacheのアクセスログに408番のタイムアウトエラーが残り、Logwatchに以下のような警告が出る際の原因と対処法です。

※IPアドレスは適当です。

Apacheの生のログだとこんな感じです。

接続は確立されてはいますが、実際のリクエストは来ないままタイムアウトしています。
悪意あるものではないようなのですが、実に気持ち悪い。

この問題についてググるとELB<->httpd間の通信の問題ばかりヒットするんですよね。
違う、そうじゃない!一般のクライアントとの通信でこいつ(”-” 408 – “-” “-“)が出るんや!!
そんな方はもしかしたら私と同じ問題かも知れません。

早速調査。するとChromeでは発生し、Safariでは発生しないことに気が付きました。
ブラウザが悪さしている・・・?ということで探ってみると、どうやらChromeには予測サービスという機能がついていて、サイトにアクセスした際に予めコネクションだけ確保しておき、必要になった時に即座にリクエストを送れるようにしているらしい。
メモリは食うけど速い!と評判なだけあって、こういう細かな工夫が沢山あるのでしょうね。
(賛否ありそうですが・・・)

Chromeの設定 -> 詳細設定を表示 -> 予測サービスを使用してページをより迅速に読み込むから該当機能を無効にしてみると、例の
255.255.255.255 – – [15/Jun/2016:13:59:34 +0900] “-” 408 – “-” “-”
のログは出力されなくなりました。

なるほど!ということで、CustomLogをいじってアクセスログの中にタイムアウトエラーを出力しないよう設定したかったのですが、レスポンスコードで振り分けるのはどうやら無理っぽい。
公式を見てみたら、SetEnvIfディレクティブで参照できるのはリクエスト情報のみということでした。

仕方ないのでLogwatchのレポート対象から外してしてしまいましょう。
(後からから考えてみたら、生のログにはきちんと残してLogwatchで除外するこの方法のほうが健全ですね)

Logwatchは/etc/logwatch/conf/services/以下に配置した設定ファイルを読み込んでくれます。
デフォルトの設定は/usr/share/logwatch/default.conf/services/に保存されているので、そこからコピーしてきて編集といった流れが上の内容です。

ここで$HTTP_IGNORE_URLSにnullを設定していますが、「要求されたURLが無い場合そのログは無視する」といった意味になります。
これで該当ログは見ないでくれますね!

一つ問題があるとすればコネクションだけバンバン貼るDDoSが来ていた場合Logwatchではレポートされなくなります。
しかしLogwatchが実行される時点でDDoS見つけても・・・という感じなのでこれは良しとしましょう。。

ひとつ気持ち悪い点が無くなってすっきりです。

Comments are closed.