0

Varnish がこれらのページの古いキャッシュ バージョンを引き続き提供するようにすることで (別名、グレース モード)、200 OK 応答で空白ページの提供を開始するバックエンド サーバーを回避しようとしています。

最初に の応答を調べてみましたvcl_fetchが、把握できる限り、 のコンテンツの長さを把握する方法はありませんvcl_fetchvcl_deliver次に、 (Content-Length ヘッダーが利用可能な場所) で作業を試みました。それは機能しますが、キャッシュされた不良オブジェクト (空白のページを持つオブジェクト) を消去する方法がわかりません。

obj.grace と obj.ttl を に設定するようにアドバイスされましたvcl_deliver。これが現在のコードです。

sub vcl_deliver {
  # If the front page is blank, invalidate this cached object, in hope
  # that we'll get a new one.
  if (req.url == "/" && std.integer(resp.http.content-length, 0) < 1000) {
    set obj.grace = 0m;
    set obj.ttl = 0m;

    return(restart);
  }
}

しかし、Varnish はそれを好まず、VCL をロードしようとすると次のエラーが表示されます。

Message from VCC-compiler:
'obj.grace': cannot be set in method 'vcl_deliver'.
At: ('input' Line 146 Pos 9)
    set obj.grace = 0m;
--------#########------

obj.ttl行を削除すると、同じエラーが発生します。ドキュメントにはそうではないと書かれていますが、obj.graceどちらも書き込み可能ではないようです。これは Varnish 3.0.2 にあります。vcl_deliver

4

2 に答える 2

2

私がしたことは、sub_vcl_fech で 0 と 20 の Content-Length をチェックし、これが発生したときに再起動することです

if (beresp.http.Content-Length == "0" || beresp.http.Content-Length == "20"){
    return(restart);
}

コンテンツの長さ 20 は、エラーが発生したときにサーバーが返したものです。

サブ vcl_recv で、最大 2 回の再起動の量に関するチェックを追加しました

if(req.restarts == 2){
   error 500 req.http.host;
}

オプション 2

ワニスのドキュメントから得た別のオプション。 https://www.varnish-cache.org/docs/3.0/tutorial/handling_misbehaving_servers.html

  1. 次のような vcl_fetch でエラーをスローします。error 751 req.http.host;
  2. vcl_error にマジック マーカーを追加します。
  3. リターン(再起動)を追加します。vcl_error で
  4. vcl_recv または vcl_fetch に設定されたマジック マーカーを確認します
于 2014-08-04T13:00:29.920 に答える
0

vcl_deliverでこれを行うのは遅すぎます。このサブは、コンテンツをクライアントに送信する直前に呼び出され、objは使用できなくなります(ttlまたはgraceパラメーターを含まない'resp'のみ)。

vcl_fetchでこれを実行してみましたか?'restart'を呼び出す必要はありませんが、直接'hit_for_pass'を呼び出す必要があります。

とにかく、(それについてはよくわかりませんが)コンテンツの更新を取得できない場合(バックエンドの障害)にトリガーされることになっているため、応答コンテンツによってはグレースモードを使用できないと思います。バックエンドを「ゾンビ」に変更してリクエストを再開することで機能する可能性がありますが、確かに、vcl_fetchに入ると、応答がフェッチされ、グレースモードはトリガーされません。

于 2012-04-02T15:48:58.097 に答える