0

ローカルに Varnish をセットアップし、ページの特定の領域に ESI フラグメントを実装しました。しかし、default.vcl で ESI をオンにするとすぐに、ワニスはキャッシュを停止し、さらにフラグメントが追加されたページの特定のセクションでは、代わりに 503 サービスを利用できないという通知が表示されます。

ワニスがキャッシュを停止するように見える行は、次のelseステートメントです。

if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
    unset beresp.http.set-cookie;
    set beresp.ttl = 20m;
}
else {
    set beresp.do_esi = true;
}

ここに私の default.vcl があります: http://pastebin.com/MEQF4Gbk

今、RxHeaders で多くの「ESI_xmlerror c No ESI processing, first char not '<'」を取得します。

RxHeaders の 1 つのサンプル (JS ファイル用) http://pastebin.com/tX7zpBN1

esiフラグメントがある場合にのみワニスにキャッシュするように指示する方法を理解していないと思いますか?誰かが私が間違っていることを説明できますか?

4

1 に答える 1

0

vcl は、esi を含むページだけでなく、esi フラグメント自体の esi 処理を行うように設定されており、後者は失敗して、必要なスニペットではなく 503 が発生します。フラグメントを esi コンテナー自体として再帰的に処理したくない場合は、VCL を次のように変更できます。

if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
    unset beresp.http.set-cookie;
    set beresp.ttl = 20m;
}
else if (req.esi_level == 0 ) {
    set beresp.do_esi = true;
}

これらのインクルードを esi コンテナー自体として処理したい場合は、それらが山括弧で始まることを確認してください<(varnish 2 のデフォルトでは、html/xml の esi のみを実行します)。それが不可能な場合は、varnishd の起動時に次のパラメーターを設定することで、varnish が気にしないように構成できます。

esi_syntax=0×1

私があなただったら、あなたが行っているように選択したコンテンツ タイプに対して無効にするのではなく、esi:includes を含むことができるリソースに対して特に esi を有効にします。このように、変更される可能性のある VCL のリストを維持する必要はありません。esi インクルードを含まないリソースは、それらをスキャンするワニスの時間を無駄にしません。これは、X-Varnish-Do-Esi などのバックエンドからの応答ヘッダーに基づいて実行でき、インクルードを含むリソースの応答ヘッダーのみを送信できます。

于 2013-07-17T19:44:03.137 に答える