Hiểu chỉ thị nginx proxy_cache_path


30

Giả sử tôi có tập tin cấu hình nginx này

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myCache:8m max_size=100m inactive=1h;
  • keys_zone=myCache:8mnghĩa là gì? Không có nhiều điều để nói về nó trong các tài liệu:

Ngoài ra, tất cả các khóa hoạt động và thông tin về dữ liệu được lưu trữ trong vùng nhớ chung, có tên và kích thước được cấu hình bởi tham số Keys_zone.

  • Nếu proxy_cache_valid( 12h) cao hơn inactivegiá trị được chỉ định ( 1h) trong proxy_cache_paththì sao? Nó sẽ tuân theo quy tắc nào? ví dụ

    proxy_cache_valid 200 302 12h;
    proxy_cache_valid 404 302 1h;
    

Cảm ơn!

Câu trả lời:


39

Keys_zone = myCache: 8m có nghĩa là gì?

Như tài liệu đã nói , nginx sẽ giữ tất cả các khóa hoạt động và thông tin về dữ liệu được lưu trữ trong một vùng bộ nhớ dùng chung, có cấu hình namesizeđược cấu hình bởi tham số Keys_zone. Như một vấn đề đầy đủ, hãy chia nhỏ từng phần

  • /var/cache/nginxlà nơi lưu trữ bộ đệm thực tế. Trong thư mục, tệp bộ đệm là tệp nhị phân nhưng bạn có thể dễ dàng phát hiện thẻ html bên trong nó.
  • levels=1:2 là tham số cấp độ đặt số lượng cấp độ thư mục con trong bộ đệm.
  • keys_zone=myCache:8mđã xác định vùng bộ nhớ dùng chung có tên myCache với kích thước tối đa 8 MB. Nó chứa tất cả các khóa hoạt động và siêu dữ liệu của bộ đệm. Vì vậy, bất cứ khi nào nginx kiểm tra xem một trang có được lưu trong bộ nhớ cache hay không, nó sẽ hỏi vùng nhớ được chia sẻ trước, sau đó tìm vị trí của bộ đệm thực tế trong /var/cache/nginxnếu bộ đệm tồn tại.
  • max_sizelà kích thước tối đa của bộ đệm, ví dụ như kích thước tập tin trên /var/cache/nginx.
  • inactive=1hchỉ định bộ nhớ cache thời gian không hoạt động tối đa có thể được lưu trữ. Dữ liệu được lưu trong bộ nhớ cache không được truy cập trong thời gian được chỉ định bởi inactivetham số sẽ bị xóa khỏi bộ đệm bất kể độ tươi của chúng.

Cách xác thực và xóa bộ đệm hoạt động

Lấy từ danh sách gửi thư nginx

  • Chỉ thị proxy_cache_valid chỉ định thời gian phản hồi sẽ được coi là hợp lệ (và sẽ được trả lại mà không có bất kỳ yêu cầu nào để phụ trợ). Sau thời gian này, phản hồi sẽ được coi là "cũ" và sẽ không được trả lại hoặc sẽ phụ thuộc vào cài đặt proxy_cache_use_stale .

  • Đối số không hoạt động của proxy_cache_path chỉ định thời gian phản hồi sẽ được lưu trong bộ đệm sau lần sử dụng cuối cùng. Lưu ý rằng ngay cả các phản hồi cũ sẽ được xem xét sử dụng gần đây nếu có yêu cầu đối với chúng.

Theo tôi hiểu, ở đây mã giả hoạt động như thế nào nginx

Khi có yêu cầu

if cache.exist AND (now() - cache.first_retrieved) < proxy_cache_valid:
    use it
else:
    retrieve from backend
    replace the old ones

Trong quá trình khác, trình quản lý bộ đệm thực hiện logic này

if (now() - cache.last_used) > inactive:
    del cache

if all-cache.size > max-size:
    del *the most inactive cache* until size < max-size

Điều gì xảy ra nếu proxy_cache_valid (12h) cao hơn giá trị không hoạt động được chỉ định (1h) trong proxy_cache_path?

Miễn là yêu cầu và truy cập vào bộ đệm cụ thể, đối tượng bộ đệm đó sẽ vẫn có hiệu lực cho đến 12h sau khi đối tượng đặt vào bộ đệm. Sau đó, bộ đệm được coi là không hợp lệ, vì vậy nginx sẽ tìm nạp từ phụ trợ và đặt lại bộ hẹn giờ hợp lệ. Nhưng nếu đối tượng không hoạt động (không được truy cập) hơn một giờ - ngay cả trong 12 giờ thời gian lưu trữ hợp lệ -, nginx sẽ xóa đối tượng đóinactivetham số.


"Sau đó, bộ đệm được coi là không hợp lệ, vì vậy nginx sẽ tìm nạp từ phụ trợ và đặt lại bộ hẹn giờ hợp lệ." - Nó thật thú vị. Vì vậy, nginx tìm nạp yêu cầu ngay cả khi không có người dùng tìm nạp nó? Vì vậy, ví dụ, nếu không hoạt động 365dvà hợp lệ 1dthì nginx sẽ tìm nạp các yêu cầu trong bộ đệm mỗi ngày trong một năm ngay cả khi không ai thực hiện yêu cầu đó?
Martin Thoma

1
Câu trả lời hay, nhưng dường như tôi không thể tìm thấy bất kỳ tài liệu nào về các đơn vị đo mà chúng tôi sử dụng với một số tham số này. Ví dụ: các thông số inactivecần các giá trị thời gian nhưng tôi không thấy những giá trị nào tôi có thể sử dụng ngoài h(khoảng 1 tháng? Hoặc 1 ngày? V.v.). Và những gì chúng ta nên được chỉ định với max_size? Byte? Tôi có thể sử dụng 1M cho 1 megabyte không?
Sunil D.

4
@SunilD. - ở đây bạn đi: nginx.org/en/docs/syntax.html
adamczi
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.