web-dev-qa-db-ja.com

キャッシングDrupal 7はブーストモジュールとワニスを使用していますが、それでも「MISS」(

私は少しテストをしようとしているので、Drupal7を次のモジュール(有効期限、ブースト、ニス、パージ、ルール、トークン)とともにインストールしました。 varnish-3.0.4-1.el5.centos.x86_64の前でhttpd-2.2.15-29.sl6.x86_64を使用しています。

以下をsettings.phpに追加しました:

// Add Varnish as the page cache handler.
$conf['cache_backends'] = array('sites/all/modules/varnish/varnish.cache.inc');
$conf['cache_class_cache_page'] = 'VarnishCache';
// Drupal 7 does not cache pages when we invoke hooks during bootstrap. This needs
// to be disabled.
$conf['page_cache_invoke_hooks'] = FALSE;

drupal7内のvarnishモジュールに次の設定を行いました。

# drush -r /usr/share/drupal7/ -l XXXXX vget varnish
varnish_bantype: "1"
varnish_cache_clear: "2"
varnish_control_key: "XXXXX"
varnish_control_terminal: "XXX.XX.XXX.XX:6082"
varnish_flush_cron: "0"
varnish_socket_timeout: 100
varnish_version: "3"
# 

それでもMISSを取得し続けます

# curl -I XXXXX
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Scientific Linux)
X-Powered-By: PHP/5.3.3
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Thu, 24 Oct 2013 14:42:21 +0000
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
ETag: "1382625741"
Content-Language: en
X-Generator: Drupal 7 (http://drupal.org)
Content-Type: text/html; charset=utf-8
x-url: /
x-Host: XXXXX
Accept-Ranges: bytes
Date: Thu, 24 Oct 2013 14:42:21 GMT
X-Varnish: 1527289503
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: XXXXX
X-Cache: MISS

#

Configuration-> Performanceに移動してCachingを有効にしても、HITが発生しますが、Status Reportは次のメッセージ(Cachingを有効にした後)Boost will not function properly while Drupal core cache is enabled. Disable Boost or the core cache.

*更新*

Cache-Control:[〜#〜] is [〜#〜]があるので、これはboostを有効にした後です、まだVarnish(からMISSを取得しています

$ curl -I http://XXXXX/node/1
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Scientific Linux)
Last-Modified: Mon, 28 Oct 2013 15:53:48 GMT
ETag: "802449-1da7-4e9cf1b11461e"
Accept-Ranges: bytes
Content-Length: 7591
Cache-Control: max-age=1209600
Expires: Mon, 11 Nov 2013 15:55:46 GMT
Content-Type: text/html; charset=UTF-8
x-url: /node/1
x-Host: XXXXX
Accept-Ranges: bytes
Date: Mon, 28 Oct 2013 15:55:46 GMT
X-Varnish: 1527308733
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: XXX.XXXXX.XXX
X-Cache: MISS

$ 

何が悪いのですか?

3
alexus

Drupalから返されたCache-Controlヘッダーに注意してください。

Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0

Cache-Controlno-cacheに設定されている場合、Varnishはデフォルトでそれを尊重します。ワニス内からvcl_fetchでキャッシングを強制するか、(はるかに良い)Drupal適切なヘッダー(Cache-Control: public, max-age=X)を配信する)にする必要があります。後者を実現する最も簡単な方法アドミニストレーション"構成"開発で "匿名ユーザーのキャッシュページ"を有効にし、 "キャッシュページの有効期限"も設定します。次のコマンドを使用して、これらの設定をハードコーディングできます。

$conf['cache'] = 1;
$conf['page_cache_maximum_age'] = 3600; // 1h

Cache-Controlを実装してカスタムモジュールを使用して明示的に追加することにより、hook_exitヘッダーを強制することもできます。適切な保存の実装は次のようになります。

/**
 * Implements hook_exit().
 *
 * @see drupal_serve_page_from_cache()
 */
function MYMODULE_exit($destination = NULL) {
  // If the client sent a session cookie, a cached copy will only be served
  // to that one particular client due to Vary: Cookie. Thus, do not set
  // max-age > 0, allowing the page to be cached by external proxies, when a
  // session cookie is present unless the Vary header has been replaced or
  // unset in hook_boot().
  $vary_header = drupal_get_http_header('vary');
  $max_age = !isset($_COOKIE[session_name()]) || isset($vary_header) ? variable_get('page_cache_maximum_age', 0) : 0;

  if (drupal_page_is_cacheable() && $max_age && $destination == NULL && !headers_sent()) {
    drupal_add_http_header('Cache-Control', 'public, max-age=' . $max_age);
  }
}

また、boostはCache-Controlヘッダーも追加するため、vcl_fetchにVCLロジックを導入する必要があることにも注意してください。次のフラグメントは、Cache-Control no-cacheを使用したブーストを使用して配信された場合でも、Varnishにページをキャッシュに保存させます。

sub vcl_fetch {
  if (beresp.http.X-Cached-By ~ "Boost") {
    set beresp.ttl = 1 h;
  }
}
7
znerol