Những proxy ngược nào hỗ trợ các tiêu đề HTTP / 1.1 ETag và If-none-Match?


8

Tôi đang phát triển hệ thống bộ đệm cho nền tảng thương mại điện tử sẽ sử dụng proxy ngược để lưu vào bộ đệm. Tôi dự định xử lý sự vô hiệu bằng cách sử dụng các tiêu đề HTTP / 1.1 thích hợp. Đó là, tôi sẽ đặt một ETag trên thế hệ đầu tiên của nội dung và bộ đệm mà giá trị ETag trong ứng dụng. Tiêu đề Cache-Control sẽ chỉ định "phải xác nhận lại" để proxy nên đặt tiêu đề If-none-Match cho các yêu cầu tiếp theo với ETag. Ứng dụng sẽ tra cứu giá trị ETag được lưu trong bộ nhớ cache và nếu phù hợp, nó sẽ gửi phản hồi 304, nếu không, nó sẽ tạo ra 200 phản hồi đầy đủ.

Tôi hy vọng sử dụng nginx nhưng tôi không thể chắc chắn rằng nó hỗ trợ ETags (tài liệu cho biết nó không nhưng có lẽ chúng đã hết hạn?). Varnish là một lựa chọn khác nhưng tôi cũng không tích cực ở đây ..

Những máy chủ proxy ngược nào hiện có hỗ trợ đầy đủ cho ETags? Tôi muốn nó thực sự lưu trữ nhiều phiên bản để tôi có thể thực hiện những việc như kiểm tra phân tách mà không phải tắt bộ đệm. Nghĩa là, HTTP / 1.1 chỉ định rằng khách hàng có thể gửi If-none-Match với nhiều giá trị ETag và máy chủ sẽ phản hồi với ETag nào phù hợp (nếu có). Nếu proxy ngược giữ nhiều bản sao thay vì chỉ giá trị nhìn thấy lần cuối và để máy chủ chỉ định theo từng yêu cầu sẽ sử dụng, đó sẽ là lý tưởng.

Câu trả lời:


2

Tôi chỉ kiểm tra trong mã nguồn Varnish và mặc dù nó hỗ trợ If-Modified-SinceIf-None-Matchtiêu đề, nó không hỗ trợ must-revalidatetrong Cache-Control. Các thuộc tính được hỗ trợ duy nhất Cache-Controlmax-ages-max-age.

Người giới thiệu:


Cảm ơn. Tôi không biết nhiều về VCL Varnish, nhưng có thể chỉ định sử dụng VCL để luôn xác nhận lại khi Varnish dường như hỗ trợ xác nhận lại?
ColinM

Chỉ cần tìm thấy nhánh "thử nghiệm-ims" của Varnish dường như thêm hỗ trợ đầy đủ cho If-none-Match. Hy vọng rằng nó cuối cùng sẽ được sáp nhập vào một bản phát hành ổn định. varnish-cache.org/trac/wiki/BackendConditionalRequests
ColinM

2

nginx yêu cầu các mô-đun của bên thứ ba để hỗ trợ ETag. Và có hai trong số họ.


Mô-đun etags tĩnh là để tạo etags, không lưu trữ nội dung với etags. Tương tự, mô-đun etags động tạo ra etags cho nội dung động để sử dụng ngược dòng, không sử dụng proxy ngược. Tuy nhiên, tôi nghĩ nginx 1.3 đã thêm hỗ trợ chính thức cho etags với proxy ngược ..
ColinM

1
Chỉ để tham khảo trong tương lai, nginx hỗ trợ ETag và If-none-Match kể từ 1.7.3, nhưng nó vẫn chỉ có thể lưu trữ một kết quả cho một url nhất định nên tôi sẽ không gọi hỗ trợ đầy đủ này. Đó là, bạn không thể có nhiều phản hồi được lưu trữ và thương lượng với máy chủ trong quá trình xác nhận lại. Xem trac.nginx.org/nginx/ticket/101
ColinM

1

Sửa lỗi cho tôi nếu tôi sai và tôi biết đây là một bài viết cũ - nhưng tôi muốn bình luận cho những người qua đường mới. Tôi tin rằng bộ đệm Reverse Proxy không giúp ích nhiều như bạn muốn khi sử dụng ETags.

Các cơ chế lưu trữ xác thực sử dụng máy chủ gốc để xác thực nếu ETag (hoặc ngày sửa đổi lần cuối) trong yêu cầu vẫn hợp lệ (khớp hoặc không khớp với tài nguyên etag, tùy thuộc vào tiêu đề nào được sử dụng hoặc đã / chưa được sửa đổi kể từ ngày đưa ra trong yêu cầu).

Điều này có nghĩa là bộ đệm proxy ngược như Varnish vẫn sẽ chuyển yêu cầu đó đến máy chủ gốc. Nó có thể đáp ứng với yêu cầu thay vì yêu cầu máy chủ xử lý, nhưng bạn đã không lưu chuyến đi khứ hồi đến máy chủ gốc.

Các trình duyệt có thể phản hồi bộ đệm và xử lý phản hồi 304 trong mọi trường hợp, do đó, bộ đệm riêng của người dùng có thể phù hợp hơn để xử lý việc này hơn là sử dụng proxy ngược (YMMV, đặc biệt là ở quy mô và tất nhiên tùy thuộc vào trường hợp sử dụng của bạn. muốn đưa ra các giả định về ứng dụng của bạn).

Từ thông số 13.3 :

Khi bộ đệm có mục nhập cũ mà nó muốn sử dụng làm phản hồi cho yêu cầu của khách hàng, trước tiên, nó phải kiểm tra với máy chủ gốc (hoặc có thể là bộ đệm trung gian có phản hồi mới) để xem liệu mục nhập được lưu trong bộ nhớ cache của nó có còn sử dụng được không . Chúng tôi gọi đây là "xác nhận" mục nhập bộ đệm. Vì chúng tôi không muốn phải trả chi phí truyền lại toàn bộ phản hồi nếu mục nhập được lưu trong bộ nhớ cache tốt và chúng tôi không muốn trả chi phí cho chuyến đi khứ hồi nếu mục nhập được lưu trong bộ nhớ cache không hợp lệ, giao thức HTTP / 1.1 hỗ trợ việc sử dụng các phương pháp có điều kiện.

và sau đó lưu ý 13.3.4 :

Proxy lưu trữ HTTP / 1.1, khi nhận được yêu cầu có điều kiện bao gồm cả Ngày sửa đổi lần cuối và một hoặc nhiều thẻ thực thể làm trình xác thực bộ đệm, KHÔNG PHẢI trả lại phản hồi được lưu trong bộ nhớ cache cho máy khách trừ khi phản hồi được lưu trong bộ nhớ cache phù hợp với tất cả trường tiêu đề có điều kiện trong yêu cầu.

Vì vậy, Varnish có thể trả lời phản hồi cho bạn, nhưng bạn vẫn có một chuyến đi khứ hồi đến máy chủ. Nếu bạn có thể sử dụng bộ đệm ứng dụng như APC hoặc memcache, thì điều đó vẫn có thể xứng đáng với bạn. Tuy nhiên, bộ đệm xác thực thường tốt hơn cho việc tiết kiệm băng thông so với tiết kiệm tài nguyên máy chủ.

Bộ nhớ đệm xác thực tốt nhất có thể được để lại cho máy khách (mã trình duyệt hoặc mã api).

Sử dụng mô hình Hết hạn cho bộ nhớ đệm là nơi bộ đệm proxy ngược thực sự tỏa sáng. Điều này cho phép bạn bỏ qua việc nhấn hoàn toàn máy chủ gốc. Sử dụng Expires, Cache-Control, Date, vv, là tốt nhất (một lần nữa, IMO) cơ chế cho một bộ nhớ cache proxy ngược như bộ nhớ cache có thể trả lại phản ứng, giả sử nó không cũ, mà không bao giờ đánh máy chủ gốc.


Trường hợp sử dụng mà tôi có trong đầu cho câu hỏi này là xác nhận lại proxy với máy chủ gốc và máy chủ gốc trả về 304 nếu ETag khớp với ETag sẽ được lưu trong bộ nhớ cho một bản ghi. Nghĩa là, ETag sẽ được tạo ngẫu nhiên khi trang được hiển thị lần đầu và được lưu với khóa chính cho bản ghi đó. Nếu bản ghi bị sửa đổi, ETag sẽ bị xóa.
ColinM


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.