![Varnish ESIが機能しない](https://rvso.com/image/617238/Varnish%20ESI%E3%81%8C%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%84.png)
私の設定は次のようになっています: - 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