6月 232010
以前書いた記事(VarnishでESIを使うときの注意するべき点)で
Keep-AliveはOFFにするべき
ESI使用時はcontent-lengthがブラウザ側に返却されないようなのでOFFはほぼ必須です
どうしても使いたい場合はESIを使用するときのみkeep-aliveをOFFに・・・
と
直Varnishはやめた方がいい
Keep-aliveをオフにしても特定のクライアント(ab/wgetなど)で接続が維持されて5秒ほど待ってしまうことがあります
つまりKeep-Aliveが有効かつcontent-lengthがないときの挙動と同じになります
じゃぁどうすればいいか?
自分はフロントにNginxを置いてそこからVarnishにproxyしています
と書きましたがどうやら2.1.X系では改善されたようです
ということで比較してみます
VCLの設定は両バージョンともこのような感じです
backend default { .host = "127.0.0.1"; .port = "80"; } sub vcl_fetch{ esi; }
単純にESIをやろうとしてるだけですね
ファイルの中身は以下のとおりです
[root@LIP-APP-03 html]# cat esi.html <esi:include src="/a.html" /> <esi:include src="/b.html" /> [root@LIP-APP-03 html]# cat a.html aaaaaaaaaaaaaaaaaaaaaaaaaaa [root@LIP-APP-03 html]# cat b.html bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
2.0.6の場合
[root@LIP-APP-03 html]# time wget -d http://localhost:6081/esi.html -O - Setting --output-document (outputdocument) to - DEBUG output created by Wget 1.11.4 Red Hat modified on linux-gnu. --2010-06-23 00:43:54-- http://localhost:6081/esi.html localhost をDNSに問いあわせています... 127.0.0.1 Caching localhost => 127.0.0.1 localhost|127.0.0.1|:6081 に接続しています... 接続しました。 Created socket 3. Releasing 0x00000000159d1c20 (new refcount 1). ---request begin--- GET /esi.html HTTP/1.0 User-Agent: Wget/1.11.4 Red Hat modified Accept: */* Host: localhost:6081 Connection: Keep-Alive ---request end--- HTTP による接続要求を送信しました、応答を待っています... ---response begin--- HTTP/1.1 200 OK Server: Apache/2.2.3 (CentOS) Last-Modified: Tue, 22 Jun 2010 15:11:30 GMT ETag: "630414-3d-4899fd6006c80" Content-Type: text/html; charset=UTF-8 Date: Tue, 22 Jun 2010 15:43:54 GMT X-Varnish: 1443753876 Age: 0 Via: 1.1 varnish Connection: keep-alive ---response end--- 200 OK 長さ: 特定できません [text/html] `STDOUT' に保存中 [<=> ] 0 --.-K/s aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb [ <=> ] 62 --.-K/s 時間 4.8s Closed fd 3 2010-06-23 00:43:59 (13.0 B/s) - `-' へ保存終了 [62] real 0m5.048s user 0m0.000s sys 0m0.000s
Connection: keep-aliveなのにcontent-lengthがないためタイムアウトを待ってしまって大変遅いです。
ちなみに
sub vcl_deliver{ set resp.http.Connection="close"; }
といった記述をVCLに追加したとしても一部クライアントではやっぱりタイムアウトを待ちます
2.1.2の場合
[root@LIP-APP-02 html]# time wget -d http://localhost:6081/esi.html -O - Setting --output-document (outputdocument) to - DEBUG output created by Wget 1.11.4 Red Hat modified on linux-gnu. --2010-06-23 00:44:56-- http://localhost:6081/esi.html localhost をDNSに問いあわせています... 127.0.0.1 Caching localhost => 127.0.0.1 localhost|127.0.0.1|:6081 に接続しています... 接続しました。 Created socket 3. Releasing 0x000000001cefcc20 (new refcount 1). ---request begin--- GET /esi.html HTTP/1.0 User-Agent: Wget/1.11.4 Red Hat modified Accept: */* Host: localhost:6081 Connection: Keep-Alive ---request end--- HTTP による接続要求を送信しました、応答を待っています... ---response begin--- HTTP/1.1 200 OK Server: Apache/2.2.3 (CentOS) Last-Modified: Tue, 22 Jun 2010 15:21:01 GMT ETag: "858400-65-4899ff8093140" Content-Type: text/html; charset=UTF-8 Date: Tue, 22 Jun 2010 15:44:56 GMT X-Varnish: 30445554 Age: 0 Via: 1.1 varnish Connection: close ---response end--- 200 OK 長さ: 特定できません [text/html] `STDOUT' に保存中 [<=> ] 0 --.-K/s aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 00:44:56 [ <=> ] 72 --.-K/s 時間 0.005s Closed fd 3 2010-06-23 00:44:56 (14.3 KB/s) - `-' へ保存終了 [72] real 0m0.010s user 0m0.000s sys 0m0.004s
Connection: closeに変わっています(つまりkeep-aliveではない)
もちろんesiの記述がないファイルについてはkeep-aliveが有効となっているので
content-lengthを返却できないケース(つまりESI)ではcloseするようになったみたいです。
これでやっと使いやすくなったなーと個人的には思っています。
[…] This post was mentioned on Twitter by RtestR, \いわなちゃん/. \いわなちゃん/ said: [blog] Varnish2.1.2でESIが使い易くなっていた件について(Varnish2.0.6と比較して) http://bit.ly/bHGEOw #varnish #varnishjp […]