SlideShare a Scribd company logo
1 of 35
Download to read offline
Varnish Cache
  ことはじめ

    2012/07/20
    技術統括部
  いわなちゃん(@xcir)
Varnishの特徴
●   コンテンツのキャッシュ
●   Cライクなドメイン言語VCLによる柔軟な制御
●   むしろVCL中にC言語が書ける(インラインC)
●   高速なリバースプロキシ
●   フラグメントキャッシュなESIへの対応
●   ロードバランシングとヘルスチェックが可能
●   gzipの圧縮解凍が可能

    うちでは主に静的コンテツに使ってます
とまぁ細かい点は




           僕のブログにある
VarnishCache入門をご覧ください(ステマ)
          http://blog.xcir.net/
VCLでできること・できないこと
●   できること
    ●
        条件分岐
    ●
        数値演算・文字列操作(結合・正規表現)
●
    できない・難しいこと
    ●
        文字列から数値への変換
    ●
        時刻計算
    ●   Base64などの符号化やハッシュ作成
    ●   バックエンドからのResponseヘッダを除く
        外部のリソースを取得すること
        設定ファイルとしては非常に柔軟だが
           微妙に痒いところがある
VCLのサンプル
sub vcl_recv{ //クライアントからのレスポンスを受け取る
  if(req.url ~ "(?|&)purge=1" && client.ip ~ local){//キャッシュ削除
    ban("obj.http.X-HOST ~ "+ req.http.host + " && obj.http.X-URL ~ " + regsub(req.url,"?.*$",""));
    error 200 "banned.";
  }
  //admin/以外のクッキー削除
  if(req.http.Cookie && !(req.http.host ~ "^blog.example.net" && req.url ~ "^/admin/")){
      unset req.http.Cookie;
  }
  if(req.http.host ~ "^blog.example.net"){
    set req.backend = blog;
    if( ! req.backend.healthy){       //blog 死亡
      set req.backend = cdn;           //blog 死亡のためcdn/sorry.htmlに向ける
      set req.url = "/sorry.html";
    }elseif(req.url ~ "^/admin/"){ //admin はキャッシュしない
      return(pass);
    }
  }elseif(req.http.host ~ "^cdn.example.net"){
    set req.backend = cdn;
  }else{//不明なホストは403
    error 403 "Forbidden";
  }
  return(lookup);
}
インラインCでできること・できないこと
●   できること
    ●   Cでできることなら大抵できる
●   できない・難しいこと
    ●
        セッション跨いだをデータの維持
        –   コストの高いデータを初期化しても
            次のセッションでまた初期化する必要が・・・
    ●   Varnish本体側の各種関数や変数へのアクセス
        –   重要な構造体のメンバにアクセスできなかったり・・・
Inline-Cのサンプル
                   memcachedに接続


C{
#include <stdlib.h>
#include <stdio.h>
#include <libmemcached/memcached.h>
void mctest(char *k ,char *v){
      struct memcached_st           *mmc      = NULL;
      struct memcached_server_st *servers       = NULL;
      memcached_return              rc;
      mmc      = memcached_create(NULL);
       servers = memcached_server_list_append(servers,"localhost", 11211, &rc);
      rc      = memcached_server_push(mmc, servers);
      memcached_server_list_free(servers);
      rc      = memcached_set(mmc, k, strlen(k), v, strlen(v), 600, 0);
      memcached_free(mmc);
}
}C
sub mcSet{
if(req.http.X-mck && req.http.X-mcv){
C{
char *key=VRT_GetHdr(sp,HDR_REQ,"006X-mck:");
char *value=VRT_GetHdr(sp,HDR_REQ,"006X-mcv:");
mctest(key,value);
}C
}
remove req.http.X-mck;
remove req.http.X-mcv;
}
sub vcl_recv{
set req.http.X-mck = "Last:req.xid";
set req.http.X-mcv = req.xid;
call mcSet;
インラインCだけだと正直キツイ
       へ(^o^)へ わーい設定に
          |へ
         /

       \(^o^ )へ インラインでCが書けるぞー
         \|
          >

       <( ^o^)> よっしゃ複雑な処理を・・・
        三) )三
       < ̄ ̄>

       Σ ( ^o^)
        <) )>グキッ
       < ̄ ̄>
       _人人 人人_
       > 突然の死 <
        ̄Y^Y^Y^Y ̄


VCLコード中のちょっとした日付演算などには
いいけど大規模なコードを書くには向かない
 VCL中にコードを書くため配布もしづらい
Varnish Module(VMOD)
       ことはじめ

        2012/07/20
        技術統括部
      いわなちゃん(@xcir)
VMODでできること・できないこと
●   できること
    ●   Cでできることなら大抵
    ●   セッションを跨いだデータの保持
    ●   Varnish本体の各種関数や変数へのアクセス
●   できないこと
    ●   あまりない




    モジュール形式なので配布もしやすいし
          使いやすい
VMODのサンプル
                    memcachedに接続


■vcc(vmodのヘッダファイルみたいなもの)
Function VOID mcset(STRING,STRING)

■c
#include <stdlib.h>
#include <stdio.h>
#include <libmemcached/memcached.h>
void vmod_mcset(struct sess *sp, const char *k ,const char *v){
     struct memcached_st               *mmc         = NULL;
     struct memcached_server_st            *servers    = NULL;
     memcached_return                  rc;
     mmc = memcached_create(NULL);
          servers = memcached_server_list_append(servers,
                       "localhost", 11211, &rc);
     rc    = memcached_server_push(mmc, servers);
     memcached_server_list_free(servers);
          rc     = memcached_set(mmc, k, strlen(k),
                v, strlen(v), 600, 0);
     memcached_free(mmc);
}

■VCL
example.mcset("Last:req.xid",req.xid);
いろんなVMODの紹介
●   公式でリストされているVMODを紹介します
    ●   https://www.varnish-cache.org/vmods
●   紹介しているサンプルコードは基本的に
    ドキュメントから拾って改変してます
    ●
        流石に全部動作確認する時間はなかったので
        動かないかも
●   明らかに動かないものは省いてます


        試しに使ってみたいものがあれば
           聞いてみてください
Authentication
●    Basic認証を行うモジュール
     ID/PWを固定で簡単に認証を入れたい時は便利
       ●   Developed by Omega Software Development Group
       ●   https://github.com/omegasdg/libvmod-authentication

    サンプルコード
    import authentication;

    vcl_recv{
      if(req.url ~ "^/protected/") {
        if(!authentication.match("admin", "test")) {
            error 401 "Authentication Required";
         }
      }
    }
    vcl_error{
      if (obj.status == 401) {
        set obj.http.WWW-Authenticate = {"Basic realm="Authorization Required""};
        synthetic {"Error 401 Unauthorized"};
        return(deliver);
      }
    }
crashhandler
●    セグフォを起こしてバックトレースを取得する
     VMODやインラインCでのデバッグに使う
      ●   Developed by Kristian Lyngstøl
      ●   https://github.com/varnish/libvmod-crashhandler

    サンプルコード
    import crashhandler;

    vcl_recv{
      if(req.url ~ "^/crash/") {
        crashhandler.crash();
      }
    }
cURL
●    VCL中にHTTPで他リソースを取得する
     APIを叩いてその結果のような使い方ができるかも
      ●   Developed by Varnish Software
      ●   https://github.com/varnish/libvmod-curl

    サンプルコード
    import curl;
    sub vcl_recv {
      curl.fetch("http://example.com/test");
      if (curl.header("X-Foo") == "bar") {
            …      }
      curl.free();
    }
dClass OpenDDR
                        (decision classification)
●       UAからデバイス情報を取得する(OpenDDR)
        ぱっと見た感じディスプレイサイズなども取得可能
        ●    Developed by Weather Channel
        ●    https://github.com/TheWeatherChannel/dClass

    サンプルコード
    import dclass;
    sub vcl_init {
         dclass.init_dclass("/some/path/OpenDDR/1.0.0.0/resources");
         dclass.init_dclass_p("/some/path/dClass/dtrees/browser.dtree",1);
    }

    sub vcl_recv {
         set req.http.dclass_openddr = dclass.classify(req.http.user-agent);
         set req.http.dclass_browser = dclass.classify_p(req.http.user-agent,1);

            if(dclass.get_ifield("displayWidth") > 320){
                   ....
            }
    }
DeviceAtlas Mobile Detection
●   モバイルデバイスの各種情報を取得
    ●   Developed by Varnish Software
    ●   Varnishソフトウェアが有償で提供しています
    ●   https://www.varnish-cache.org/vmod/deviceatlas-mobile-detection
Digest
●   HMAC-sha1などダイジェストやBase64が扱える
    SHA1などのDigestの出力はHEXエンコードされて
    いるので注意
    ●   Developed by Kristian Lyngstøl
    ●   https://github.com/varnish/libvmod-digest



サンプルコード
import digest;

sub vcl_recv {
     if (digest.hmac_sha256("key",req.http.x-some-header) !=
            digest.hmac_sha256("key",req.http.x-some-header-signed))
      {
            error 401 "Naughty user!";
      }
}
example vmod - hello world!
●    VMODを作るときに参考になります
      ●   Developed by Martin Blix Grydeland
      ●   https://github.com/varnish/libvmod-example




    サンプルコード
    import example;

    sub vcl_deliver {
         # This sets resp.http.hello to "Hello, World"
         set resp.http.hello = example.hello("World");
    }
Header manipulation
●    ヘッダーの操作を行うモジュール
     主にクッキーの値の追加や削除を行う
      ●   Developed by Kristian Lyngstøl
      ●   https://github.com/varnish/libvmod-header


    サンプルコード
    import header;

    sub vcl_fetch {
         header.append(beresp.http.Set-Cookie,"foo=bar");
         header.remove(beresp.http.Set-Cookie,"dontneedthiscookie");
    }
Memcached
●    Memcacheへ値のset/get/incrなどを行う
      ●   Developed by Aaron Stone
      ●   https://github.com/sodabrew/libvmod-memcached




    サンプルコード
    import memcached;
    sub vcl_deliver {
      memcached.servers("localhost");
      memcached.set("your_counter", "1", 100, 0);
      memcached.incr("your_counter", 10);
      set resp.http.count = memcached.incr("your_counter", 1);
    }
null - Binary data in synthetic
●    バイナリデータを送信したいときに利用
     vcl_errorでインラインCから使うのが一般的
      ●   Developed by Kristian Lyngstøl
      ●   https://github.com/varnish/libvmod-header

    サンプルコード
    import null;

    sub vcl_error {
      C{
       Vmod_Func_null.synth(sp,"TEST",4);
      }C
      return(deliver);
    }
POST/GET/Cookie parse
●    POST/GET/Cookieの内容をパースする
                         わ た し で す 
                            / ̄\   
      ●   Developed by      | ^o^ |    
                             \_/   
      ●   https://github.com/xcir/libvmod-parsereq




    サンプルコード
    import parsereq;

    vcl_recv{
      if(parsereq.post_header("hoge")){
         ...
      }
    }
redirect
●    Varnishのめんどくさいリダイレクトを簡単にする
                         わ た し で す 
                            / ̄\   
      ●   Developed by      | ^o^ |    
                             \_/   
      ●   https://github.com/xcir/libvmod-redirect




    サンプルコード
    import redirect;

    sub vcl_recv {
      if (req.http.user-agent ~ "iP(hone|od)") {
         error(redirect.location(302,"http://www.example.com/iphoneversion/")
         , "Moved Temporarily");
      }
    }
Redis
●    Redisにコマンドを送信する
      ●   Developed by ZephirWorks
      ●   https://github.com/zephirworks/libvmod-redis




    サンプルコード
    import redis;
    sub vcl_init{
      redis.init_redis("localhost", 6379, 200);
    }
    sub vcl_recv {
      redis.send("LPUSH client " + client.ip);
      set req.http.x-redis = redis.call("LTRIM client 0 99");
    }
Secure download
●    Nginxやlighttpdにもある特定の時間まで有効な
     使い捨てURL機能を実現する
       ●   Developed by Aurelien Guillaume
       ●   https://github.com/footplus/libvmod-secdown

    サンプルコード
    import secdown;

    sub vcl_recv {
      if (req.url ~ "^/protected/")
      {
        set req.url = secdown.check_url(req.url, "h4ckme", "/expired.html", "/error.html")
      }
    }
Shield
●    クライアントの接続を即切断する機能
     dDoS攻撃などの対策に使う
       ●   Developed by Martin Blix Grydeland
       ●   https://github.com/varnish/libvmod-shield

    サンプルコード
    import shield;

    sub vcl_recv {
         if (req.url ~ "i-am-an-attacker") {
               shield.conn_reset();
          }
    }
std - the standard VMOD
●    VCL中からログ出力を行うなどの基本的なVMOD
     VMODのサンプルコード的な役割も
      ●   Developed by Per Buer
      ●
          標準でインストールされます

    サンプルコード
    import std;

    sub vcl_recv {
         std.log(“hogehoge”);
    }
URL Code
●    URLエンコード・デコードを行う
       ●   Developed by Fastly Inc
       ●   https://github.com/fastly/libvmod-urlcode




    サンプルコード
    import urlcode;

    sub vcl_recv {
         set req.url = "/example?url=" + urlcode.encode("http://" +
               req.http.host + req.url);
    }
URL Sort
●    URLのクエリをソートしてクエリの順番が違うだけ
     で別のキャッシュにならないように正規化する
       ●   Developed by Fastly Inc
       ●   https://github.com/cyberroadie/varnish-urlsort

    サンプルコード
    import urlsort;

    sub vcl_recv {
         set req.url =urlsort.sortquery(req.url);
    }
Variable Support
●       文字列・整数・実数が扱える変数を提供する
        ●    Developed by Varnish Software
        ●    https://github.com/varnish/libvmod-var




    サンプルコード
    import var;

    sub vcl_recv {

        if (req.http.user-agent ~ iP(od|ad|hone) ) {
             set var.set_int("idevs", var.get_int("i1") + 1 );
        }
    }
いろいろVMODが存在
●   公式でリストされてないものだと
    ●   LDAP認証
    ●   Firewall
    ●   などなど




           これらを使うことで
        より高度なVarnishライフが・・・
それでも欲しい機能がないなら・・・
VMODを作ってみよう




      僕のブログにある
inline-C/VMODガイドブック
   をご覧ください(ステマ)
ご清聴ありがとうございました

More Related Content

What's hot

C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsYoshifumi Kawai
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?ogawatti
 
PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合hiboma
 
Reactive Extensions v2.0
Reactive Extensions v2.0Reactive Extensions v2.0
Reactive Extensions v2.0Yoshifumi Kawai
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略yoku0825
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?Sho Hashimoto
 
Dive into dockerネットワーク
Dive into dockerネットワークDive into dockerネットワーク
Dive into dockerネットワークKazuyuki Mori
 
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅- Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅- Daisuke Ikeda
 
Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Sho Shimizu
 
CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼうDaiki Ichinose
 
ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門	ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門 Atsu Yamaga
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にYoshifumi Kawai
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2Masahide Yamamoto
 
Trema での Open vSwitch
Trema での Open vSwitchTrema での Open vSwitch
Trema での Open vSwitchkazuyas
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented featuretamtam180
 
第1回 一撃サーバー構築シェルスクリプト勉強会
第1回 一撃サーバー構築シェルスクリプト勉強会第1回 一撃サーバー構築シェルスクリプト勉強会
第1回 一撃サーバー構築シェルスクリプト勉強会Yasutaka Hamada
 
Hol012 windowsコンテナー始動
Hol012 windowsコンテナー始動Hol012 windowsコンテナー始動
Hol012 windowsコンテナー始動Tech Summit 2016
 

What's hot (20)

C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?
 
PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合
 
Reactive Extensions v2.0
Reactive Extensions v2.0Reactive Extensions v2.0
Reactive Extensions v2.0
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?
 
Dive into dockerネットワーク
Dive into dockerネットワークDive into dockerネットワーク
Dive into dockerネットワーク
 
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅- Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
 
Kernel fcache-bug
Kernel fcache-bugKernel fcache-bug
Kernel fcache-bug
 
Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像
 
CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼう
 
ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門	ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2
 
Trema での Open vSwitch
Trema での Open vSwitchTrema での Open vSwitch
Trema での Open vSwitch
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 
SystemV IPC
SystemV IPCSystemV IPC
SystemV IPC
 
第1回 一撃サーバー構築シェルスクリプト勉強会
第1回 一撃サーバー構築シェルスクリプト勉強会第1回 一撃サーバー構築シェルスクリプト勉強会
第1回 一撃サーバー構築シェルスクリプト勉強会
 
Hol012 windowsコンテナー始動
Hol012 windowsコンテナー始動Hol012 windowsコンテナー始動
Hol012 windowsコンテナー始動
 
Memory sanitizer
Memory sanitizerMemory sanitizer
Memory sanitizer
 

Similar to 社内勉強会資料(Varnish Module)

Circle ci and docker+serverspec
Circle ci and docker+serverspecCircle ci and docker+serverspec
Circle ci and docker+serverspecTsuyoshi Yamada
 
Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsuNanha Park
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略Hiroshi SHIBATA
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックEmma Haruka Iwao
 
20170422 azure portal cli 使いこなし
20170422 azure portal cli 使いこなし20170422 azure portal cli 使いこなし
20170422 azure portal cli 使いこなしTakayoshi Tanaka
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)Daisuke Ikeda
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでRyo Nakamaru
 
仮想化した DC を PowerShell で複製する
仮想化した DC を PowerShell で複製する仮想化した DC を PowerShell で複製する
仮想化した DC を PowerShell で複製するjunichi anno
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎Daisuke Hiraoka
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1Ryosuke IWANAGA
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践Yoshifumi Kawai
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-toolNaruto TAKAHASHI
 

Similar to 社内勉強会資料(Varnish Module) (20)

Circle ci and docker+serverspec
Circle ci and docker+serverspecCircle ci and docker+serverspec
Circle ci and docker+serverspec
 
Hbstudy41 auto scaling
Hbstudy41 auto scalingHbstudy41 auto scaling
Hbstudy41 auto scaling
 
Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsu
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
20170422 azure portal cli 使いこなし
20170422 azure portal cli 使いこなし20170422 azure portal cli 使いこなし
20170422 azure portal cli 使いこなし
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
Lxc on cloud
Lxc on cloudLxc on cloud
Lxc on cloud
 
仮想化した DC を PowerShell で複製する
仮想化した DC を PowerShell で複製する仮想化した DC を PowerShell で複製する
仮想化した DC を PowerShell で複製する
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-tool
 

社内勉強会資料(Varnish Module)

  • 1. Varnish Cache ことはじめ 2012/07/20 技術統括部 いわなちゃん(@xcir)
  • 2. Varnishの特徴 ● コンテンツのキャッシュ ● Cライクなドメイン言語VCLによる柔軟な制御 ● むしろVCL中にC言語が書ける(インラインC) ● 高速なリバースプロキシ ● フラグメントキャッシュなESIへの対応 ● ロードバランシングとヘルスチェックが可能 ● gzipの圧縮解凍が可能 うちでは主に静的コンテツに使ってます
  • 3. とまぁ細かい点は 僕のブログにある VarnishCache入門をご覧ください(ステマ) http://blog.xcir.net/
  • 4. VCLでできること・できないこと ● できること ● 条件分岐 ● 数値演算・文字列操作(結合・正規表現) ● できない・難しいこと ● 文字列から数値への変換 ● 時刻計算 ● Base64などの符号化やハッシュ作成 ● バックエンドからのResponseヘッダを除く 外部のリソースを取得すること 設定ファイルとしては非常に柔軟だが 微妙に痒いところがある
  • 5. VCLのサンプル sub vcl_recv{ //クライアントからのレスポンスを受け取る if(req.url ~ "(?|&)purge=1" && client.ip ~ local){//キャッシュ削除 ban("obj.http.X-HOST ~ "+ req.http.host + " && obj.http.X-URL ~ " + regsub(req.url,"?.*$","")); error 200 "banned."; } //admin/以外のクッキー削除 if(req.http.Cookie && !(req.http.host ~ "^blog.example.net" && req.url ~ "^/admin/")){ unset req.http.Cookie; } if(req.http.host ~ "^blog.example.net"){ set req.backend = blog; if( ! req.backend.healthy){ //blog 死亡 set req.backend = cdn; //blog 死亡のためcdn/sorry.htmlに向ける set req.url = "/sorry.html"; }elseif(req.url ~ "^/admin/"){ //admin はキャッシュしない return(pass); } }elseif(req.http.host ~ "^cdn.example.net"){ set req.backend = cdn; }else{//不明なホストは403 error 403 "Forbidden"; } return(lookup); }
  • 6. インラインCでできること・できないこと ● できること ● Cでできることなら大抵できる ● できない・難しいこと ● セッション跨いだをデータの維持 – コストの高いデータを初期化しても 次のセッションでまた初期化する必要が・・・ ● Varnish本体側の各種関数や変数へのアクセス – 重要な構造体のメンバにアクセスできなかったり・・・
  • 7. Inline-Cのサンプル memcachedに接続 C{ #include <stdlib.h> #include <stdio.h> #include <libmemcached/memcached.h> void mctest(char *k ,char *v){ struct memcached_st *mmc = NULL; struct memcached_server_st *servers = NULL; memcached_return rc; mmc = memcached_create(NULL); servers = memcached_server_list_append(servers,"localhost", 11211, &rc); rc = memcached_server_push(mmc, servers); memcached_server_list_free(servers); rc = memcached_set(mmc, k, strlen(k), v, strlen(v), 600, 0); memcached_free(mmc); } }C sub mcSet{ if(req.http.X-mck && req.http.X-mcv){ C{ char *key=VRT_GetHdr(sp,HDR_REQ,"006X-mck:"); char *value=VRT_GetHdr(sp,HDR_REQ,"006X-mcv:"); mctest(key,value); }C } remove req.http.X-mck; remove req.http.X-mcv; } sub vcl_recv{ set req.http.X-mck = "Last:req.xid"; set req.http.X-mcv = req.xid; call mcSet;
  • 8. インラインCだけだと正直キツイ へ(^o^)へ わーい設定に    |へ   / \(^o^ )へ インラインでCが書けるぞー   \|    > <( ^o^)> よっしゃ複雑な処理を・・・  三) )三 < ̄ ̄> Σ ( ^o^)  <) )>グキッ < ̄ ̄> _人人 人人_ > 突然の死 <  ̄Y^Y^Y^Y ̄ VCLコード中のちょっとした日付演算などには いいけど大規模なコードを書くには向かない VCL中にコードを書くため配布もしづらい
  • 9. Varnish Module(VMOD) ことはじめ 2012/07/20 技術統括部 いわなちゃん(@xcir)
  • 10. VMODでできること・できないこと ● できること ● Cでできることなら大抵 ● セッションを跨いだデータの保持 ● Varnish本体の各種関数や変数へのアクセス ● できないこと ● あまりない モジュール形式なので配布もしやすいし 使いやすい
  • 11. VMODのサンプル memcachedに接続 ■vcc(vmodのヘッダファイルみたいなもの) Function VOID mcset(STRING,STRING) ■c #include <stdlib.h> #include <stdio.h> #include <libmemcached/memcached.h> void vmod_mcset(struct sess *sp, const char *k ,const char *v){ struct memcached_st *mmc = NULL; struct memcached_server_st *servers = NULL; memcached_return rc; mmc = memcached_create(NULL); servers = memcached_server_list_append(servers, "localhost", 11211, &rc); rc = memcached_server_push(mmc, servers); memcached_server_list_free(servers); rc = memcached_set(mmc, k, strlen(k), v, strlen(v), 600, 0); memcached_free(mmc); } ■VCL example.mcset("Last:req.xid",req.xid);
  • 12. いろんなVMODの紹介 ● 公式でリストされているVMODを紹介します ● https://www.varnish-cache.org/vmods ● 紹介しているサンプルコードは基本的に ドキュメントから拾って改変してます ● 流石に全部動作確認する時間はなかったので 動かないかも ● 明らかに動かないものは省いてます 試しに使ってみたいものがあれば 聞いてみてください
  • 13. Authentication ● Basic認証を行うモジュール ID/PWを固定で簡単に認証を入れたい時は便利 ● Developed by Omega Software Development Group ● https://github.com/omegasdg/libvmod-authentication サンプルコード import authentication; vcl_recv{ if(req.url ~ "^/protected/") { if(!authentication.match("admin", "test")) { error 401 "Authentication Required"; } } } vcl_error{ if (obj.status == 401) { set obj.http.WWW-Authenticate = {"Basic realm="Authorization Required""}; synthetic {"Error 401 Unauthorized"}; return(deliver); } }
  • 14. crashhandler ● セグフォを起こしてバックトレースを取得する VMODやインラインCでのデバッグに使う ● Developed by Kristian Lyngstøl ● https://github.com/varnish/libvmod-crashhandler サンプルコード import crashhandler; vcl_recv{ if(req.url ~ "^/crash/") { crashhandler.crash(); } }
  • 15. cURL ● VCL中にHTTPで他リソースを取得する APIを叩いてその結果のような使い方ができるかも ● Developed by Varnish Software ● https://github.com/varnish/libvmod-curl サンプルコード import curl; sub vcl_recv { curl.fetch("http://example.com/test"); if (curl.header("X-Foo") == "bar") { … } curl.free(); }
  • 16. dClass OpenDDR (decision classification) ● UAからデバイス情報を取得する(OpenDDR) ぱっと見た感じディスプレイサイズなども取得可能 ● Developed by Weather Channel ● https://github.com/TheWeatherChannel/dClass サンプルコード import dclass; sub vcl_init { dclass.init_dclass("/some/path/OpenDDR/1.0.0.0/resources"); dclass.init_dclass_p("/some/path/dClass/dtrees/browser.dtree",1); } sub vcl_recv { set req.http.dclass_openddr = dclass.classify(req.http.user-agent); set req.http.dclass_browser = dclass.classify_p(req.http.user-agent,1); if(dclass.get_ifield("displayWidth") > 320){ .... } }
  • 17. DeviceAtlas Mobile Detection ● モバイルデバイスの各種情報を取得 ● Developed by Varnish Software ● Varnishソフトウェアが有償で提供しています ● https://www.varnish-cache.org/vmod/deviceatlas-mobile-detection
  • 18. Digest ● HMAC-sha1などダイジェストやBase64が扱える SHA1などのDigestの出力はHEXエンコードされて いるので注意 ● Developed by Kristian Lyngstøl ● https://github.com/varnish/libvmod-digest サンプルコード import digest; sub vcl_recv { if (digest.hmac_sha256("key",req.http.x-some-header) != digest.hmac_sha256("key",req.http.x-some-header-signed)) { error 401 "Naughty user!"; } }
  • 19. example vmod - hello world! ● VMODを作るときに参考になります ● Developed by Martin Blix Grydeland ● https://github.com/varnish/libvmod-example サンプルコード import example; sub vcl_deliver { # This sets resp.http.hello to "Hello, World" set resp.http.hello = example.hello("World"); }
  • 20. Header manipulation ● ヘッダーの操作を行うモジュール 主にクッキーの値の追加や削除を行う ● Developed by Kristian Lyngstøl ● https://github.com/varnish/libvmod-header サンプルコード import header; sub vcl_fetch { header.append(beresp.http.Set-Cookie,"foo=bar"); header.remove(beresp.http.Set-Cookie,"dontneedthiscookie"); }
  • 21. Memcached ● Memcacheへ値のset/get/incrなどを行う ● Developed by Aaron Stone ● https://github.com/sodabrew/libvmod-memcached サンプルコード import memcached; sub vcl_deliver { memcached.servers("localhost"); memcached.set("your_counter", "1", 100, 0); memcached.incr("your_counter", 10); set resp.http.count = memcached.incr("your_counter", 1); }
  • 22. null - Binary data in synthetic ● バイナリデータを送信したいときに利用 vcl_errorでインラインCから使うのが一般的 ● Developed by Kristian Lyngstøl ● https://github.com/varnish/libvmod-header サンプルコード import null; sub vcl_error { C{ Vmod_Func_null.synth(sp,"TEST",4); }C return(deliver); }
  • 23. POST/GET/Cookie parse ● POST/GET/Cookieの内容をパースする わ た し で す    / ̄\    ● Developed by   | ^o^ |     \_/    ● https://github.com/xcir/libvmod-parsereq サンプルコード import parsereq; vcl_recv{ if(parsereq.post_header("hoge")){ ... } }
  • 24. redirect ● Varnishのめんどくさいリダイレクトを簡単にする わ た し で す    / ̄\    ● Developed by   | ^o^ |     \_/    ● https://github.com/xcir/libvmod-redirect サンプルコード import redirect; sub vcl_recv { if (req.http.user-agent ~ "iP(hone|od)") { error(redirect.location(302,"http://www.example.com/iphoneversion/") , "Moved Temporarily"); } }
  • 25. Redis ● Redisにコマンドを送信する ● Developed by ZephirWorks ● https://github.com/zephirworks/libvmod-redis サンプルコード import redis; sub vcl_init{ redis.init_redis("localhost", 6379, 200); } sub vcl_recv { redis.send("LPUSH client " + client.ip); set req.http.x-redis = redis.call("LTRIM client 0 99"); }
  • 26. Secure download ● Nginxやlighttpdにもある特定の時間まで有効な 使い捨てURL機能を実現する ● Developed by Aurelien Guillaume ● https://github.com/footplus/libvmod-secdown サンプルコード import secdown; sub vcl_recv { if (req.url ~ "^/protected/") { set req.url = secdown.check_url(req.url, "h4ckme", "/expired.html", "/error.html") } }
  • 27. Shield ● クライアントの接続を即切断する機能 dDoS攻撃などの対策に使う ● Developed by Martin Blix Grydeland ● https://github.com/varnish/libvmod-shield サンプルコード import shield; sub vcl_recv { if (req.url ~ "i-am-an-attacker") { shield.conn_reset(); } }
  • 28. std - the standard VMOD ● VCL中からログ出力を行うなどの基本的なVMOD VMODのサンプルコード的な役割も ● Developed by Per Buer ● 標準でインストールされます サンプルコード import std; sub vcl_recv { std.log(“hogehoge”); }
  • 29. URL Code ● URLエンコード・デコードを行う ● Developed by Fastly Inc ● https://github.com/fastly/libvmod-urlcode サンプルコード import urlcode; sub vcl_recv { set req.url = "/example?url=" + urlcode.encode("http://" + req.http.host + req.url); }
  • 30. URL Sort ● URLのクエリをソートしてクエリの順番が違うだけ で別のキャッシュにならないように正規化する ● Developed by Fastly Inc ● https://github.com/cyberroadie/varnish-urlsort サンプルコード import urlsort; sub vcl_recv { set req.url =urlsort.sortquery(req.url); }
  • 31. Variable Support ● 文字列・整数・実数が扱える変数を提供する ● Developed by Varnish Software ● https://github.com/varnish/libvmod-var サンプルコード import var; sub vcl_recv { if (req.http.user-agent ~ iP(od|ad|hone) ) { set var.set_int("idevs", var.get_int("i1") + 1 ); } }
  • 32. いろいろVMODが存在 ● 公式でリストされてないものだと ● LDAP認証 ● Firewall ● などなど これらを使うことで より高度なVarnishライフが・・・
  • 34. VMODを作ってみよう 僕のブログにある inline-C/VMODガイドブック をご覧ください(ステマ)