VarnishCache3 <3
    2011/06/18
  いわなちゃん(@xcir)
自己紹介
●   いわなちゃん(@xcir)
●
    携帯向けサイトやソーシャルゲームな会社で
    VarnishやらC#やらPHPやったり
●   Smalllightを最近触ってます
●
    六本木にいます
●
    自炊派なのでクックパッドさんの
    キッチンが羨ましくて困ります



      絡んでくれると喜びます!
VarnishCache3
    リリースおめでとうございます
●
    いろんな新機能が増えましたね
    ●   ESIでのgzipのサポート
    ●   よりスマートな拡張(VMOD)
    ●
        デフォルトパラメータがよくなった
    ●   varnishncsaでカスタムログ形式が使える!
    ●
        ログ系コマンドで正規表現を利用した絞り込み
    ●   vcl_init,vcl_finiの追加
    ●   Rangeリクエストのデフォルト有効
    ●
        ストリームサポート
    ●
        特定のストレージにオブジェクトを格納できる
    ●   Etc...
ESIでのgzipサポート
●   3.0以前ではgzipのオブジェクトを解凍できな
    かった
    ●   つまりESIのように合成を行う場合はすべての要素
        が
        圧縮されていない必要があった
●   3.0以降ではgzip圧縮/解凍ができる
    ●   要素がgzipされていても解釈できる
    ●   格納時にgzip圧縮が可能
        –   なおESIだけのgzip対応ではないので他にも応用できます
        –   例えば今まではgzipしてるのとされていないのでそれぞ
            れキャッシュしてましたがそれが一つですみます
ESIでのgzipサポート
●
    ただ効率的に使用するには
    要素は圧縮されていないのが望ましいです
     ●
          要素が圧縮されてる場合
            –   解凍→ESIコード解釈→その後の処理
     ●
          要素が圧縮されてない場合
            –   ESIコード解釈→その後の処理


    参考VCL
    sub vcl_miss {
         if (ESI処理を必要とするオブジェクト) {
                unset bereq.http.accept-encoding;
         }
    }

    sub vcl_fetch {
         if (ESI処理を必要とするオブジェクト) {
                 set beresp.do_esi = true;
               set beresp.do_gzip = true;
         }
    }
よりスマートな拡張(VMOD)




        @hmskさんが
詳しく説明してくれると思いますので飛ばしま
           す!
デフォルトパラメータが良くなった
●
    パフォーマンスがよくなるように設定されてい
    ます
●
    すでに色々調整されている方はあまり関係ない
    かもしれません
●   面白いのがcc_commandが変わりました
    ●   exec cc -fpic -shared -Wl,-x -o %o %s (3.0以前)
    ●   exec $PTHREAD_CC $OCFLAGS $PTHREAD_CFLAGS -fpic
        -shared -Wl,-x -o %o %s (3.0)
    ●   ここのコマンドはVCLのコンパイルに利用されるので色々調整す
        ると高負荷時に少し変わってきます
varnishncsaでカスタムログが使える!
●   -Fオプションでカスタムログが指定できるよう
    になりました
    ●   varnishncsa -F "%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i"

●   ・・・が%{XX}iで指定できるヘッダが限られて
    います
    ●   Referer,Host,X-Forwarded-For,User-agent
●   他にも%Dや%Tなどが使えないためApacheの記述そ
    のままとはいきませんのでちょっと注意が必要です
ログ系コマンドで
            正規表現を利用した絞り込み
●   Varnishlog/ncsa/hist/sizesで利用可能です
●
    トランザクション中でマッチするものがあれば出力します
    ●  Varnishlogの場合一致した行だけではなく
       そのトランザクション全部出力します
●   -m Tag:Regexの形式です
    ●   varnishlog -m "TxHeader:X-Cache: HIT"
        –   この場合ヒットしたオブジェクトのログを出力します
ログ系コマンドで
正規表現を利用した絞り込み
vcl_init,vcl_finiの追加
●   VCLがロードされたときにvcl_init
●   VCLがアンロードされたときにvcl_fini
●   β2で確認した呼び出されるパタンです
    ●
        ただ正式版でいくつか見たところ変わらずぽいです
Rangeリクエストのデフォルト有効
●   Rangeリクエストがデフォルトで有効になりま
    した
    (僕のような)携帯で動画を扱うサイトは嬉しいと思い
●




    ます
ストリームサポート
                                   ストリームOFF

       1                  2
            Varnish           バックエンド
        5                 3
                      4


1. ユーザからリクエスト
2. キャッシュがないのでバックエンドに問い合わせ
3. バックエンドがVarnishにレスポンス
4. バックエンドからのレスポンスを受けきるまで待つ
5. ユーザにレスポンス
ストリームサポート
                                ストリームON

       1               2
             Varnish       バックエンド
        3’             3




1. ユーザからリクエスト
2. キャッシュがないのでバックエンドに問い合わせ
3. バックエンドがVarnishにレスポンス
3'. バックエンドからのレスポンスを
   順次ユーザにレスポンス
ストリームサポート

            ストリームOFF




            ストリームON
ストリームサポート
                制限事項
●
    同一ファイルを同時にストリームはできません
    ●
        後続のストリームは保留されます
特定のストレージにオブジェクトを格納できる

●
    まず起動時にストレージの名前が指定できるよ
    うになりました
    ●   -s [ユニーク名=]ストレージタイプ[,opt]
         –   -s filestorage=file,/tmp/0,1G
         –   -s persistentstorage=persistent,/tmp/1,1G
         –   -s memorystorage=malloc,1G
●
    そして付けた名前を利用してどこに格納するか
    指定できます
    ●   set beresp.storage="persistentstorage";
その他の変更点
●   CLI接続してstatsができなくなりました
●   VCLのチェックが厳密になりました
    ●   同じ名前のbackendがある
    ●   Backend内のprobeのキーが重複
    ●   同じ名前のACL
    ●   ↑どれもVCLコンパイルの時に弾かれます
●   VCLのUnusedエラーを無視する起動オプション追加
    ●   -p vcc_err_unref=off
    ●   backendの定義はあるけど参照していない場合でも警告だけ
        でエラーは出ない
こんなにかわった3.0!




Let's enjoy Varnish Cache3.0!!
ちょっとまって!
パラメータの削除があるよ
起動パラメータの互換がない変更点
                          2.1→3.0

●
    削除された物
    ●   cache_vbe_conns
    ●   err_ttl
    ●   purge_dups
●
    名前が変わった物
    ●   http_headers → http_max_hdr
    ●   max_esi_includes → max_esi_depth
    ●   overflow_max → que_max
ちょっとまって!
結構VCL記述変わってるよ
VCL記述の変更点
                    2.1→3.0

●   (obj | beresp).cacheableの廃止
●   ESIを使うときの指定方法
●   vcl_fetchでのreturn(pass)が変更
●   req.hash += value;の記述変更
●
    文字列の結合の仕方が変わった(!)
●   LogメソッドがVMODに移動したよ
●   purge()がban()になったよ
●
    文字列中の%エスケープがなくなったよ
●   (obj | beresp).cacheableの廃止
●   Obj.cacheableとberesp.cacheableはなくなりました
●
    キャッシュするかどうかは以下のパラメータから判断
    ●   beresp.ttl
         – キャッシュ時間
    ●   beresp.grace
         – キャッシュが切れたときの猶予期間
ESIを使うときの指定方法
                     3.0以前                                            3.0以降

sub vcl_fetch {                                   sub vcl_fetch {
    if (req.url == "/test.html") {                    if (req.url == "/test.html") {
        esi;                                              set beresp.do_esi = true;
        set obj.ttl = 24 h;                               set obj.ttl = 24 h;
    } elseif (req.url == "/cgi-bin/date.cgi") {       } elseif (req.url == "/cgi-bin/date.cgi") {
        set obj.ttl = 1m;                                 set obj.ttl = 1m;
    }                                                 }
}                                                 }
vcl_fetchでのreturn(pass)が変更
                  3.0以前                     3.0以降

sub vcl_fetch {           sub vcl_fetch {
return(pass);             return(hit_for_pass);
}                         }




           vcl_fetchだけで他の箇所は変更ありません
req.hash += value;の記述変更
           3.0以前                3.0以降

req.hash += value;   hash_data(value);
文字列の結合の仕方が変わった
          (!)
           3.0以前              3.0以降

req.url"AAA"       req.url+"AAA"




          +演算子で結合するようになりました
LogメソッドがVMODに移動したよ
                3.0以前                      3.0以降

sub vcl_recv{              import std;
log req.url;               sub vcl_recv{
}                          std.log(req.url);
                           }




               logメソッドはvmod_stdに移動しました
purge()がban()になったよ
                3.0以前                                      3.0以降

purge("req.http.host == " req.http.host    ban("req.http.host == " + req.http.host +
              "&& req.url == " req.url);                 "&& req.url == "+ req.url);
文字列中の%エスケープがなくなった
           よ
               3.0以前                                  3.0以降
入力                                       入力
log "AAABBB:%67%67%67%67%67%67%67%67";   std.log("AAABBB:
                                         %67%67%67%67%67%67%67%67");
出力
                                         出力
13 VCL_Log   c AAABBB:gggggggg
                                         12 VCL_Log c AAABBB:
                                         %67%67%67%67%67%67%67%67
参考程度に2.0→2.1
        のアップデート方法
●
    2.0→3.0に上げるときは両方やれば問題ないで
    す
起動パラメータの互換がない変更点
                        2.0→2.1(参考)

●
    削除された物
    ●   accept_fd_holdoff
    ●   acceptor
    ●   backend_http11
    ●   client_http11
    ●   obj_workspace
    ●   purge_hash
    ●   srcaddr_hash
    ●   srcaddr_ttl
VCL記述の変更点
                                          2.0→2.1(参考)

    ●    vcl_fetchでobj.*が使えなくなりました
          ●   beresp.*に置換してください

    ●
         サブルーチン内でのアクションの取り扱い

                     2.1以前                                                     2.1以降

sub vcl_recv {                                       sub vcl_recv {

    if (req.request == "GET" && req.http.cookie) {       if (req.request == "GET" && req.http.cookie) {

        lookup;                                              return(lookup);

    }                                                    }
}                                                    }
あらためて



Let's enjoy Varnish Cache3.0!!

  ありがとうございました

tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)

  • 1.
    VarnishCache3 <3 2011/06/18 いわなちゃん(@xcir)
  • 2.
    自己紹介 ● いわなちゃん(@xcir) ● 携帯向けサイトやソーシャルゲームな会社で VarnishやらC#やらPHPやったり ● Smalllightを最近触ってます ● 六本木にいます ● 自炊派なのでクックパッドさんの キッチンが羨ましくて困ります 絡んでくれると喜びます!
  • 3.
    VarnishCache3 リリースおめでとうございます ● いろんな新機能が増えましたね ● ESIでのgzipのサポート ● よりスマートな拡張(VMOD) ● デフォルトパラメータがよくなった ● varnishncsaでカスタムログ形式が使える! ● ログ系コマンドで正規表現を利用した絞り込み ● vcl_init,vcl_finiの追加 ● Rangeリクエストのデフォルト有効 ● ストリームサポート ● 特定のストレージにオブジェクトを格納できる ● Etc...
  • 4.
    ESIでのgzipサポート ● 3.0以前ではgzipのオブジェクトを解凍できな かった ● つまりESIのように合成を行う場合はすべての要素 が 圧縮されていない必要があった ● 3.0以降ではgzip圧縮/解凍ができる ● 要素がgzipされていても解釈できる ● 格納時にgzip圧縮が可能 – なおESIだけのgzip対応ではないので他にも応用できます – 例えば今まではgzipしてるのとされていないのでそれぞ れキャッシュしてましたがそれが一つですみます
  • 6.
    ESIでのgzipサポート ● ただ効率的に使用するには 要素は圧縮されていないのが望ましいです ● 要素が圧縮されてる場合 – 解凍→ESIコード解釈→その後の処理 ● 要素が圧縮されてない場合 – ESIコード解釈→その後の処理 参考VCL sub vcl_miss { if (ESI処理を必要とするオブジェクト) { unset bereq.http.accept-encoding; } } sub vcl_fetch { if (ESI処理を必要とするオブジェクト) { set beresp.do_esi = true; set beresp.do_gzip = true; } }
  • 7.
    よりスマートな拡張(VMOD) @hmskさんが 詳しく説明してくれると思いますので飛ばしま す!
  • 8.
    デフォルトパラメータが良くなった ● パフォーマンスがよくなるように設定されてい ます ● すでに色々調整されている方はあまり関係ない かもしれません ● 面白いのがcc_commandが変わりました ● exec cc -fpic -shared -Wl,-x -o %o %s (3.0以前) ● exec $PTHREAD_CC $OCFLAGS $PTHREAD_CFLAGS -fpic -shared -Wl,-x -o %o %s (3.0) ● ここのコマンドはVCLのコンパイルに利用されるので色々調整す ると高負荷時に少し変わってきます
  • 9.
    varnishncsaでカスタムログが使える! ● -Fオプションでカスタムログが指定できるよう になりました ● varnishncsa -F "%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i" ● ・・・が%{XX}iで指定できるヘッダが限られて います ● Referer,Host,X-Forwarded-For,User-agent ● 他にも%Dや%Tなどが使えないためApacheの記述そ のままとはいきませんのでちょっと注意が必要です
  • 10.
    ログ系コマンドで 正規表現を利用した絞り込み ● Varnishlog/ncsa/hist/sizesで利用可能です ● トランザクション中でマッチするものがあれば出力します ● Varnishlogの場合一致した行だけではなく そのトランザクション全部出力します ● -m Tag:Regexの形式です ● varnishlog -m "TxHeader:X-Cache: HIT" – この場合ヒットしたオブジェクトのログを出力します
  • 11.
  • 12.
    vcl_init,vcl_finiの追加 ● VCLがロードされたときにvcl_init ● VCLがアンロードされたときにvcl_fini ● β2で確認した呼び出されるパタンです ● ただ正式版でいくつか見たところ変わらずぽいです
  • 13.
    Rangeリクエストのデフォルト有効 ● Rangeリクエストがデフォルトで有効になりま した (僕のような)携帯で動画を扱うサイトは嬉しいと思い ● ます
  • 14.
    ストリームサポート ストリームOFF 1 2 Varnish バックエンド 5 3 4 1. ユーザからリクエスト 2. キャッシュがないのでバックエンドに問い合わせ 3. バックエンドがVarnishにレスポンス 4. バックエンドからのレスポンスを受けきるまで待つ 5. ユーザにレスポンス
  • 15.
    ストリームサポート ストリームON 1 2 Varnish バックエンド 3’ 3 1. ユーザからリクエスト 2. キャッシュがないのでバックエンドに問い合わせ 3. バックエンドがVarnishにレスポンス 3'. バックエンドからのレスポンスを    順次ユーザにレスポンス
  • 16.
    ストリームサポート ストリームOFF ストリームON
  • 17.
    ストリームサポート 制限事項 ● 同一ファイルを同時にストリームはできません ● 後続のストリームは保留されます
  • 18.
    特定のストレージにオブジェクトを格納できる ● まず起動時にストレージの名前が指定できるよ うになりました ● -s [ユニーク名=]ストレージタイプ[,opt] – -s filestorage=file,/tmp/0,1G – -s persistentstorage=persistent,/tmp/1,1G – -s memorystorage=malloc,1G ● そして付けた名前を利用してどこに格納するか 指定できます ● set beresp.storage="persistentstorage";
  • 19.
    その他の変更点 ● CLI接続してstatsができなくなりました ● VCLのチェックが厳密になりました ● 同じ名前のbackendがある ● Backend内のprobeのキーが重複 ● 同じ名前のACL ● ↑どれもVCLコンパイルの時に弾かれます ● VCLのUnusedエラーを無視する起動オプション追加 ● -p vcc_err_unref=off ● backendの定義はあるけど参照していない場合でも警告だけ でエラーは出ない
  • 20.
  • 21.
  • 22.
    起動パラメータの互換がない変更点 2.1→3.0 ● 削除された物 ● cache_vbe_conns ● err_ttl ● purge_dups ● 名前が変わった物 ● http_headers → http_max_hdr ● max_esi_includes → max_esi_depth ● overflow_max → que_max
  • 23.
  • 24.
    VCL記述の変更点 2.1→3.0 ● (obj | beresp).cacheableの廃止 ● ESIを使うときの指定方法 ● vcl_fetchでのreturn(pass)が変更 ● req.hash += value;の記述変更 ● 文字列の結合の仕方が変わった(!) ● LogメソッドがVMODに移動したよ ● purge()がban()になったよ ● 文字列中の%エスケープがなくなったよ
  • 25.
    (obj | beresp).cacheableの廃止 ● Obj.cacheableとberesp.cacheableはなくなりました ● キャッシュするかどうかは以下のパラメータから判断 ● beresp.ttl – キャッシュ時間 ● beresp.grace – キャッシュが切れたときの猶予期間
  • 26.
    ESIを使うときの指定方法 3.0以前 3.0以降 sub vcl_fetch { sub vcl_fetch { if (req.url == "/test.html") { if (req.url == "/test.html") { esi; set beresp.do_esi = true; set obj.ttl = 24 h; set obj.ttl = 24 h; } elseif (req.url == "/cgi-bin/date.cgi") { } elseif (req.url == "/cgi-bin/date.cgi") { set obj.ttl = 1m; set obj.ttl = 1m; } } } }
  • 27.
    vcl_fetchでのreturn(pass)が変更 3.0以前 3.0以降 sub vcl_fetch { sub vcl_fetch { return(pass); return(hit_for_pass); } } vcl_fetchだけで他の箇所は変更ありません
  • 28.
    req.hash += value;の記述変更 3.0以前 3.0以降 req.hash += value; hash_data(value);
  • 29.
    文字列の結合の仕方が変わった (!) 3.0以前 3.0以降 req.url"AAA" req.url+"AAA" +演算子で結合するようになりました
  • 30.
    LogメソッドがVMODに移動したよ 3.0以前 3.0以降 sub vcl_recv{ import std; log req.url; sub vcl_recv{ } std.log(req.url); } logメソッドはvmod_stdに移動しました
  • 31.
    purge()がban()になったよ 3.0以前 3.0以降 purge("req.http.host == " req.http.host ban("req.http.host == " + req.http.host + "&& req.url == " req.url); "&& req.url == "+ req.url);
  • 32.
    文字列中の%エスケープがなくなった よ 3.0以前 3.0以降 入力 入力 log "AAABBB:%67%67%67%67%67%67%67%67"; std.log("AAABBB: %67%67%67%67%67%67%67%67"); 出力 出力 13 VCL_Log c AAABBB:gggggggg 12 VCL_Log c AAABBB: %67%67%67%67%67%67%67%67
  • 33.
    参考程度に2.0→2.1 のアップデート方法 ● 2.0→3.0に上げるときは両方やれば問題ないで す
  • 34.
    起動パラメータの互換がない変更点 2.0→2.1(参考) ● 削除された物 ● accept_fd_holdoff ● acceptor ● backend_http11 ● client_http11 ● obj_workspace ● purge_hash ● srcaddr_hash ● srcaddr_ttl
  • 35.
    VCL記述の変更点 2.0→2.1(参考) ● vcl_fetchでobj.*が使えなくなりました ● beresp.*に置換してください ● サブルーチン内でのアクションの取り扱い 2.1以前 2.1以降 sub vcl_recv { sub vcl_recv { if (req.request == "GET" && req.http.cookie) { if (req.request == "GET" && req.http.cookie) { lookup; return(lookup); } } } }
  • 36.
    あらためて Let's enjoy VarnishCache3.0!! ありがとうございました