fbpx
close

Nginx Advance: Caching

Tác giả: Dương Xuân Ngày cập nhật: 06/03/2020 Chuyên mục:
Disclosure
Website Wiki.tino.org được cung cấp bởi Tino Group. Truy cập và sử dụng website đồng nghĩa với việc bạn đồng ý với các điều khoản và điều kiện trong chính sách bảo mật - điều khoản sử dụng nội dung. Wiki.tino.org có thể thay đổi điều khoản sử dụng bất cứ lúc nào. Việc bạn tiếp tục sử dụng Wiki.tino.org sau khi thay đổi có nghĩa là bạn chấp nhận những thay đổi đó.
Why Trust Us
Các bài viết với hàm lượng tri thức cao tại wiki.tino.org được tạo ra bởi các chuyên viên Marketing vững chuyên môn và được kiểm duyệt nghiêm túc theo chính sách biên tập bởi đội ngũ biên tập viên dày dặn kinh nghiệm. Mọi nỗ lực của chúng tôi đều hướng đến mong muốn mang đến cho cộng đồng nguồn thông tin chất lượng, chính xác, khách quan, đồng thời tuân thủ các tiêu chuẩn cao nhất trong báo cáo và xuất bản.

Giới thiệu

Chúng ta đều biết rằng performance của các applications và website là yếu tố rất quan trọng trong môi trường internet hiện tại. Tuy nhiên, quá trình làm cho applications và website của bạn hoạt động tốt hơn, không phải lúc nào cũng dễ dàng. Chất lượng mã nguồn và cơ sở hạ tầng tất nhiên là rất quan trọng. Nhưng trong nhiều trường hợp, bạn có thể cải thiện trải nghiệm người dùng cuối của ứng dụng bằng cách tập trung vào một số kỹ thuật rất cơ bản như caching. Bài viết này sẽ giới thiệu và hướng dẫn bạn sử dụng kỹ thuật caching trên Nginx để nâng cao performance hệ thống và trải nghiệm người dùng tốt hơn.

Khái niệm Caching

Chúng ta xét đến ví dụ về quá trình dữ liệu được trao đổi giữa client và server  với các phản hồi HTTP như sau. Hãy bắt đầu với tình huống  không có bộ nhớ cache, trông giống như thế này.

Nginx Cache: yêu cầu ứng dụng tình huống ban đầu

Người dùng thực hiện một request cho ứng dụng và nhận được respone.

Nginx Cache: phản ứng ứng dụng tình huống ban đầu

Thêm cache vào kịch bản này là một cách đơn giản để cải thiện hiệu suất, tính đáp ứng cao hơn. Nó hoạt động bằng cách lưu các respone từ máy chủ hoặc ứng dụng vào ram hoặc disk.

Hãy xem xét tình huống đơn giản này. Máy khách thực hiện một request cho App như trong ví dụ trước nhưng lần này  đi qua cache.

Nginx Cache: yêu cầu giới thiệu bộ nhớ đệm

App trả về respone  đến máy khách nhưng nó cũng lưu respone trên disk.

Nginx Cache: phản hồi giới thiệu bộ nhớ đệm

Lần tới, người dùng thực hiện cùng một request và hệ thống  kiểm tra cache có respone tương ứng không.

Nginx Cache: yêu cầu giới thiệu bộ nhớ đệm

Và nếu đó là trường hợp request đã được thực hiện trước đó và hệ thống có lưu respone đã xư lý, nó sẽ phản hồi ngay lập tức cho người dùng, bằng cách phục vụ nội dung được lưu trong bộ nhớ cache này.

Nginx Cache: phản hồi giới thiệu bộ nhớ đệm

Lưu ý là đối với request được máy chủ phục vụ trực tiếp từ cache mà không cần phải thông qua App.

Caching sẽ thêm phức tạp cho hệ thống nhưng nó đi kèm với những lợi ích tuyệt vời :

  • Cải thiện hiệu suất trang web – các yêu cầu không phải trải qua toàn bộ quá trình xử lý từ đầu.
  • Tăng khản năng chịu tải – bằng cách giảm tải trên các máy chủ gốc khi không phải xử lý nhiều request giống nhau.
  • Mang lại tính khả dụng cao hơn – bằng cách phục vụ nội dung cũ(được cache) khi máy chủ không hoạt động

 

 

Cache với Nginx

Nginx là một máy chủ HTTP và thật tuyệt vời khi phục vụ các tệp tĩnh và yêu cầu ủy quyền. Do tính chất không đồng bộ của nó, nó nổi bật với việc sử dụng tài nguyên trọng lượng nhẹ.

Cache trên Nginx hỗ trợ cho

  • Máy chủ HTTP
  • FastCGI
  • uwsgi
  • SCGI

Để bật cơ chế caching, ta cần phải thêm chỉ thị proxy_cache_path trong block http { }

http {
    ...
    proxy_cache_path /data/nginx/cache keys_zone=one:10m;
    server {
        proxy_cache mycache;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}

Nginx quản lý cache như thế nào

Có 2 tiến trình của Nginx quản lý bộ nhớ cache(cache load):

  • Cache manager: được kích hoạt định kỳ để kiểm tra trạng thái của cache. Nếu kích thước của cache vượt quá giá trị max_size thì cache manager sẽ xóa bỏ phần dữ liệu ít được truy cập nhất.
  • Cache loader: tiến trình này chỉ hoạt động duy nhất một lần ngay khi Nginx khởi động. Nó có nhiệm vụ nạp metadata của dữ liệu được cache trước đó vào bộ nhớ chung. Nạp lại toàn bộ cache khi nginx khởi động sẽ làm chậm Nginx, để giảm thiểu việc này, ta có thể cấu hình load cache tuần tự theo thời gian, mỗi lần sẽ load một phần cache lên.

Các thông số để cấu hình việc cache load trong nginx

  • loader_threshold – Thời gian mỗi lần nạp cache (miliseconds)
  • loader_files – Số lượng file tối đa nginx nạp trong mỗi lần (mặc định là 100).
  • loader_sleeps – Thời gian giữa mỗi lần nạp cache (miliseconds), mặc định là 50ms.

Trong ví dụ sau, nginx sẽ lặp lại việc load cache mỗi 300 mili giây hoặc cho đến khi 200 mục được tải:

proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;

What/When  to cache?

Theo mặc định, Nginx chỉ lưu trữ các yêu cầu GET và HEAD. Bạn có thể thay đổi điều này bằng chỉ thị proxy_cache_methods

proxy_cache_methods GET HEAD POST;

Bạn cũng có thể hướng dẫn Nginx lưu trữ phản hồi chỉ sau khi được yêu cầu ít nhất 5 lần.

proxy_cache_min_uses 5;

Điều này sẽ hữu ích trong trường hợp bạn có nhiều nội dung, nhưng bạn chỉ muốn lưu trữ những yêu cầu thực sự phổ biến.

Nginx có thể tiết kiệm băng thông disk I/O. Bằng cách tôn trọng các cache headers và mã http 304, các phản hồi không được sửa đổi, Nginx sẽ không tải lại nội dung nếu chỉ thị sau được bật:

proxy_cache_revalidate on;

 

Cách chỉ định những yêu cầu để lưu trữ

Với Nginx, chúng tôi không giới hạn bộ nhớ cache mọi thứ theo cùng một quy tắc. Thay vào đó, chúng ta có thể cho Nginx biết thông tin nào sẽ được sử dụng để tạo khóa băm. Và chúng tôi có thể làm điều đó ở cấp độ http, máy chủ hoặc vị trí. Đây là hai ví dụ:

proxy_cache_key "$host$request_uri$cookie_user";
proxy_cache_key "$scheme$proxy_host$uri$is_args$args";

Hoăc cũng có thể nói với Nginx, trong những điều kiện nào thì yêu cầu không nên được lưu trữ trong bộ đệm.

proxy_no_cache $http_pragma $http_authorization $cookie_nocache $arg_nocache;

How long to cache?

Có một vài chỉ thị đơn giản cho Nginx biết thời gian lưu trữ các phản hồi của một loại nhất định:

proxy_cache_valid any      1m;
proxy_cache_valid 200 302 10m;

Nhưng chủ yếu là các header của máy chủ gốc xác định khả năng lưu trữ của nội dung:

  • Expires
  • Cache-Control
  • X-Accel-Expires – Nginx special header.
    Overrides other headers. Used when you need to serve different headers to the client.

Mức độ ưu tiên của các tùy chọn được đề cập được trình bày trên biểu đồ bên dưới, với mức độ ưu tiên mạnh nhất ở trên cùng:

Nginx Caching: caching headers priority

Một số chỉ thị khác

Các tùy chọn sau đây thêm rất nhiều vào các yếu tố sẵn có. Nó cho phép Nginx phục vụ nội dung cũ (cũ, hết hạn) khi phản hồi của ứng dụng hết thời gian hoặc trả về mã trạng thái 50x:

proxy_cache_use_stale error timeout;

Với proxy_cache_lock được bật, nếu nhiều máy khách yêu cầu một tệp không có trong bộ đệm (MISS), chỉ những yêu cầu đầu tiên trong số đó mới được phép thông qua máy chủ gốc. Các yêu cầu còn lại chờ yêu cầu đó được thỏa mãn và sau đó kéo tệp từ bộ đệm. Nếu không bật proxy_cache_lock, tất cả các yêu cầu dẫn đến lỗi bộ nhớ cache sẽ chuyển thẳng đến máy chủ gốc.

proxy_cache_lock on;

 

Purge cache.

Chúng ta sẽ cấu hình HTTP PURGE để thực hiện xóa theo URLs

  1. Trong block http{} chúng ta tạo ra một biến mới, ví dụ: $ purge_method, phụ thuộc vào biến $ request_method:
    http {
        ...
        map $request_method $purge_method {
            PURGE 1;
            default 0;
        }
    }

     

  2. Trong block location{} nơi cache được định cấu hình, hãy thêm proxy_cache_purge để chỉ định một điều kiện cho các yêu cầu xóa bộ đệm. Trong ví dụ này, đó là $ purge_method được cấu hình ở bước trước:
    server {
        listen      80;
        server_name www.example.com;
    
        location / {
            proxy_pass  https://localhost:8002;
            proxy_cache mycache;
    
            proxy_cache_purge $purge_method;
        }
    }

     

Gủi lệnh Purge cache

Khi chỉ thị proxy_cache_purge được định cấu hình, bạn cần gửi yêu cầu purge cache để xóa cache. Bạn có thể đưa ra các yêu cầu purge bằng nhiều công cụ, bao gồm lệnh curl như trong ví dụ này:

$ curl -X PURGE -D – "https://www.example.com/*"
HTTP/1.1 204 No Content
Server: nginx/1.15.0
Date: Sat, 19 May 2018 16:33:04 GMT
Connection: keep-alive

Trong ví dụ này, các tài nguyên có một phần URL chung (được chỉ định bởi ký tự đại diện dấu hoa thị) sẽ bị xóa. Tuy nhiên, các mục cache như vậy không bị xóa hoàn toàn khỏi bộ cache: chúng vẫn còn trên nơi lưu trữ cho đến khi chúng bị xóa vì không hoạt động ( chỉ thị proxy_cache_path được cấu hình thêm tham số inactive ) hoặc bởi bộ lọc bộ đệm (được bật với tham số purger  trong cấu hình proxy_cache_path) hoặc khách hàng cố gắng truy cập chúng.

Hạn chế quyền truy cập vào tính năng purger cache

Cấu hình sau sẽ chỉ cho IP nhất định được phép chạy lệnh purge cache

geo $purge_allowed {
   default         0;  # deny from other
   10.0.0.1        1;  # allow from localhost
   192.168.0.0/24  1;  # allow from 10.0.0.0/24
}

map $request_method $purge_method {
   PURGE   $purge_allowed;
   default 0;
}

Xóa hoàn toàn các nội dung cache khỏi bộ nhớ cache

Để xóa hoàn toàn nội dung cache bạn có thể thêm chỉ thị purger trong phần cấu hình proxy_cache_path

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;

Dưới đây là 1 ví vụ về purge cache

http {
    ...
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;

    map $request_method $purge_method {
        PURGE 1;
        default 0;
    }

    server {
        listen      80;
        server_name www.example.com;

        location / {
            proxy_pass        https://localhost:8002;
            proxy_cache       mycache;
            proxy_cache_purge $purge_method;
        }
    }

    geo $purge_allowed {
       default         0;
       10.0.0.1        1;
       192.168.0.0/24  1;
    }

    map $request_method $purge_method {
       PURGE   $purge_allowed;
       default 0;
    }
}

 

 

 

 

 

 

Bài viết liên quan

Mục lục
  1. How long to cache?

Xem nhiều

giá tốt, chất lượng cao mình rất hài lòng
chất lượng dịch vụ tốt lắm...á
chất lượng dịch vụ rất tốt.
giá tốt, chất lượng cao mình rất hài lòng
Tino giá tốt,chất lượng cao,dịch vụ tư vấn và hổ trợ khách hàng tận tâm.
tôi rất thích sử dụng dịch vụ tại tinohostinohost. tốc độ tải nhanh và cực kỳ rẻ
Dịch vụ chăm sóc khách hàng tốt
Dùng rất oke nha mọi người
Dịch vụ chăm sóc khách hàng tốt, mình rất hài lòng về dịch vụ của TINOHOST
Đã mua rất nhiều tên miền tại Tinohost. Chất lượng tốt
Dịch vụ tốt, chăm sóc khách hàng chu đáo. Mình rất yên tâm khi sử dụng các dịch vụ của Tinohost.
dịch vụ và chăm sóc khách hàng rất tốt , mình rất thích tinohost , mình đã sử dụng nhiều dịch vụ của tinohost rồi
tuyệt vời chăm sóc khách hàng quá tốt
dịch vụ và chăm sóc khách hàng rất tốt , mình rất thích tinohost , mình đã sử dụng nhiều dịch vụ của tinohost rồi
Quá tốt - Quá xuất sắc và tuyệt
Hỗ trợ nhiệt tình. dịch vụ chất lượng
Đội ngũ support rất nhiệt tình.
Sử dụng dịch vụ của bạn Tinohost 2 3 năm nay chưa khi nào phải thất vọng.
dịch vụ hỗ trợ rất nhanh, tốc độ hosting tốt
Hộ trợ tốt, nhanh. Tuyệt vời 🥰
tuyệt vời, dịch vụ cực tốt và hỗ trợ siêu nhanh
Làm việc nhanh chóng, giá thành hợp lí.
Chất lượng phục vụ tốt, hỗ trợ khá nhanh chóng và chất lượng gói lớn tốt, gói nhỏ cần tốt hơn.
Hosting rẻ và nhanh thích hợp cho học sinh sinh viên như mình
dịch vu tốt ! Sẽ sử dụng thưởng xuyên !
Mỗi lần cần gì, nhắn Tino là được hỗ trợ ngay. Nên một đứa không biết gì về web như mình cũng tạo được blog. Cơ bản mình chỉ lo viết, mọi thứ có anh IT của Tino lo hết.
Nhìn chung thì Tino xứng đáng là một trong những nhà cung cấp host giá rẻ #1 tại VN. Bên này support khá nhanh và nhiệt tình nên quá trình sử dụng diễn ra tương đối trơn tru.
Chất lượng quá ok so với mức giá. Các SME có thể tham khảo để dựng web nhé.
uy tín chất lượng chuẩn cho 5 sao
Dịch vụ nhanh chóng thanh toán tiện lợi
Dịch vụ nhanh chóng, giá cả hợp lý
Chất lượng phục vụ ok, support khá nhanh chóng và chất lượng gói lớn tốt, gói nhỏ cần tốt hơn.
Dịch vụ tốt, giá cả hợp lý👍
Rất hay, rất tốt, rất hữu ích
Hỗ trợ rất nhanh và nhiệt tình
Chất lượng phục vụ ok, support khá nhanh chóng và chất lượng gói lớn tốt, gói nhỏ cần tốt hơn.
dịch vụ tốt, thanh toán nhanh chống
Hài lòng dịch vụ của tinohost
Sau khi sử dụng dịch vụ của TinoHost. Mình thấy website load nhanh hơn hẳn so với sử dụng ở nhà cung cấp cũ. Giá cả do mình đc mua với giá sale 99% của TinoHost nên rất là rẻ. Gói mình mua là gòi Hosting Bussiness 20GB. Thông số cấu hình cao nên web load khá mượt
Chúc TinoHost phát triển!
domain rẻ, có nhiều gói hữu ích thích hợp cho sinh viên
Dịch vụ trãi nghiệm tốt, cho 5 sao
Dịch vụ tốt . Support nhiệt tình
Chất lượng OK
Nhanh chóng
Đã gia hạn thêm gói 1 năm nữa của TINO host. Chất lượng sản phẩm và dịch vụ thật sự tốt. AE nên trải nghiệm thử và tin dùng. Thank you TINO 👍
dịch vụ rất tốt
Nhân viên support nhanh, hỗ trợ nhiệt tình, giao dịch tự động nên khá tiện
Đã dùng nhiều dịch vụ tại Tinohost, chất lượng tốt, rất hài lòng ...😀
Các bạn hỗ trợ làm việc nhiệt tình và chuyên nghiệp!
Sự dụng rất hài lòng với các dịch vụ của tinohost
Dịch vụ tốt, uy tín chất lượng
Tino dịch vụ quá tuyệt vời
Giá rẻ, dịch vụ tốt, hỗ trợ nhanh chóng
dịch vụ rất tốt rất tuyệt vời
Giá hợp lý cho người mới dùng
Mình thấy Tinohost có giao diện thân thiện, dễ đăng ký sử dụng cho người mới tập tành làm web như mình. Hosting hỗ trợ có nhiều lựa chọn về dung lượng và giá cả! Thanh toán qua momo thuận tiện. Recommended!
wed quá ok làm việc nhanh ngọn
Dịch vụ tốt. Khá hài lòng vì support nhiệt tình
Dịch vụ quá tuyệt vời danh cho các bạn
đội sp của Tino rất nhiệt tình và nhanh chóng
Xin cảm ơn đội ngủ kỹ thuật. Các bạn rất chuyên nghiệp và thân thiện. Tôi sẽ giới thiệu các bạn cho bạn bè của mình.
Dịch vụ hỗ trợ tốt, ổn định, thanh toán dễ dàng.
Mình từng dùng VPS bên Vietel IDC, hay gặp lỗi vặt và bảo trì liên tục. Nhưng Tino thì rất ok
dùng tốt, nhanh, dễ sử dụng
Giao diện đẹp mắt, dễ sử dụng
Thích cách tư vấn tận tình và nhanh gọn của Tino mỗi khi có vấn đề trục trặc. Hosting ổn định, giá rẻ tốt lắm nhé mọi người
Đề nghị xem lại vấn đề phục vụ khách hàng (livchat)!
Good. Tốc độ cao. Tùy chỉnh nhiều trên shared hosting.
hosting ngon, giá luôn rẻ, tôi làm code nhưng rất thích sài host tino
Tino cung cấp host rất chuyên nghiệp. Đội ngũ kỹ thuật hỗ trợ rất tận tâm và nhiệt tình. Mình sẽ tiếp tục ủng hộ Tino 🥰.
Rất tuyệt vời🙆🙆🙆🙆🙆🙆🙆🙆🙆
Xét về tầm giá thì TinoHost rất đáng để mua và sử dụng lâu dài.
Dịch vụ chất lượng, ủng hộ 1 năm nay rồi
tuyệt vời quá đi,tuyệt vời quá đi
Tốc độ ổn định, tư vấn nhiệt tình
mới tham gia, mong mọi người hỗ trợ thêm
Tốc độ khá tốt với gói rẻ nhất 9k
Giao dịch nhanh,support nhanh và tận tình,chuyển miền nhanh,Hosting Ok
mua sản phẩm dịch vụ tinhot rất tốt tặng ad 5tr ** luon nè🥰🥰🥰
tinohost
một truong những nơi bán hosting rẻ, chất lượng dành cho anh em nào cần để làm web
mua tại : tinohost.com
Tư vấn tận tình và nhanh gọn mỗi khi có vấn đề trục trặc. Hosting ổn định, giá rẻ tốt lắm nhé mọi người
mình đã mua 2 tên miền + hosting của Tino Host . quả nhiên hiệu quả SEO cải thiện đáng kể và chứng chỉ bảo mật HTTPS miễn phí của Tino Host cũng ko kém phần quang trọng cho việc SEO website của mình
Tino host là một trong nhà cung cấp tốt nhất mình từng sử dụng. Với ưu đãi khuyến mại nhiều, giá thành rẻ kèm theo đó là sự support tuyệt vời của các admin. Nếu ai chưa lựa chọn được nhà cung cấp cho bản thân mình thì Tinohost sẽ là câu trả lời tốt nhất.
dịch vụ tốt, đội ngũ support nhiệt tình, cảm ơn #tinohost
Uy tín, chất lượng, nhân viên hỗ trợ nhiệt tình
mua 2 domain tại tinohost dùng rất chất lượng
Đã mua 02 domain và hosting tại TinoHost, hài lòng cách tư vấn và chăm sóc khách hàng của TinoHost :)
Giá rẻ cấu hình mạnh, black friday là sự bùng nổ của Tino
Hay web bán tài nguyên rất ngon
dịch vụ tốt, mua luôn host chất lượng cao của công ty nhân dịp blackfriday, cảm ơn #tinohost
Dịch vụ rất tốt, nhân viên tận tình.
Hỗ trợ nhiệt tình nhất trong các nhà cung cấp mih từng dùng. Không những server mạnh, ưu đãi có 1 không 2 mà còn nhiều plugin pro bản quyền đính kèm nữa. Quyết định gắn bó "Lifetime" với tino 😁
Dịch vụ tốt hỗ trợ nhanh chóng
Thích cách tư vấn tận tình và nhanh gọn của Tino mỗi khi có vấn đề trục trặc. Hosting ổn định, giá rẻ tốt lắm nhé mọi người
mình có mua 2 tên msiền của tino, mình rât thích cách tư vấn và chăm sóc khách hàng tại đây. Ngoài ra giá domain khá rẻ, phù hợp cho mọi người. 5 sao
Dịch vụ tốt, support nhiệt tình
tinohost tuyệt vời giá cả hợp lý
domain mua rất rẻ :))))
Next Reviews
CÔNG TY CỔ PHẦN TẬP ĐOÀN TINO
Trụ sở chính: L17-11, Tầng 17, Tòa nhà Vincom Center, Số 72 Lê Thánh Tôn,  Phường Bến Nghé, Q. 1, TP. Hồ Chí Minh

Văn phòng kinh doanh: Số 42 Trần Phú, Phường 4, Quận 5, TP HCM
GPKD số 0315679836 do Sở KH và ĐT TP Hồ Chí Minh cấp
Hotline: 0364 333 333
Góp ý/Phản ánh dịch vụ: 0933 000 886