바니시 ESI가 작동하지 않습니다

바니시 ESI가 작동하지 않습니다

다음과 같은 구성이 있습니다. - nginx 포트 80 - varnish(3.0.4) 포트 6081 - Apache 포트 8080

Nginx는 요청을 받아 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" /> 

날짜.php:

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

그러나 Varnish는 esi 포함을 처리하지 않습니다. 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

관련 정보