2

Varnish ESI (エッジ サイド インクルード) に問題があります。ESI を使用する部分に、下の画像のような奇妙な文字が表示されることがあります。

ESIのある部分に変な文字が表示されることがある

どうすればこれを修正できますか? おもしろいのは、この問題が発生する場合と発生しない場合があることです。

4

3 に答える 3

3

これは、Varnish の gzip の奇妙なバグのようです。ESI を介して gzip 圧縮されたブロックを取得し、それがキャッシュにない (MISS) 場合、この奇妙なシンボルが表示されます。このブロックをキャッシュから取得すれば、すべて問題ありません。解決策は、内部ルートの gzip を無効にすることです。

if (req.url ~ "/_internal") {
    # Telling ESI that we do not support gzip
    remove req.http.Accept-Encoding;

.....

于 2012-11-26T11:49:49.533 に答える
0

二重に圧縮されたESIコンテンツがあるようです

于 2012-11-15T17:52:20.740 に答える
0

この章では、ESI 処理中に Varnish が gzip とどのように連携するかについて説明します。私はこの文がとても好きです:

理論的には、そしてうまくいけば実際には、ESI を有効にした場合にも上記のすべてが適用されるはずです。そうでない場合は、報告する必要があるバグです。

簡単に言うと、Varnish のしくみ: ページへの最初のリクエスト (キャッシュ ミス) の間、Varnish によって Web サーバーから直接ページがレンダリングされます。その後、ページはキャッシュストレージに配置されるため、次のリクエストではストレージからロードされます (キャッシュヒット)。

どういうわけか、最初のリクエスト中にページはunzippedでレンダリングされますが、ストレージgzippedに配置されます。そして、バグが発生した場所でした。nginx は常にコンテンツを gzip しようとするため、解凍したページに (ESI 中に) gzip でインクルードしました。

この動作は、前述のドキュメントの章で説明されています。

ルックアップ中、オブジェクト Vary: 文字列の「Accept-encoding」は無視されます。オブジェクトの gzip および gunzip されたバージョンを避けるために、varnish は必要に応じて gunzip できます。(このちょっとした魔法をルックアップ時に実装して、永続ストレージに格納されたオブジェクトを gzip サポートが有効になっているかどうかに関係なく使用できるようにします。)

したがって、この問題は一種のスパイクで「解決」できます-ESI処理中にVarnishに常に圧縮されていないコンテンツを強制的に送信させることにより(klipachによる回答の1つで言及されているように):

# www.vcl

sub vcl_recv {
    # ...
    if (req.url ~ "/_internal") {
        # Telling ESI that we do not support gzip
        remove req.http.Accept-Encoding;

        return(lookup);
    }
    # ...
}
于 2012-11-28T11:15:21.527 に答える