2012-04-10 3 views
1

ESI를 로컬 환경에서 처리하도록 바니시를 설정하려고합니다.바니시 처리 안 함 ESI 포함

가상 컴퓨터에서 바니시를 실행 중이고 콘텐츠가 호스트 컴퓨터에서 실행 중입니다.

두 개의 파일 "index.html"과 "test.html"이 있습니다. 이것들은 모두 아파치 서버의 docroot에있는 "esi"라는 폴더에 저장되어 있습니다.

index.html을

<h1>It Works!</h1> 
<esi:include src="test.html" /> 

test.html를

<p>ESI HAS BEEN INCLUDED</p> 

니스 포트 8000에 가상 머신에서 실행되는 그래서 내가 여기에 액세스 : http://192.168.56.101:8000/esi/

가상 머신에서 /etc/varnish/default.vcl에 followin c를 추가했습니다.

sub vcl_fetch { 
    set beresp.do_esi = true; /* Do ESI processing    */ 
    set beresp.ttl = 24 h; /* Sets the TTL on the HTML above */ 
} 

는 모든 요청에 ​​ESI를 처리

결과를 (그것의 나쁜 관행 그냥 :) 일이 일을 얻으려고 노력하는 경우 치료를하지 말라)해야한다는 생각으로 : 파일의 맨 아래에 onfig 로드 할 때 http://192.168.56.101:8000/esi/은 다음과 같습니다.

예 : ESI는 마크 업에 표시되며 처리되지 않습니다.

나는 바니시 로그를 확인했지만 오류는없고 ESI와 관련이 없습니다.

내가 여기서 잘못하고있는 것을 누구든지 볼 수 있습니까? 감사합니다. 더 많은 정보가 필요하면 알려주세요. 감사합니다.

+0

Varnish> 3.0을 사용하고 있습니까? 새 구문을 사용하고 있기 때문에 ... – ivy

답변

1

src가 "test.html"인 경우, varnish는 해당 요청을 기본 백엔드 인 127.0.0.1로 보냅니다. 원격 서버에 대한 두 번째 백엔드를 구성해야한다고 생각합니다. 이런 식으로 뭔가가 :

backend default { 
    .host = "127.0.0.1"; 
    .port = "8000"; 
} 

backend hostmachine { 
    .host = "50.18.104.129"; # Enter your IP address here 
    .port = "80"; 
} 

는 그런 다음 서브 vcl_recv에서 원격 서버로 URL에/ESI /가 트래픽을 리디렉션해야합니다.

sub vcl_recv { 
     if (req.url ~ "^/esi/") { 
      set req.backend = hostmachine; 
      set req.http.host = "www.correctdomainname.com"; 
     } else { 
      set req.backend = default; 
     } 
} 

저는 지금 당장 같은 일을하고 있습니다. 그래서 지금 시도하고 있습니다.

+2

이 답변이나 다른 답변은 어떻게 대답합니까? OP (와 나)는 같은 서버의 무언가를 포함하기를 원한다. 그리고 'sub vcl_fetch'에는'set beresp.do_esi = true; '가 포함되어 있어도 바니시는 백엔드에 대한 포함 요청을하지 않아서 esi 태그를 덤프한다. 응답. 이것은 구글에서 높은 것으로 나타났습니다. 그러나 나는이 답변이나 다른 답변이 실제로 어떻게 대답 하는지를 보지 못했습니다. – HMR

1

바니시는 ESI의 일부만 구현했습니다. 2.1 세 ESI 문으로 :

esi:include 
    esi:remove 
    <!--esi ...--> 

내용 변수와 쿠키를 기반으로 대체가 구현되지 않고 로드맵에 있습니다. 바니시는 HTML 주석에서 ESI 명령어를 처리하지 않습니다. ESI를 들어 는이 같은 VCL에서 ESI 처리를 활성화해야 작동합니다 : ESI를 들어

sub vcl_fetch { 
if (req.url == "/index.html") { 
    set beresp.do_esi = true; /* Do ESI processing    */ 
    set beresp.ttl = 24 h; /* Sets the TTL on the HTML above */ 
} elseif (req.url == "/test.html") { 
    set beresp.ttl = 1m;  /* Sets a one minute TTL on  */ 
          /* the included object   */ 
} 

}

1

은 (니스 (3)를 작동합니다.

index.php를

<html> 
<head> 
    <title></title> 
</head> 
<body> 
<?php 

    $now = new \DateTime('now'); 
    echo "hello world from index.php ".$now->format('Y-m-d H:i:s'); 
?> 

<br/> 

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

<br/> 

<esi:remove> 
    ESI NOT AVAILABLE 
</esi:remove> 

<br/> 

<!--esi 
ESI AVAILABLE !! 

--> 
</body> 
</html> 

date.php

: X), 첫 번째 문자는 "<"그렇게 간단하게 추가 HTML 구조

여기

내 테스트를해야합니다

<?php 
$now = new \DateTime('now'); 
echo "hello world from date.php ".$now->format('Y-m-d H:i:s'); 

출력 :

hello world from index.php 2014-08-21 10:45:29 
hello world from date.php 2014-08-21 10:46:35