![바니시 ESI가 작동하지 않습니다](https://rvso.com/image/617238/%EB%B0%94%EB%8B%88%EC%8B%9C%20ESI%EA%B0%80%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
다음과 같은 구성이 있습니다. - 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