2011-01-05 23 views
11

Tôi muốn lưu vào bộ nhớ cache toàn bộ các trang trên ứng dụng web của chúng tôi (hàng nghìn trang) được tạo bởi ngăn xếp Rails, nhưng không thay đổi thường xuyên. Mỗi kết xuất khá tốn kém về mặt tài nguyên.Varnishd là giải pháp bộ nhớ đệm phù hợp để sử dụng với Rails?

Sự hiểu biết của tôi về cách Varnishd hoạt động là khi một cuộc gọi ban đầu được thực hiện đến URL, Varnishd sẽ kiểm tra lưu trữ bộ nhớ cache của nó, lỗi sẽ diễn ra và yêu cầu sẽ được chuyển đến Rails và trang được tạo sau đó được thêm vào bộ nhớ cache Varnishd.

Bất kỳ cuộc gọi tiếp theo nào được thực hiện cho URL đó và sau đó được cung cấp từ bộ nhớ cache Varnishd, ngăn xếp Rails không được tham gia.

Điều này có đúng hay không?

Làm cách nào để ứng dụng của tôi có thể thông báo cho Varnishd khi một trang cụ thể đã được cập nhật & để phản ánh bất kỳ thay đổi nào được thực hiện trong kho lưu trữ bộ nhớ cache của nó?

Varnishd có phải là lựa chọn tốt cho mục đích này không?

Cảm ơn sự giúp đỡ của bạn - Tôi biết đây là những câu hỏi rất cơ bản, nhưng tài liệu không làm rõ điều này (với tôi ít nhất).

Trả lời

3

tôi khuyên bạn nên đọc hướng dẫn này để HTTP bộ nhớ đệm Mark Nottingham: http://www.mnot.net/cache_docs/

Để sử dụng một proxy ngược với bộ nhớ đệm bạn sẽ cần phải xác định thời gian hết hạn trong phản ứng http của bạn. Nói chung không thể "nói" máy chủ lưu trữ khi có nội dung mới vì giao thức có nghĩa là được liên kết trên internet và bạn sẽ không muốn nói với các máy chủ ở mọi nơi trên thế giới khi bạn có ảnh kittin mới:)

Bộ nhớ đệm trang đường ray không giống nhau. Điều đó chỉ làm giảm tải công việc cho máy chủ web để phục vụ các tệp tĩnh nhưng không liên quan đến giao thức http trong quyết định.

Lưu ý: Tôi nên chỉ ra rằng tôi đã không cố gắng Varnish cá nhân. Câu trả lời này được dựa trên giả định (tôi nghĩ đúng) rằng Varnish là một proxy ngược lại bộ nhớ đệm http.

+1

Đúng, Varnish là một proxy ngược HTTP với bộ nhớ đệm HTTP và được tối ưu hóa cho bộ đệm ẩn HTTP. Nếu bạn đã thử Heroku, thì bạn đã thử Varnish. – yfeldblum

+1

Hầu hết các proxy ngược lại thực sự có một cách để "nói" cache rằng nội dung mới có sẵn, tuy nhiên bạn chính xác là bạn cần phải biết máy chủ nào cần tuôn ra, và cấu hình một cách để báo hiệu chúng. Varnish có một giao diện quản lý, một kênh điều khiển, mà bạn có thể kết nối từ ứng dụng của bạn hoặc theo cách thủ công, vì vậy nếu bạn biết máy chủ nào cần tuôn ra, thì việc thực hiện nó khá dễ dàng. –

1

Như đã đề cập trong câu trả lời của noodl, nếu sử dụng proxy ngược, điều đó thường khiến trang hết hạn một phần ngoài tầm kiểm soát của bạn. Một cách tiếp cận khác là bạn sẽ cần quản lý hết hạn sẽ sử dụng đường ray page caching (xem phần 1.1), điều này làm cho đường ray trả về đĩa (vào thư mục công cộng) lần đầu tiên một hành động được gọi và bạn có thể sử dụng máy chủ web cuối để trực tiếp phục vụ các tệp html đó. Tôi sử dụng nginx cho điều này, và có một chỉ thị để phục vụ bất kỳ tập tin tĩnh tồn tại (thường là hình ảnh, nhưng hoạt động cho các trang html quá với viết lại chính xác vào tài khoản cho phần mở rộng .html). Với bộ nhớ cache được quản lý bởi đường ray, bạn có thể tự hết hạn, như trong ví dụ trên trang hướng dẫn có hết chỉ mục khi một mục mới được tạo.

Sự hiểu biết của tôi là proxy http ngược lại được thiết kế và giúp hiệu suất khi bạn có thông lượng rất cao, vì nó cho phép bộ đệm truyền đến các phần của mạng ngoài tầm kiểm soát của bạn, tuy nhiên, nếu thời gian hiển thị như bạn đề xuất, sau đó các bộ đệm trang của bộ đệm có thể là một lựa chọn tốt cho bạn.

+0

Trên thực tế ... thật hiếm khi những ngày này tìm thấy một proxy ngược chuyên dụng không hỗ trợ tính năng vô hiệu hóa bộ nhớ cache trước khi nhấn vào TTL. Đó là một trường hợp sử dụng quan trọng. Nó chỉ không thường được thực hiện bằng cách sử dụng tiêu đề bộ nhớ đệm HTTP tiêu chuẩn. –

+0

Ah, đó là điều tốt để biết, tôi thấy có một câu trả lời mới đề cập đến cách làm điều đó. – Jeremy

5

Để làm hiệu lực bộ nhớ cache động, bạn có thể gửi purge.url {some regexp} từ máy chủ ứng dụng của mình qua kênh quản lý. Ví dụ: purge.url "^/some/page/$". Tuy nhiên, từ Rails, có lẽ dễ nhất là sử dụng phương thức HTTP PURGE.Vì vậy, thay vì làm một HTTP GET, bạn muốn làm một PURGE so với cùng URI:

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

Yêu cầu này phải đến từ localhost trừ khi bạn ghi đè lên rằng trong cấu hình.

Một số liên kết:

1

trang bộ nhớ đệm là những gì bạn có thể muốn. Nó sẽ đơn giản hơn để thiết lập và bảo trì hơn Varnish. Caching với proxy ngược lại không có một số ưu điểm khi bạn bắt đầu mở rộng đến nhiều máy chủ ứng dụng, vì bạn có thể làm mất hiệu lực bộ nhớ cache ở một nơi thay vì trên mỗi máy chủ ứng dụng.

Bạn có thể định cấu hình Varnish để phản hồi yêu cầu HTTP PURGE cho phép Rails báo hiệu Varnish khi một trang đã thay đổi. Dưới đây là pluginarticle dọc theo các dòng đó.

+1

Nếu bạn có nhu cầu bộ nhớ đệm đơn giản, vâng. Nếu bạn cần phải làm bất cứ điều gì thậm chí từ xa phức tạp với hệ thống bộ nhớ đệm của bạn, Rails trang bộ nhớ đệm có khả năng là không đủ. Varnish thực sự tỏa sáng tại thời điểm mà hầu hết mọi người vượt quá Rails trang bộ nhớ đệm. –

Các vấn đề liên quan