KeepAliveを使ってみましょう
nginx でKeepAlive関連ディレクティブは、以下のとおりです。下記のディレクティブを設定することでKeepAlive機能を制御します。
- keepalive_timeout
HTTP の持続的な接続で次のリクエストが来るまでサーバが待つ時間(秒)を設定します。
keepalive_timeout = 0 の時は、KeepAlive無効となります。(デフォルト : 75 秒)
(Apache のKeepAliveTimeout に相当します。)
- keepalive_requests
keepalive_timeout > 0 の時に有効で、持続的な接続上で許可されるリクエストの数を設定します。(デフォルト : 100)
(Apache のMaxKeepAliveRequests に相当します。)
Apacheでは、KeepAlive ディレクティブにて On/Off を切り替えていましたが、
nginxでは、KeepAliveのOn/Offは、keepalive_timeout = 0 でOffへ設定するようになっています。
デフォルトの設定は、以下のようになっています。
keepalive_requests 100;
keepalive_timeout 75;
|
上記の設定を簡単に解説すると
クライアントから要求がきたら、同じクライアントからの再要求を75秒待ちます。また、同じクライアントからの要求が100件を超えたら、待つのを止めます。(KeepAlive中の同じ接続で、100件までの要求を処理するということになります。)
一般的な設定で、1ページの必要なリンク先(画像やCSSなど)が、概ね100個を超えないということと、遅くとも75秒以内には、再要求がくるだろう・・・という前提条件のもとの設定です。
Apacheのデフォルト値では、15秒の設定だったので、nginx側のデフォルト値は ちょっと長い気もしますね。
KeepAlive機能を使うときの注意点
もちろん、良いことばかりではありません。特にページビューが激しいサイトや使えるリソースが少ないレンタルサーバーには、気をつけなければなりません。
上記の設定でいうと、最長で75秒間は、待ってしまうわけです。(このデフォルト値は、ちょっと長いかなと思います。)
これは、その待ち時間の間は他の処理をしないプロセス(スレッド)がある・・・ということでもあります。
潤沢なリソースがあれば別ですが、一般的には、来るかどうかわからない要求を待つことが、本当にメリットがあるか検討する必要があります。
結局、この待ちの間は、使えるプロセス(あるいはスレッド)が1つ減ることに違いがないわけですから、待っている間に、他の要求が来れば、プロセス(あるいはスレッド)が不足することもあり得ます。
KeepAliveは、諸刃の剣で、
待っている時間が短くて再要求が来る場合には、それなりに有効です。
逆に、待っている時間が長く再要求が来ない場合には、それなりにリソースが無駄に使用されるということです。
そこで、個人的には、KeepAliveをOffにしてしまうか、以下のようなギリギリの設定しています。
keepalive_requests 100;
keepalive_timeout 5;
|
keepalive_timeoutは、国内のみをターゲットにした場合、せいぜい連続的に要求が来るなら 5秒から10秒で十分だと思います。
keepalive_requests は、サイト1ページを表示するために必要なファイル数に相当しますから、各サイトに依存します。
HTMLのページ1に対して、画像が40個、CSSが3個、Javaが3個 程度なら、概ね 50 個の要求で事足りることになります。ある程度余裕をもって、ここでは100を設定しています。
参考までに、このサイトでも、100ぐらいの要求数になります。見た目的には、それほど使っていないように見えますが、結構、小さな画像が多く、要求数も普通のサイト並になっています。
KeepAliveを使った時のヘッダ情報(おまけ)
KeepAliveを使った時は、HTTPのヘッダ情報に変化があります。
以下は、Wordpressのページと読み込んだ時の それぞれのnginxから送られてきたHTTPのヘッダ情報、リクエスト毎の経過時間です。
上記は、無負荷状態でテスト環境でもあったので、それほどの差異がなかったようです。
経過時間の和は、
KeepAlive あり = 0.371
KeepAlive なし = 0.497
で多少の差があります。負荷が高ければ、もっと差が出たと思いますし、
上記はサンプルページで javaスクリプト x 2, css x 1, png x 1 とHTML以外に 4 ファイルだけでしたので、差も微妙な差となっています。
一般的なページであれば1ページあたり画像ファイル5、CSSファイル1、Javaスクリプトファイル2程度はありますから、もっと差は出てくるかなぁと思います。
ここから、自分のページがどれくらいか、ある程度、想像できるかもしれませんね。
また、最近では、事細かに要求をロギングしてくれるものがブラウザの機能、あるいはプラグイン(上記は、 FireFox + HttpFox で情報採取しました)で提供されていますので、それを使って正確な要求数を確認されると良いでしょう。
先にも記述しましたが、KeepAlive は、諸刃の刃で、しかも、それほど劇的な表示速度の改善が望めるというものでもありません。
KeepAlive をOffにしておいても、再接続でページの表示はできます。再接続にかかる時間は、せいぜい 100 – 200 ms 程度です。
ただ、負荷が高い時は、再接続できない可能性もあり、それなりの表示速度が期待できるという面も無きにしも非ずです。(必ず期待できるということではありませんが、期待はできます)
特に、nginxのデフォルト値(75秒)は、ちょっと長すぎるので、動画サイトなどの特別なサイトを除き、再設定することをおすすめします。
2015年10月12日, 7:26 PM
KeepAliveを使った時のヘッダ情報の KeepAlive の有り無しが逆では?
2015年11月17日, 4:14 PM
鉄ちゃん さん
コメントありがとうございます、管理人です。
おっしゃるとおり間違っていましたので、経過時間も含めて、再確認し記事の更新をしました。
ありがとうございました。