2011-09-07 4 views
0

나는 이것을 수행하는 방법에 대해 VCL을 이해하려고 미친 듯이 노력했으며 불가능하다고 생각하기 시작했습니다. 여러 다른 호스트에 서비스를 제공하는 여러 개의 백엔드 응용 프로그램 서버가 있습니다. 모든 호스트의 페이지를 캐시하고 요청에서 원래 호스트 정보 ("www.site.com")가있는 앱 서버에 캐시가 누락 된 요청을 보내려면 바니시가 필요합니다. 그러나 모든 VCL 예제에서는 백엔드 서버 (예 : "backend1")에 특정 호스트 이름을 사용해야합니다. 이 주위에 어떤 방법이 있습니까? 캐시 미스가 IP를 가리키고 요청 호스트를 그대로 유지하는 것이 좋습니다.백엔드 가상 호스트가있는 가상의 라운드 로빈 디렉터

는 여기에 내가 지금 가지고있는 무엇 : 등

backend app1 { 
    .host = "192.168.1.11"; 
    .probe = { 
      .url = "/heartbeat"; 
      .interval = 5s; 
      .timeout = 1 s; 
      .window = 5; 
      .threshold = 3; 
    } 
} 

backend app2 { 
    .host = "192.168.1.12"; 
    .probe = { 
      .url = "/heartbeat"; 
      .interval = 5s; 
      .timeout = 1 s; 
      .window = 5; 
      .threshold = 3; 
    } 
} 

director pwms_t247 round-robin { 
    { 
     .backend = app1; 
    } 
{ 
     .backend = app2; 
    } 
} 

sub vcl_recv { 
    # pass on any requests that varnish should not handle 
    if (req.request != "HEAD" && req.request != "GET" && req.request != "BAN") { 
    return (pass); 
    } 

    # pass requests to the backend if they have a no-cache header or cookie 
    if (req.http.x-varnish-no-cache == "true" || (req.http.cookie && req.http.cookie ~ "x-varnish-no-cache=true")) { 
    return (pass); 
} 

# Lookup requests that we know should be cached 
if (req.url ~ ".*") { 
    # Clear cookie and authorization headers, set grace time, lookup in the cache 
    unset req.http.Cookie; 
    unset req.http.Authorization; 
    return(lookup); 
} 

}

...

이 나는 ​​중요한 일을 언급 무시하면 내 첫 번째 StackOverflow의 질문이 너무 알려 주시기 바랍니다입니다! 감사.

답변

0

나는 모든 호스트에 대한 캐시 페이지에 니스를 필요로하고 요청 ("www.site.com")의 원래 호스트 정보와 응용 프로그램 서버에 캐시를 그리워 요청을 보냅니다. 그러나 모든 VCL 예제 날

backend1이 호스트 이름없는 내 백엔드 서버 (예 : "backend1")에 대한 특정 호스트 이름을 사용하도록 을 필요로하는 것, 그것은과 백엔드 정의의 IP 주소. vcl 파일 (요청이 프록시되는 백엔드)에 라우팅 논리를 정의하고 있지만 요청에서 호스트 이름을 변경하지는 않습니다. 무엇을 요구하고 있습니까 (호스트 이름을 동일하게 유지하십시오)는 기본 동작입니다.

+0

기술적으로 정답입니다. 아이비입니다. 그러나 문제는 결국 내 프로브 요청에 호스트 정보가 없었기 때문에 nginx는 올바른 가상 호스트에 하트 비트 GET 요청을 보내는 방법을 알지 못했습니다. 필자는 프로브 요청을 수동으로 수행하여이 문제를 해결했습니다. – jeremy6d

3

내가 실제로 작동해야하는 것은 다음과 같습니다. 왜냐하면 그의 대답은 기술적으로 정확하고 문제점 중 하나가 나의 호스트 (그들은 정상적인 웹 요청이 통과하지 못하게하는 포트를 막고 있었기 때문) 때문입니다. 내가 겪고있는 진짜 문제는 하트 비트 메시지에 호스트 정보가 없었기 때문에 가상 호스트가 올바르게 라우팅 할 수 없었습니다.

backend app1 { 
    .host = "192.168.1.11"; 
    .port = "80"; 
    .probe = { 
      .request = "GET /heartbeat HTTP/1.1" 
         "Host: something.com" 
         "Connection: close" 
         "Accept-Encoding: text/html" ; 
      .interval = 15s; 
      .timeout = 2s; 
      .window = 5; 
      .threshold = 3; 
    } 
} 
관련 문제