2011-01-05 3 views
11

레일 스택에 의해 렌더링되지만 자주 변경되지 않는 웹 애플리케이션의 전체 페이지 (수천 페이지)를 캐싱하고 싶습니다. 각 렌더링은 리소스면에서 상당히 비쌉니다.Varnishd는 Rails와 함께 사용할 올바른 캐싱 솔루션입니까?

Varnishd의 작동 방식을 이해하면 Varnishd는 캐시 저장소를 확인하고 미스가 발생하므로 요청이 생성되어 Rails와 결과 페이지로 전달됩니다 그런 다음 Varnishd 캐시에 추가됩니다.

이후에 해당 URL에 대해 호출 한 다음 Varnishd 캐시에서 제공 한 경우 Rails 스택은 관련되지 않습니다.

정확합니까?

캐시 저장소의 변경 사항을 반영하여 특정 페이지가 &으로 업데이트되면 내 앱이 Varnishd에게 어떻게 알릴 수 있습니까?

Varnishd는 이러한 목적에 적합한 선택입니까?

도움을 주셔서 감사합니다. 저는 이것이 매우 기본적인 질문이라는 것을 알고 있지만, 의사는 분명히이 사실을 (적어도 저에게) 밝히지는 않습니다. http://www.mnot.net/cache_docs/

당신이 당신의 HTTP 응답에 만료 시간을 지정해야합니다 캐싱과 역방향 프록시를 사용하려면 :

답변

3

나는 마크 노팅엄에서 HTTP 캐싱이 설명서를 읽어 보시기 바랍니다. 프로토콜이 인터넷을 통해 통합되기 때문에 새 콘텐츠를 사용할 수있는 경우 캐싱 서버에 "알리는"것은 일반적으로 불가능합니다. 새로운 kittin 사진이있는 경우 전 세계 어디서든 서버에 알릴 필요가 없습니다.)

레일 페이지 캐싱은 전혀 다릅니다. 이것은 파일을 정적으로 제공하기 위해 웹 서버로 작업량을 줄이지만 결정에 http 프로토콜을 포함하지 않습니다.

경고 : 나는 개인적으로 광택을 시도하지 않았 음을 지적해야합니다. 이 답변은 Varnish가 http 캐싱 리버스 프록시임을 (나는 생각한다) 가정에 기반합니다.

+1

맞음, 바니시는 HTTP 캐시가 있고 HTTP 캐시에 최적화 된 HTTP 역방향 프록시입니다. Heroku를 시도했다면, 당신은 Varnish를 시도했습니다. – yfeldblum

+1

대부분의 역방향 프록시는 실제로 새 콘텐츠를 사용할 수 있음을 캐시에 알려주는 방법을 제공하지만 플러시 할 서버를 알 고 신호를 보낼 수있는 방법을 구성해야합니다. Varnish에는 응용 프로그램 또는 수동으로 연결할 수있는 관리 인터페이스 인 제어 채널이 있으므로 어떤 서버를 플러시 할 것인지 알면 매우 쉽게 수행 할 수 있습니다. –

1

noodl의 답변에서 언급했듯이 역방향 프록시를 사용하면 일반적으로 페이지 만료가 사용자의 통제에서 제외됩니다. 또 다른 접근법은 레일을 page caching (1.1 절 참조)을 사용하는 것입니다 만 만료를 관리해야 할 필요가 있기 때문에 레일스는 처음으로 조치가 호출 될 때 디스크에 대한 응답을 디스크 (공용 디렉토리)로 렌더링하고 앞면 end 웹 서버가 해당 html 파일을 직접 제공합니다. 나는 이것을 위해 nginx를 사용하고 존재하는 정적 파일 (일반적으로 이미지이지만, .html 확장자를 설명하기 위해 올바른 재 작성으로 html 페이지에서도 작동 함)을 제공하는 지시문을 가진다. 캐시로 레일을 관리하면 지침 페이지의 예와 같이 새 항목이 만들어 질 때 색인이 만료되는 것처럼 자신이 만료 될 수 있습니다.

리버스 HTTP 프록시는 캐시가 컨트롤 외부의 네트워크 부분에 전파 될 수 있기 때문에 매우 높은 처리량이 필요할 때 성능을 높이는 데 도움이되지만 권장하는대로 렌더링 시간 인 경우, 그러면 레일 캐싱이 좋은 옵션이 될 수 있습니다.

+0

사실 ... 요즘은 TTL을 치기 전에 캐시 무효화를 지원하지 않는 전용 역방향 프록시를 찾는 것이 거의 없습니다. 그것은 중요한 유스 케이스의 일종입니다. 일반적으로 표준 HTTP 캐싱 헤더를 사용하여 완료되지 않습니다. –

+0

아, 그게 알아두면 좋을 것 같습니다. 그 일을하는 방법을 언급하는 새로운 대답이 있습니다. – Jeremy

5

동적 캐시 무효화를 수행하려면 응용 프로그램 서버에서 관리 채널을 통해 purge.url {some regexp}을 보낼 수 있습니다. 예 : purge.url "^/some/page/$". 그러나 Rails에서는 PURGE HTTP 메소드를 사용하는 것이 가장 쉽습니다.그래서 대신 HTTP GET을하고, 당신은 같은 URI에 대해 PURGE을 할 거라고 :

PURGE /some/page/ HTTP/1.0 
Host: example.com 

이 요청을 사용하면 구성이를 오버라이드 (override)하지 않는 한 localhost에서오고있다.

일부 링크 :

1

페이지 캐싱 당신은 아마 원하는 것입니다. Varnish보다 설치 및 유지 보수가 더 쉽습니다. 리버스 프록시를 사용하여 캐시하면 각 응용 프로그램 서버 대신 단일 위치에서 캐시를 무효화 할 수 있기 때문에 여러 응용 프로그램 서버로 확장하기 시작할 때 몇 가지 장점이 있습니다.

HTTP PURGE 요청에 응답하도록 Varnish를 구성 할 수 있습니다. 그러면 Rails가 페이지가 변경되었을 때 Varnish에 알릴 수 있습니다. 이 줄에는 pluginarticle이 있습니다.

+1

간단한 캐싱이 필요한 경우 yes입니다. 캐싱 시스템을 원격으로 복잡하게 수행해야하는 경우 레일스 페이지 캐싱이 부족할 수 있습니다. Varnish는 대부분의 사람들이 Rails 페이지 캐싱을 능가하는 시점에서 정말 빛을 발합니다. –