Varnish ESIが機能しない

Varnish ESIが機能しない

私の設定は次のようになっています: - nginx ポート 80 - varnish (3.0.4) ポート 6081 - apache ポート 8080

Nginx はリクエストを受け取り、それを Varnish に渡します。Varnish はキャッシュをチェックし、キャッシュから応答を返すか、リクエストを Apache に渡します。Apache では、出力が gzip 圧縮されないように mod_deflate を無効にしました。Varnish 内では、次のようにすべてのリクエストに対して ESI を有効にしました。

sub vcl_fetch {
    set beresp.do_esi = true;
}

私のテスト ファイル (test.php) は次のようになります。

Current time is: <esi:include src="/date.php" /> 

date.php:

<?php
echo date('H:i:s');

しかし、Varnish は esi include を処理しません。varnishlog で次のエラーが発生します:

11 ESI_xmlerror c No ESI processing, first char not '<'

test.php からの応答ヘッダー:

Accept-Ranges:bytes
Age:3
Connection:keep-alive
Content-Length:51
Content-Type:text/html
Date:Sun, 01 Sep 2013 11:51:57 GMT
Server:nginx
Surrogate-Control:"ESI/1.0"
Via:1.1 varnish
X-Powered-By:PHP/5.4.15-1~precise+1
X-Varnish:1236304062 1236304061

HTML 出力は次のようになります。

Current time is: <esi:include src="/name.php" /> 

したがって、ESI は処理されていないことがわかります。

何が間違っているのでしょうか?

答え1

解決しました... サーバー応答の最初の文字が「<」でない場合、ESI は機能しません。私の問題の解決策は、テスト ファイルを標準の HTML 構造でラップするだけで、次のようになります。

<html>
<head>
    <title></title>
</head>
<body>
Current time is: <esi:include src="/name.php" /> 
</body>
</html>

答え2

他の方法は、次のパラメータを指定して Varnish デーモンを実行することです。

-p esi_syntax 0x3

つまり

0x00000001 - Don't check if it looks like XML
0x00000002 - Ignore non-esi elements

関連情報