2015.6.12
2020.1.7

KeepAlive、ログ出力対象の設定

レンタルサーバを契約してWebサイトを構築した時に、ブラウザからサイトにアクセスすると、サイト上の画像がいくつか表示されない事象が発生したことがありました。(すべて表示されたり、すべて表示されなかったり、ウィンドウ枠内だけ表示されたりとバラバラ)

AngularJSや画像の遅延読み込みを利用していたので、その辺りの処理がうまくいっていないかと散々悩んで試した結果、問題はApacheの設定であることにようやく気付きました。

それがKeepAliveの設定で、ここではついでにログ出力対象の設定も含めてメモしておきます。

バージョン)
 Apache 2.2

詳細

◆ KeepAliveの設定

Apacheの設定ファイル(/etc/httpd/conf/httpd.conf)に以下の設定があります。


#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 10

レンタルサーバ(VPSタイプ)を契約した直後、5行目のKeepAliveの設定が「Off」に設定されていました。これが問題で、「Off」に設定されていると、アクセスされたページの外部スクリプトや画像をサーバから取得する際にコネクションが別になってしまい、サーバに負荷がかかって(または接続数オーバー?)画像がすべて表示されない、といった事象が発生していました。

原因を一緒に探してくれた知人に聞いたところ、KeepAlive「On」は当たり前とのこと。

12,18行目はアクセス数とサーバの負荷を考慮して適切な値を設定。

◆ ログ出力対象の設定

KeepAliveと同様、Apacheの設定ファイル(/etc/httpd/conf/httpd.conf)に以下の設定があります。


#
# For a single logfile with access, agent, and referer information
# (Combined Logfile Format), use the following directive:
#
CustomLog /var/log/httpd/access_log combined

上記の設定がデフォルトで、このままだと外部スクリプトファイルや画像ファイルが読み込まれた際にもログに出力されてしまいます。(アクセスされたページに画像が10個使われていれば10個分のログが出力される。)通常はアクセスのあったページのみログに出力されればいいので、以下のように変更します。


SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)$" nolog
CustomLog /var/log/httpd/access_log combined env=!nolog

ついでに出力されるログファイルに日付を付加して、1日単位でローテーションするように変更します。


SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)$" nolog
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y%m%d 86400" combined env=!nolog

86400(秒) = 24(時間) × 60(分) × 60(秒)

参考リンク

Apache】関連記事