Varnish4.1.0がリリースされました。
多くの新機能・改善・バグフィックスとほんの少しのVCLの変更があります。
特にバグフィックスを求めるユーザにとっては朗報です。
今までチケット上は修正されたけど各ブランチにマージされていなかったものが全て今回4.1ブランチにマージされたのでそれを求めるユーザにとっても更新するのも良いと思います。
割と大規模な変更があるので安定性について気になっている方もいると思いますが、4.1.0-beta1を2週間強ほど知り合いのサイト(ESI含む)に入れて運用しましたが
踏んだバグは一つ(#1792)で修正済みで安定して動いています。
また、CPUの使用率も下がっているようです。
ダウンロードはこちら
VCLの変更について
本家のアップデートガイドでも書いてある通り4.0.xのVCLをそのまま使用することが出来ます。
但しdeprecated的なのが増えているのとvmod_stdで引数の追加があるので注意が必要です。
HTTP/0.9のサポートを終了しました
むしろしていたのかという気持ちに・・
PROXY Protocol(v1/v2)のサポート
PROXY Protocol(v1/v2)をサポートしています。
使用する場合は起動オプションで以下のように指定します。(,PROXYを追加)
-a [IP Address]:[Port],PROXY
これに伴いremote.ip/local.ipが追加されました(後述)
接続してくる上位PROXYサーバのIPを制限したい時(ACL)に便利です。
またVarnishではhitchというPROXY Protocolを喋るTLS/SSLProxyを作っており(この前バージョンが1.0.0になった)
これと組み合わせるのを想定していると考えています。
VCLの自動cold/warm機能
Varnishはvclをreloadをした場合でも古いvclを保持しておいて後で使用することが出来ました。
この状態ではオリジンにヘルスチェックが飛んでしまい、それを防ぐには古いvclを削除するには明示的にdiscradをする必要がありました。
しかし4.1では使用されなくなったVCLは一定時間経過後(vcl_cooldown)にcold状態になりヘルスチェックが止まります。
セキュリティの強化(jails)
4.0.3
root 30262 0.0 4.2 124540 84320 ? SLs Oct05 0:43 /usr/sbin/varnishd ... nobody 30264 0.1 4.2 582932 85724 ? Sl Oct05 15:19 \_ /usr/sbin/varnishd ...
4.1.0
varnish 1278 0.2 0.2 124768 5376 ? Ss 16:32 0:00 /usr/sbin/varnishd ... varnish 1280 1.7 5.8 1639192 117276 ? Sl 16:32 0:00 \_ /usr/sbin/varnishd ...
今まではマスタープロセスはroot権限で動いていたのですが4.1からはセキュリティの強化のためになるだけ別ユーザで動くようにしました。
デフォルトではvarnishを使います。
もし任意のユーザ名を指定したい場合は起動オプションで-jオプションで指定可能です。
VMODでアクセスできる範囲の大幅な強化
これはどちらかと言うとVMODを作る人向けなのですが
以下のことが可能になっています
- レスポンスボディに対するフィルタ機能(VFP/VDP)
- バックエンドの動的生成
- カスタムバックエンドの作成
まだすべて試しきれていないのですがどれも非常に強力です。
これは機会があれば別記事で取り上げようと思います。
動作変更
stale-while-revalidate(RFC5861)に対応しました
graceの初期値に使う感じです。
VCL変更/アクションのリターン値
vcl_hit
return(fetch)はreturn(miss)に変更する必要があります。
ただし4.1.0時点では変更を促すログを出しますがfetchはmissと同じように動作します
恐らく次の大型バージョンアップ時で消されるのではないかと思います。
vcl_backend_error
return(abandon)が追加されました。
vcl_init
return(fail)が追加されました。
文字通りfailを返すとvclの初期化に失敗します。
VCL変更/変数
remote.ip / local.ip (IP READ)
先程も述べたとおりPROXY Protocolに対応したため、それに伴いclient.ip/server.ipにPROXYサーバから渡された値が入ってくるようになりました。
(※ここで言うPROXYサーバはhaxproxyだったりAWSのELB等のPROXY Protocolを喋る上位サーバです。)
そのためclient.ipがVarnishに接続してきたIPアドレスを示すのではなくPROXYサーバがに接続してきたIPアドレスが入ってくる可能性が出てきました。
言葉で説明するよりマトリックスで示したほうが分かりやすいので以下に示します。
Direct [client(192.168.1.200)] ↓ [Varnish(192.168.1.100:6081)] Proxy Protocol [client(192.168.1.200)] ↓ [HAProxy(192.168.1.10:8080)] ↓ [Varnish(192.168.1.100:6086)]
Description | Direct | PROXY Protcol | |
---|---|---|---|
remote.ip | ローカル(Varnish)に接続してきたIPアドレス | 192.168.1.200(Client) | 192.168.1.10(HAProxy) |
client.ip | クライアントのIPアドレス | 192.168.1.200(Client) | 192.168.1.200(Client) |
local.ip | ローカル(Varnish)のIPアドレス | 192.168.1.100:6081(Varnish) | 192.168.1.100:6086(Varnish) |
server.ip | クライアントのコネクションを受けたIPアドレス | 192.168.1.100:6081(Varnish) | 192.168.1.10:8080(HAProxy) |
req_top.* (READ)
トップリクエストのreq.*を参照します、書き込みは出来ません。
何に使えるかというとESIの時に親(top)のreq.urlを知りたいといった時です。
取得できるのはあくまでもリクエストに関わるものなので例えばreq_top.backend_hintみたいなものはありません。
使用できるのは以下です。
req_top.method
req_top.url
req_top.http.*
req_top.proto
beresp.was_304 (BOOL READ)
文字通りbackendから304(Not Modified)が返却され、既に取得しているオブジェクトのリフレッシュに成功した場合にtrueになります。
beresp.age / obj.age (DURATION READ)
オブジェクトが生成されてからの経過時間(Age)を返却します。
beresp.backend (BACKEND READ)
fetchに利用したバックエンドを返却します。
例えばバックエンド名を取得したい場合はberesp.backend.nameとします。
resp.is_streaming (BOOL READ)
ストリーミングされている場合にtrueになります。
パラメータの変更
変更されたもの
workspace_session
4.0.3: 384byte
4.1.0: 512byte
vsl_mask
4.0.3: -VCL_trace,-WorkThread,-Hash
4.1.0: -VCL_trace,-WorkThread,-Hash,-VfpAcct
※VfpAcctは4.1.0で追加されたログ項目
削除されたもの
group
group_cc
listen_address
user
pool_vbc
timeout_req
timeout_idleと統一
追加されたもの
vcl_cooldown
VCLがcold状態に遷移するまでの時間
vmod_std
real2integerが追加されました。
型変換関数でfallbackがなかったものにfallbackが追加されました(time2integer / time2real / real2time)
varnishstat
-wがなくなりました
varnishhist / log / ncsa / top
-tオプションが追加されました(VSMを開く際のタイムアウト設定)
その他
vmodを追加しました
追加したといってもデフォルトで入っているわけではなく別reposです
libvmod_saintmode
Varnish3.0系であったsaintmodeです
libvmod_xkey
セカンダリハッシュを作成します。主にパージに利用し高速に動作します。
恐らくですがVarnishPlusで提供されていたhash-ninjaと同等のものと考えています。
libvmod-rtstatus
varnishstatと同等のデータを出力します
リンク
https://www.varnish-cache.org/docs/trunk/whats-new/changes.html
https://github.com/varnish/Varnish-Cache/blob/4.1/doc/changes.rst