web-dev-qa-db-ja.com

Drupal 7のVarnish 4.0 vcl

Drupal7、Varnish 4.0、Ubuntu 12.4

Varnishは動作するようにインストールされていますが、断続的な503を返します。Varnishがバックエンドに移動するたびに、と思います。リクエストが503を返したとしても、ページの更新が200 HITをキャッシュから返すことがあります。別のリフレッシュは200または503です。次の503はHIT-FOR-PASSだと思います。

次のように、タイムアウトを開放しました。

vcl 4.0;
backend default {
.Host = "127.0.0.1";
.port = "8080";
.probe = {
.url = "/ping";
.timeout = 600s;
.interval = 600s;
.window = 5;
.threshold = 2;
}
.first_byte_timeout = 900s; # How long to wait before we receive a first byte from our backend?
.connect_timeout = 500s; # How long to wait for a backend connection?
.between_bytes_timeout = 200s; # How long to wait between bytes received from our backend?
}

だから、ワニスが瞬く間にタイムアウトになるのではないでしょう。

おそらく問題はvclにあります。これは私が使用しているものです: https://github.com/mattiasgeniar/varnish-4.0-configuration-templates/blob/master/default.vcl

これは、同じページへの3つの連続した呼び出しのワニスログのフラグメントです:503、次に200、そして再び503:

First call - returns 503
-   VCL_call       BACKEND_FETCH
-   VCL_return     fetch
-   FetchError     no backend connection
-   Timestamp      Beresp: 1408509130.524000 0.000219 0.000219
-   Timestamp      Error: 1408509130.524013 0.000232 0.000013
-   BerespProtocol HTTP/1.1
-   BerespStatus   503
-   BerespReason   Service Unavailable
-   BerespReason   Backend fetch failed
-   BerespHeader   Date: Wed, 20 Aug 2014 04:32:10 GMT
-   BerespHeader   Server: Varnish
-   VCL_call       BACKEND_ERROR
-   BerespHeader   Content-Type: text/html; charset=utf-8
-   BerespHeader   Retry-After: 5

ページの更新-キャッシュから200を返しますVCL_returnハッシュ-VCL_call HASH-VCL_return lookup-ヒット2147745802-VCL_call HIT-VCL_return deliver-RespProtocol HTTP/1.1-RespStatus 200-RespReason OK

別の更新-再び503を返します。

  • VCL_call HASH
  • VCL_returnルックアップ
  • 「XXXX HIT-FOR-PASS」のデバッグ
  • HitPass 2147811368
  • VCL_call PASS
  • VCL_returnフェッチ
  • リンクbereq 196777パス
  • タイムスタンプフェッチ:1408509419.224633 0.000666 0.000666
  • RespProtocol HTTP/1.1
  • RespStatus 503
  • RespReasonバックエンドのフェッチに失敗しました

Vclを正しく理解するための手がかりはありがたいです。

2
August1914

リンクしたVCLと質問の例は、1つのバックエンドのみを使用していることを示しています。この場合、ヘルスチェックを行うためにプローブを使用しても意味がありません。 Drifteaurの回答によると、プローブを無効にすると503の問題の多くが解決され、必要がないため、問題は解決されます。

ただし、複数のバックエンドでのロールアウトに向けて作業をテストしている場合は、修正する必要があります(理解)。

リンクしたVCLを見る( https://github.com/mattiasgeniar/varnish-4.0-configuration-templates/blob/master/default.vcl )これは、以下から取得した多くのセクションを使用します- https://www.varnish-software.com/ これらが正しいことを(うまくいけば)推測できるようにします。

現在、プローブはホストとポート127.0.0.1:8080で「/ ping」からの応答をチェックしているため、127.0.0.1:8080/pingになります。

設定が1つのサーバー上の複数の仮想ホストであり、ワニスが前にある場合、このようなプローブを使用しても応答が得られず(この完全なURLが構成されていない可能性が高いため)、これにより、バックエンドが「 sick/unhealthy」と表示され、503が生成されます。ワニスはバックエンドへのアクセスも試みないためです。

サーバーのセットアップであることを確認するには、プローブに以下を追加します。

backend default {
    .Host = "127.0.0.1";
    .port = "8080";
    .probe = {
              .request =
              "HEAD / HTTP/1.1"
              "Host: www.EXAMPLE.com"
              "Connection: close";
              }
}

Www.EXAMPLE.comをサーバーで使用している実際のドメインに変更する必要があります。

これにより503ではなく200が得られる場合は、サーバーの設定と同じようにプローブを使用しても互換性がないことを確認しても安全です。

プローブ情報: https://www.varnish-cache.org/docs/trunk/reference/vcl.html#reference-vcl-probes

1
Taylor Taff

同じ設定とDrupalで同じ問題(503)が発生しました。バックエンド構成の.probe部分をコメント化することで解決しました。なぜそれが助けになったのかわからない。

0
drifteaur