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


143

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 phụ trợ Django của tôi đã 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?


Chưa được thử nghiệm, nhưng từ gumroad.com/l/ngx_purge : "ngx_purge là mô-đun Lua thuần cho Nginx cho phép người dùng lọc đối tượng khỏi bộ đệm nginx.".
Jaime Hablutzel

Câu trả lời:


97

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 một 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;
    }
  }
}

7
Đây là bước đầu tiên hợp lý cho các ứng dụng mới không có 20k / req / s.

5
@Barry cái gì sẽ là steP thứ hai?
Jürgen Paul

42
@Legit - Tôi không biết, nhưng theo truyền thống, bước cuối cùng là "Lợi nhuận" :-)
Stephen C

Đáng buồn thay, nó không hoạt động với nginx 1.11. Vì bản cập nhật cuối cùng là khoảng 3 năm trước, có vẻ như đây không còn là giải pháp nữa.
izogfif

Không inactive=600mcó nghĩa là gì? Không inactivegiả sử là thời gian sao? `[inactive=time]
NeverEinatingQueue

47

Bạn có thể vô hiệu hóa các trang được lưu trong bộ nhớ cache 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-Statuscó thể được sử dụng để kiểm tra xem trang có từ bộ đệm hay không.


Điều này chỉ có thể cập nhật các trang được lưu trong bộ nhớ cache khi trang mới cũng được lưu vào bộ nhớ cache. Nếu bạn đã xóa một trang (404 hoặc các lỗi khác hiện được phục vụ bởi phụ trợ), trang này sẽ gửi tiêu đề Set-Cookie hoặc tiêu đề "Điều khiển nội dung: riêng tư", nội dung được lưu trong bộ nhớ cache sẽ không bị "vô hiệu".
rbu

36

Tôi đề nghị bạn hãy thử Varnish . 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ủ gốc, đá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ó một PURGEhoạt động sẽ loại bỏ tài nguyên khỏi bộ nhớ cache của Varnish, nhưng nó sẽ không cung cấp cho bạn quyền kiểm soát đối với bất kỳ bộ nhớ cache 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 một cách 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ó.


Bạn có thể giải thích ý của bạn là gì khi "đổi tên tệp hoặc sử dụng một số dạng buster bộ đệm chuỗi truy vấn" không? Tôi không chắc tại sao tôi hiểu tại sao không nên sử dụng thao tác như PURGE.
Tiếp tục

5
+1 cho véc ni. Luôn luôn tốt hơn nhiều để sử dụng các công cụ phù hợp cho công việc.
Tom O'Connor

4
@ Below: Hầu như không có hy vọng chạm vào véc ni trong đấu trường hiệu suất và tính linh hoạt. Điều này được hỗ trợ bởi một trong những nhà phát triển nhân FreeBSD hàng đầu và một nhóm chuyên dụng có trụ sở tại Châu Âu. Varnish đang sản xuất tại twitter, heroku và nhiều hơn nữa.

2
Ví dụ đơn giản nhất của bộ đệm cache là nối số phiên bản trong chuỗi truy vấn vào tài nguyên tĩnh, do đó style.css trở thành style.css? 123. Khi bạn muốn đẩy một phiên bản mới của tệp, bạn thay đổi url của tài nguyên thành style.css? 124 và bây giờ bộ đệm sẽ chọn nó như một tài sản hoàn toàn mới để được lưu trữ riêng. Apache sẽ phục vụ tệp style.css với bất kỳ chuỗi truy vấn nào được nối thêm, do đó không cần thay đổi tệp thực tế.
chmac

3
Nếu có thể, tốt nhất là đặt bộ đệm bộ đệm vào chính tên tệp, chẳng hạn như style.v123.cssvì một số bộ đệm sẽ không yêu cầu bộ đệm có chuỗi truy vấn.

8

Để 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

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 $eacbiến thành 1.



4

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

3

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.



2

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.


Có thật không? Có vẻ như ngnix phù hợp với etag và không bao giờ nói chuyện với ứng dụng để tìm hiểu xem có một etag cập nhật nào không.
John Naegle

2

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 (ư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
  • các inactivetham số trong các proxy_cache_pathchỉ thị:

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

Tôi khuyên bạn nên đăng bài viết trên blog của mình 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
    

1

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

Cú pháp: proxy_cache vùng | 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 đó.


Xin chào Tarik, câu hỏi rất cụ thể về những gì cần phải đạt được, và nó vượt xa hơn một chút là 'chỉ kích hoạt bộ đệm'.
asdmin

0
fastcgi_cache_path / opt / nginx-cache level = 2: 2 Keys_zone = img: 50m;

    vị trí / img / {
        fastcgi_pass $ phụ trợ;
        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_ leather_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ể.


Câu hỏi ban đầu là về việc sử dụng nginx trước Apache, không phải trước ứng dụng fastcgi được xử lý bởi nginx.
Graham Dumpleton

0

Có một plugin nginx được gọi là 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."

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.