1月 012013
 

なんかTwitterを眺めていたら2012年のまとめみたいな記事が流れてたので僕も書いてみようかなと

大まかな流れ

Varnish尽くし
いやまぁいつも通りですね!
というのはそうなんですが、個人的に大きな出来事は

  • VMODの作成&公開
  • ログ読みツールの作成
  • varnish-miscのMLデビュー
  • 同人誌をVarnishSoftwareに送る
  •  
    です

    VMOD

    VMODは5つほど作成しました。

  • Varnishで簡単にリダイレクトができるVMOD作ってみた(vmod_redirect)@2月
  • X-Forwarded-ForをACLと突き合わせてみる(Varnish)@4月
  • VarnishでPOST・COOKIE・GETを扱うためのVMODを作ってみた(vmod-parsereq)@6月
  • VarnishでAmazon S3の認証ヘッダを作るVMODを作ってみた@7月
  • LDAPで認証したり情報を取得するVMODを作ってみた@8月
  •  
    この中で特に反響が大きかったのがvmod_redirectとvmod_parsereqです。

    vmod_redirectを作った理由はVCLのポリシーを壊さずに拡張するというPoCでした。
    VCLは柔軟性があるし、なんかポリシーなんてあるの?といった感じに思う人もいるかと思いますが
    超えてはならない一線みたいなポリシーを感じる作りになっています。

    僕がそれを顕著に感じたのが、リダイレクトの処理です。
    以下が公式が紹介しているリダイレクトを行うVCLの内容です。

    
    sub vcl_recv {
      if (req.http.user-agent ~ "iP(hone|od)") {
        error 750 "Moved Temporarily";
      }
    }
    
    sub vcl_error {
      if (obj.status == 750) {
        set obj.http.Location = "http://www.example.com/iphoneversion/";
        set obj.status = 302;
        return(deliver);
      }
    }
    
    

    一回VCL_Errorに飛ばして、そこから書き換えてリダイレクトするようなコードになります。
    リダイレクトは利用頻度が(おそらく)高いわけですから
    一つ関数を用意して処理すればいいと考える人も多いと思います。
    しかし、それを許さないところに超えてはならない一線を感じました。

    それならポリシーを壊さずにやってやろうと思って作ったのがvmod_redirectでした。
    目的は1行でVCLのポリシーを破壊せずにリダイレクトまでしてしまうということです。
    実際にユーザ見えではvcl_errorには記述する必要がないのですが
    内部ではフックすることで以下の記述のVCLを動かしています。

    
    sub vcl_error {
      if (obj.status == 301 || obj.status == 302 || obj.status == 303) {
        if(req.http.X-VMODREDIRECT-Location){
          set obj.http.Location = req.http.X-VMODREDIRECT-Location;
          return(deliver);
        }
      }
      /* ユーザが記述したvcl_errorの内容 */
    }
    
    

    正直この手法は穴を突いたものだと感じていて
    バージョンアップでふさがれるのも覚悟したのですが
    MLに投げたところ中々反応がよく、最終的にはVarnishSoftwareが商用サポートしています。
    あっ、許された?と勝手に考え、ここからどんどん他ののVMODを作っています。

    またvmod_parsereqというPOSTなどのリクエストをパースするVMODも作りました。
    これに関しては@dai_yamashitaさんにはかなりご協力をいただき感謝しています。
    初期のバージョンはかなりバグだらけで涙目になったのですが
    さまざまなログ取りをお願いしたり、実際にお会いしてその場でバグ取りもしました。
    おかげさまでいいもの仕上がったんじゃないかなと思っています。
    また、先日ロンドンであったVUG6-DevDayのディスカッションにおいて取り上げられるなど
    正直英語とかで尻込みせずに行っとけばよかったと後悔しました。

    さらにうれしい事にVarnish Security Firewallの一部として使われています。
    実際に使われるまでにはノルウェー・ブラジル・日本(僕)間でディスカッションをしながらやったのですが
    海外のOSSな人とやり取りしながら作っていくという経験は非常に面白くよかったなと思います。
    正直かなり英語でもどかしく感じたので今年こそはスラッとできるように!と決意を新たにしています。
    本当に毎回VarnishSoftwareのRubénさんには助けられまくりです、ありがとうございました。

    ログ読みツール

    varnishlogを見やすくするツールを作ってみた
    varnishlogが見づらいのでそれを見やすくするツールを作ってみました。
    実はこれ元々qpstudyでLTの前座用に作ったモノでした。

    スライドまで作ったのですが何か用事があってqpstudyには行けずにお蔵入りかなーと思ってたんですが
    せっかく作ったし公開するかーと公開してみたらVarnishSoftwareのニュースレターにも掲載されました。
    ニュースレターは購読してるのでメール来て読んでたらいきなり僕の名前が出てきてかなりビビりましたw
    これに関してはかなりコードが汚いので書き直します。
    今年は巳年なのでPythonでーなんて考えていますw

    MLデビュー

    投稿した内容はそこまで多くはないのですが、投稿したおかげで僕が認知されたっぽく
    さまざまな人と交流するきっかけになりました。
    初めての勉強会(qpstudy)に行った時もそうなんですが、最初の一歩はかなり勇気はいるものの
    いざやってしまえば
    「もっと早くやればよかった!」
    と考えています。
    まぁ英語はやらないといけませんが!

    同人誌をVarnishSoftwareに送る

    突然G+の方でVarnish本の現物ってどうやって買うの?といわれて半分混乱しながらEMSで送りました。


    EMSってすごく早いんですね、確か三日ぐらいで届いた気がします。

    まとめ

    去年もVarnishばっかやっていたわけですが(ブログでは)
    全体をまとめると海外デビューというのが大きいです。
    それと同時に英語力が足りないなど様々な自身の問題点に気づいた年でした。
    もっと英語力を挙げてVarnishはもちろんほかのOSSなどでも貢献できればいいなと考えています。

    まぁそんなこんなで今年もどうかよろしくお願いします。


     Posted by at 4:38 AM

     Leave a Reply

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

    (required)

    (required)

    このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください