Varnishのpipeについて
Varnishを本番導入してみたけど時々変な挙動します。どうやらpipeを使っているかららしいです。
pipe
VarnishのVCL中でreturn(pipe)と呼ぶことにより、VarnishはTCP proxyのように振る舞うことが出来ます。 つまりVarnishへのClientとBackendが直接通信するような形となります。 ただこの場合Varnishがその通信に対して介入しないため不都合な点がいくつか出ます。
基本的にログが出なくなる
バイト列を流すだけになるのでログがでなくなりますvarnishlogでもvarnishncsaでも。今は一番最初のRequestはログを吐くようになりましたけど、それ以外は吐きません。 今回の僕の場合もログちゃんと吐いてくれなくてなにやってるかわからなくて死にそうでした。
流すbackendを誤ることがある
まさにこれでした。 一度backendとコネクションを張ってしまうと、別のリクエストに対してもこのコネクションが利用されます。この場合vcl_recvでのbackendの設定も呼ばれません。するとコネクション張りっぱの、誤ったbackendへリクエストが流れてしまいます。 これを防ぐ方法は毎回コネクションを切断することです。
sub vcl_pipe { set bereq.http.connection = "close"; }
キャッシュしない
右から左へながすだけなので、もちろんキャッシュできません。 ただこれは逆にメモリを使わなくて済むというメリットにもなります。4GBのISOでも平気です。 ビデオのストリーミングにも有効です。