Post on 18-Jul-2015
システム部
Copyright 2013 All About,inc. 1
varnish
Varnishの使い方~ All Aboutでの使い方を例に~
2013/02/26 システム部勉強会
( 2013/5/8 修正)
大原 和人(やまと)
システム部
Copyright 2013 All About,inc. 2
発表の目的
• Varnishって何に使っているのかよくわからない• Varnishの設定ファイルが意味不明• Varnish …の基本的なことはわかるけど
• こういう使い方もできそうだ!• こういう風に依頼すればいいのか!• こうしたら、もっと良くなるんじゃないか!• 自分のサイトにも入れてみよう!
システム部
Copyright 2013 All About,inc. 3
目次
1. Varnishの基礎知識2. All Aboutの varnish環境3. Varnishの使い方~ All Aboutを例に~
① アクセスを中継する ② キャッシュする
1. All Aboutの Varnish環境の課題2. まとめ
システム部
Copyright 2013 All About,inc.
Varnishの基礎知識
• Varnish– HTTPアクセラレータ–リバースプロキシ–キャッシュサーバ
• アクセスを中継する–適切なサーバへ要求を振り分け
• キャッシュする–高速化、負荷軽減
システム部
Copyright 2013 All About,inc.
Varnishの基礎知識
• 高速、多機能、拡張可能• 設定ファイルは主に 2種類
– /etc/varnish/default.vcl– /etc/sysconfig/varnish
• VCLファイル– C言語に似た言語で記述される– C言語で独自の拡張モジュールの作成も可能
システム部
Copyright 2013 All About,inc.
All Aboutの varnish環境
• サーバ構成
システム部
Copyright 2013 All About,inc.
All Aboutの varnish環境
• サーバ構成– LB故障時を考慮し、グローバル直でのアクセスもラウンドロビンに入れている
– DC(オンプレ)のトラフィック増の問題があったため、クラウドのキャッシュサーバを立てて分散させた
システム部
Copyright 2013 All About,inc.
Varnishの使い方
① アクセスを中継する– 要求を受けて、サーバへ飛ばす– 分散して飛ばす– アクセス制御– リダイレクト
Varnishの使い方~ All Aboutでの使い方を例に~
システム部
Copyright 2013 All About,inc.
Varnishの使い方①アクセスを中継する
• 要求を受けて、サーバへ飛ばす•飛ばすサーバの定義backend web01 { .host = "10.x.x.x"; .port = "80"; .connect_timeout = 15s;}
•どんな要求が来た時、どこに飛ばすか?sub vcl_recv { if ( req.http.host == "allabout.co.jp") { if( req.url == "/test/" ){ set req.backend = web01; } elsif( req.url ~ “^/test02/“ ) { # 正規表現も可能 set req.backend = web02; } else{ set req.backend = web03; } }}
システム部
Copyright 2013 All About,inc.
Varnishの使い方①アクセスを中継する
• 分散して飛ばす・飛ばすサーバ群director web02_04 round-robin { {.backend = web02;} {.backend = web03;} {.backend = web04;}}
sub vcl_recv { if ( req.http.host == "allabout.co.jp") { if( req.url == "/test/" ){ set req.backend = aaweb02_04; } }}
システム部
Copyright 2013 All About,inc.
Varnishの使い方①アクセスを中継する
• 分散して飛ばす–飛ばし方は?
• round-robin ← ほとんどこれ• fallback
• random、 client、 hash
–ヘルスチェックお亡くなりになったサーバには飛ばさない
director web02_04 round-robin { {.backend = web02;} {.backend = web03;} {.backend = web04;}}
backend aaweb01 { .host = "10.x.x.x"; .port = "80"; .connect_timeout = 30s;
.probe = { .request = "GET /health.php HTTP/1.0" "Host: health.jp" "User-Agent: varnish health check bot" ; .interval = 10s; .timeout = 10s; .window = 5; .threshold = 3; }}
システム部
Copyright 2013 All About,inc.
Varnishの使い方①アクセスを中継する
• アクセス制御–許可 (拒否 )IPの設定
–あとは if文でぶち込むだけ!
acl partner_ip { “x.x.x.x"; “x.x.x.x";}
sub vcl_recv { if ( !client.ip ~ partner_ip ) { error 405 "Not Allowed."; }}
システム部
Copyright 2013 All About,inc.
Varnishの使い方①アクセスを中継する
• リダイレクト–ちょっと書き方が面倒(わざとエラーに飛ばすみたいな感じ)
–レスポンスが 404なら、別サーバへ飛ばすことも可能(一部で CDN機能として使用)
システム部
Copyright 2013 All About,inc.
Varnishの使い方
② キャッシュする– キャッシュする、しないの判断– キャッシュ時間– キャッシュ方法– gzip圧縮
Varnishの使い方~ All Aboutでの使い方を例に~
システム部
Copyright 2013 All About,inc.
Varnishの使い方②キャッシュする
• キャッシュする、しないの判断
• 404のとき、キャッシュしない
sub vcl_recv { if (req.http.host == "allabout.co.jp") { if( req.url == "/test/" ){ set req.backend = web01; return (pass); # キャッシュしない } else{ set req.backend = web03; } } return (lookup); # キャッシュする}
sub vcl_fetch { if ( beresp.status == 404) { return ( hit_for_pass ); } return(deliver);}
システム部
Copyright 2013 All About,inc.
Varnishの使い方②キャッシュする
• キャッシュ方法– 速度:メモリ > ファイル–ハイブリッドも可能に
default.vcl# メモリスペースが無くなれば、ファイルにキャッシュするif( storage.st1.free_space > 0B){ set beresp.storage = "st1"; } else { set beresp.storage = "st2"; }
/etc/sysconfig/varnish# メモリVARNISH_STORAGE1="malloc,2G“# ファイルVARNISH_STORAGE2="file,${VARNISH_STORAGE_FILE},8G"
• キャッシュ時間–デフォルトの TTL: 120s–もちろん個別に設定も可能–ヘルスチェックと組み合わせると
# オリジンが落ちていたら、キャッシュを長く持たせるif( req.backend.healthy ) { set req.grace = 120s;} else { set req.grace = 1h;}
システム部
Copyright 2013 All About,inc.
Varnishの使い方②キャッシュする
• gzip圧縮– キャッシュするファイルを gzip圧縮– もちろん個別に設定も可能– 非対応ブラウザの場合は、自動で解凍してくれる
if ( req.url ~ "(\.jpg|\.JPG|\.jpeg|\.gif|\.GIF|\.png|\.PNG)$" ) { set beresp.do_gzip = false;} else { set beresp.do_gzip = true;}
1/4以下!
システム部
Copyright 2013 All About,inc.
All Aboutの varnish環境における課題
All Aboutの varnish環境における課題
システム部
Copyright 2013 All About,inc.
All Aboutの varnish環境における課題
• Vclファイルの肥大化– if分岐がどんどん追加され、ロジックが複雑化しつつある
–共通部分を変更する際、影響範囲が大きい
うまくまとめたり、分割したりしたい
システム部
Copyright 2013 All About,inc.
All Aboutの varnish環境における課題
• ヒット率のさらなる向上– AAのヒット率はピークで 85%くらい
– キャッシュルールの統一• できるだけキャッシュしてください
– ドメイン名、クエリストリングの正規化• 内容が同じ場合は、キャッシュを同じに
• クエリストリングの正規化例( regsub関数を使用) set req.url = regsub(req.url, "(\?|&)xxx=[^&]+&?(.+)?$", "\1\2"); set req.url = regsub(req.url, "(\?|&)$", "");
• ドメイン名の正規化例 if(req.http.host ~ "(?i)(www\.)?example\.net"){ set req.http.host = “example.net”; }
• これも別サイトとしてキャッシュされる /Test?aaa=1&bbb=1 /Test?bbb=1&aaa=1
システム部
Copyright 2013 All About,inc.
まとめ
• Varnish依頼がスムーズに• 課題解決を共に
• Varnishでできること• 簡単な設定ファイルの見方
システム部
Copyright 2013 All About,inc.
参考
• いわなちゃんさん– varnish界の神!– ブログ http://blog.xcir.net/– varnishの教科書 http://blog.xcir.net/wp-
content/uploads/2011/09/VarnishCacheIntroduction_Rev2.pdf
システム部
Copyright 2013 All About,inc.
ご清聴ありがとうございました!