it-swarm-vi.tech

Làm cách nào để thiết lập Nginx làm proxy ngược bộ đệm?

Gần đây tôi nghe nói rằng Nginx đã thêm bộ nhớ đệm vào tính năng proxy ngược của nó. Tôi nhìn xung quanh nhưng không thể tìm thấy nhiều thông tin về nó.

Tôi muốn thiết lập Nginx làm proxy đảo ngược bộ đệm trước Apache/Django: để yêu cầu proxy Nginx cho một số trang (nhưng không phải tất cả) cho Apache, sau đó lưu các trang được tạo và phục vụ các yêu cầu tiếp theo cho các trang đó từ bộ đệm.

Lý tưởng nhất là tôi muốn vô hiệu hóa bộ đệm theo 2 cách:

  1. Đặt ngày hết hạn trên mục được lưu trong bộ nhớ cache
  2. Để vô hiệu hóa rõ ràng các mục được lưu trữ. Ví dụ. nếu my Django phụ trợ đã cập nhật một số dữ liệu nhất định, tôi muốn nói với Nginx để vô hiệu hóa bộ đệm của các trang bị ảnh hưởng

Có thể đặt Nginx để làm điều đó? Làm sao?

145
Continuation

Tôi không nghĩ rằng có một cách để vô hiệu hóa rõ ràng các mục được lưu trong bộ nhớ cache, nhưng đây là một ví dụ về cách thực hiện phần còn lại. Cập nhật: Như Piotr đã đề cập trong câu trả lời khác, có một mô-đun lọc bộ nhớ cache mà bạn có thể sử dụng. Bạn cũng có thể buộc làm mới một mục được lưu trong bộ nhớ cache bằng proxy_cache_bypass của nginx - xem câu trả lời của Cherian để biết thêm thông tin.

Trong cấu hình này, các mục không được lưu trong bộ nhớ cache sẽ được truy xuất từ ​​example.net và được lưu trữ. Các phiên bản được lưu trong bộ nhớ cache sẽ được phục vụ cho các khách hàng trong tương lai cho đến khi chúng không còn hiệu lực (60 phút).

Kiểm soát bộ nhớ cache và hết hạn tiêu đề HTTP của bạn sẽ được vinh danh, vì vậy nếu bạn muốn đặt rõ ràng ngày hết hạn, bạn có thể làm điều đó bằng cách đặt tiêu đề chính xác trong bất cứ điều gì bạn đang ủy quyền.

Có rất nhiều tham số mà bạn có thể điều chỉnh - xem tài liệu mô-đun nginx Proxy để biết thêm thông tin về tất cả điều này bao gồm các chi tiết về ý nghĩa của các cài đặt/tham số khác nhau: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}
97
Casey

Bạn có thể đặc biệt không hợp lệ được lưu trong bộ nhớ cache trang thông qua

proxy_cache_bypass       

Giả sử bạn muốn lưu trữ một trang, đặt bộ đệm theo cách này

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $Host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

Bây giờ, khi bạn muốn vô hiệu hóa trang đó và lưu lại bộ đệm

Thực hiện một cuộc gọi curl bí mật với tiêu đề

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

Nó sẽ làm mất hiệu lực và lưu trữ nó.

Hoạt động từ nginx 0,7.

Là một phần thưởng bổ sung, add_header X-Cache-Status có thể được sử dụng để kiểm tra xem trang có từ bộ đệm hay không.

47
Cherian

Tôi đề nghị bạn cho Varnish một lần thử. Varnish được thiết kế đặc biệt như một bộ đệm proxy ngược. Nó sẽ tôn trọng tất cả các tiêu đề kiểm soát bộ đệm mà bạn gửi từ máy chủ Origin, đáp ứng yêu cầu đầu tiên của bạn.

Đối với yêu cầu thứ hai của bạn, vô hiệu rõ ràng. Đề nghị mạnh mẽ của tôi là thay đổi tên của url của tài nguyên mà bạn muốn làm mất hiệu lực, bằng cách đổi tên tệp hoặc sử dụng một số dạng buster bộ đệm chuỗi truy vấn. Varnish có thao tác PURGE sẽ xóa tài nguyên khỏi bộ đệm của Varnish, nhưng nó sẽ không cho phép bạn kiểm soát bất kỳ bộ đệm nào khác giữa bạn và người dùng. Như bạn đã nói rằng bạn muốn thanh lọc rõ ràng một tài nguyên, thì các tiêu đề kiểm soát http tiêu chuẩn sẽ không giúp bạn. Trong trường hợp đó, cách dễ nhất để đánh bại bộ nhớ đệm của tài nguyên là đổi tên nó.

36
Dave Cheney

Để vô hiệu hóa các trang được chọn, bạn có thể sử dụng bản vá "cache_purge" cho nginx-0.8.x, điều này hoàn toàn không phù hợp với những gì bạn muốn;)

Nó có sẵn ở đây .

8
Piotr Sikora

Hầu hết các công cụ lưu trữ (Citrix) cho phép làm mới lực (Ctrl + r) để sao lưu trang được lưu trong bộ nhớ cache.

Đây là một mẹo tôi tìm thấy để làm một cái gì đó tương tự trong nginx.

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

Điều này giả định rằng khi bạn thực hiện Ctrl + r trong trình duyệt của mình, tiêu đề Cache-Control có max-age = 0 trong yêu cầu của nó. Tôi biết Chrome thực hiện điều này, nhưng tôi chưa thử trong các trình duyệt khác. Thêm nhiều trường tiêu đề có thể dễ dàng, chỉ bằng cách thêm nhiều hơn nếu các câu lệnh đặt $eac biến thành 1.

8
Randy Wallace

Bộ nhớ đệm là chức năng khá mới trong nginx (và hiện chưa được ghi chép tốt), nhưng đủ ổn định để sử dụng trong sản xuất.

5
SaveTheRbtz

Tôi tin rằng NginxHttpProxyModule có khả năng loại bỏ các yêu cầu http. Tìm kiếm các chỉ thị bắt đầu bằng:

proxy_cache

Có, có thể kiểm soát hành vi bộ đệm thông qua các lệnh như:

proxy_cache_valid
4
Taras Chuhay

Dựa trên thực tế là bạn không thể tìm thấy tài liệu về nó, tôi sẽ cảnh giác một chút về việc dựa vào nó trong sản xuất. Bạn đã xem Varnish chưa? Đó là "nginx của proxy ngược" của tôi, nhỏ, nhẹ, làm một công việc và làm tốt.

3
womble

Nếu bạn sử dụng eTags trên ứng dụng của mình và đặt nginx trước ứng dụng thì nó sẽ giải quyết hết hạn cho bạn, bởi vì nếu eTag thay đổi, nó sẽ làm mất hiệu lực bộ đệm.

2
Martin Murphy

Bạn có thể kiểm soát hết hạn bộ nhớ cache của Nginx với nhiều chỉ thị/tham số:

  • proxy_cache_valid 200 302 10m;
  • thêm một trong các tiêu đề HTTP bên dưới (mức độ ưu tiên rất quan trọng - hãy xem bài đăng trên blog của tôi ): [.__.]
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • tham số inactive trong proxy_cache_path chỉ thị:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

Tôi khuyên bạn nên bài đăng trên blog của tôi nếu bạn muốn tìm hiểu thêm về bộ nhớ đệm Nginx.

Chủ đề thanh trừng thực sự thú vị vì tính năng này chỉ tồn tại trong Nginx Plus (phiên bản thương mại của Nginx). Tôi thực sự thích câu trả lời @ randy-wallace. Nhưng cũng có những khả năng khác như mô-đun ngx_cache_purge .

Điều đơn giản nhất bạn có thể làm là xóa tệp được lưu trong bộ nhớ cache theo cách thủ công:

  • tạo khóa băm của bạn:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • xóa tệp khỏi hệ thống tệp:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    
2
czerasz

Đối với khách truy cập trong tương lai: Trong khi đó, proxy ngược nginx đã tích hợp bộ đệm và các tài liệu có sẵn tại:

Cú pháp: vùng proxy_cache | tắt;

Mặc định: proxy_cache tắt;

Bối cảnh: http, máy chủ, địa điểm

Xác định vùng bộ nhớ dùng chung cho bộ nhớ đệm. Khu vực tương tự có thể được sử dụng ở một số nơi. Giá trị tham số có thể chứa các biến (1.7.9). Tham số tắt sẽ vô hiệu hóa bộ nhớ đệm được kế thừa từ mức cấu hình trước đó.

2
Tarik Huclaslun
[.__.] fastcgi_cache_path/opt/nginx-cache level = 2: 2 key_zone = img: 50m; [.__.] [.__.] location/img/{[.__.] fastcgi_pass $ backend; [.___ .] bao gồm fcgi_params; [.__.] fastcgi_intercept_errors tắt; [.__.] fastcgi_cache_key $ server_addr $ request_uri; [.__.] fastcgi_cache img; [.__.] fastcgi_cache_valid bất kỳ 1m; [.__.] fastcgi_ DA_header Set-Cookie; [.__.]} [.__.]

Điều này tạo bộ đệm cho/img/location. Nó nằm trong/opt/nginx-cache. Các đối tượng được lưu trữ trong 1 phút.

Bạn có thể viết mã phản hồi khác nhau thay vì bất kỳ.

Bây giờ bạn không thể làm mất hiệu lực bộ đệm cho các trang được chọn. Có thể trong 0.8.x nó sẽ có thể.

0
lexsys

Có một plugin nginx có tên ncache tự xưng là "một hệ thống bộ đệm web dựa trên máy chủ web nginx. Nhanh hơn và hiệu quả hơn mực."

0
sajal