Varnishのタイムアウト
慣れないながらも、Ploneのアクセラレータ用にVarnishを利用しています。
匿名アクセスの場合はそれなりに早いかな、と感じるようになりましたが、逆に、いろいろと「あれれ~?」な現象も出てきました。
コンテンツのCacheを行うことで、ユーザ側から見たパフォーマンスを改善するのが目的なので、当然古いデータが見えてしまったり、更新が即座には反映されなかったりします。
具体的には、このようなパターン。
- 匿名アクセス、匿名でのコメントがOKなコンテンツに対し、匿名アクセスでコメントを行うと、ページを再読み込みしても投降したコメントが表示されない。
- Varnishのメモリにキャッシュさせないといけないので、コンテンツの1回目の読み込みだけは時間がかかることがある。
(誰かがすでに同じページにアクセスしていれば、その恩恵にあずかることはでるけれど)
また、わたしの環境の場合だけかもしれませんが、Ploneの更新情報(RSS)が、Varnishを通した場合、更新されなくなってしまいました。
具体的には、ブラウザからRSSの画面にアクセスして表示する場合は問題ないのですが、Thunderbirdに付属のRSSリーダーやSharpReaderなどの、専用のRSSリーダーは、最初の一回目のRSSの読み込み以降、その後の更新を検知してくれなくなってしまったのです…。
Varnishは設定ファイルによって、メモリのキャッシュを返したり、バックエンドにリクエストを通したりという動作を振り分けるのですが、RSSリーダなどは匿名アクセス扱いになってしまいます。しかも、どういうわけか、Last-Modifiedもあまり認識してくれないようでした…。
仕方がないので、Ploneに限ってなのですが、末尾が “/RSS” というURLの場合は、varnish.vcl を調整して、Varnishのメモリを使わないようにしてみました。(赤字の部分です)
if (req.http.Authenticate || req.http.Authorization) {
pass;
}
# We only care about the "__ac.*" cookies, used for authentication
if (req.http.Cookie && req.http.Cookie ~ "__ac(|_(name|password|persistent))=") {
pass;
}
# File type that we will always cache
if (req.request == "GET" && req.url ~ "\.(gif|jpg|swf|css|js|png|jpg|jpeg|gif|png)$") {
lookup;
}
if (req.request == "POST") {
pipe;
}
# Added on 20091201 not to cache RSS info.
if (req.request == "GET" && req.url ~ "/RSS$") {
pipe;
}
もう一点困ったこと、というと、Ploneの管理画面にアクセスし、Indexの再構築などの重い処理を行うと、Zopeからのレスポンスが返ってくるまでに時間がかかり、Varnishがタイムアウトでエラーを起こすようになってしまう、ということでした。
また、片方で重い操作をしていて、別のユーザがPloneにアクセスした際にも、全体でパフォーマンスが落ちていると、Varnishがタイムアウトを起こしてしまいます。
この間隔が思ったよりも短く、何も設定しないでおくと、ユーザさんには、下記のような意味不明の恐ろしげなエラーが表示されてしまいます。
"Error 503 Service Unavailable Backend did not respond. Guru Meditation: XID: 456452130".
デフォルトではどうも短すぎるので、下記のURLを参考に、タイムアウトの値を調整してみることにしました。
- http://vincentfretin.ecreall.com/articles/varnish-guru-meditation-on-timeout
- http://varnish-cache.org/wiki/VCL (Varnish本家のTracのドキュメント)
といっても、以下のように1行加えただけ。
backend default {
# Your Zope / Plone instance.
.host = "localhost";
.port = "8080";
.first_byte_timeout = 300s; #ここを追加
}
本当は、ZopeをZEO化して、重い処理は別プロセスで行って、参照専用のリクエストには影響がないように作りたいのですが、そこまでは、まだまだ…。
コメント
コメントを投稿