私は少しテストをしようとしているので、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
$
何が悪いのですか?
Drupalから返されたCache-Control
ヘッダーに注意してください。
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
Cache-Control
がno-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;
}
}