Nginx Caching là gì?

Caching là một trong những kỹ thuật đơn giản mà hiệu quả để tăng tốc độ tải website, đặc biệt là khi Nginx đóng vai trò Reverse Proxy. Sử dụng cache có thể làm giảm đáng kể tài nguyên tiêu thụ của hệ thống, đồng thời làm tăng trải nghiệm cho người dùng. Trong bài viết này, Zhost sẽ hướng dẫn các bạn cách cấu hình lưu cache trên Nginx.

Cơ chế caching trên Nginx

Khi bật cơ chế caching, Nginx sẽ lưu kết quả trả về từ Web Server Backend (upstream server) lại trên disk hoặc RAM nếu ta cấu hình lưu cache trên shared memory /dev/shm và dùng kết quả cache này để trả lời cho client mà không cần phải chuyển tiếp request cho Backend. Một số lợi ích mà caching đem lại cho cả hệ thống và người dùng:

    • Tăng hiệu năng của ứng dụng/trang web: cache lại kết quả của những request tương tự nhau, không cần phải xử lý các request này nhiều lần.
    • Tăng khả năng chịu tải của các Web Server Backend.
    • Tăng tính sẵn sàng cho dịch vụ: nginx sẽ trả kết quả cache cho người dùng nếu như các Web Server Backend gặp sự cố không truy cập được.

Cụ thể cơ chế lưu và truy vấn Cache của Nginx như sau:

    • 1a: Client A gởi một request tới nginx
    • 1b: Trong cache key hiện tại không có key tương ứng với request của client A. Nginx sẽ chuyển request này cho các Web Server Backend ở phía sau.
    • 1c: Web Server Backend phản hồi và gởi lại kết quả cho Nginx, Nginx lưu lại kết quả này trong cache.
    • 1d: Nginx gởi lại kết quả cho client.
    • 2a: Client B gởi một request mới tương tự như request lúc nãy của client A.
    • 2b: Nginx lấy lại kết quả phản hồi của client A lúc nãy trong cache và gởi cho client B mà không cần phải liên hệ với Web Server Backend.

Quản lý cache

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

  • 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ấu hình load cache tuần tự 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.

Cấu hình Caching cho Nginx trên CentOS 7

Mô hình Lab

Trong bài viết này, Zhost sử dụng một server có IP 10.10.10.11 cài đặt Apache làm Web Server Backend và Nginx làm Reverse Proxy.

Các bước cài đặt Reverse Proxy bạn có thể tham khảo tại bài viết: Cấu hình Nginx làm Reverse Proxy cho Apache

Các bước thực hiện cấu hình Cache cho Nginx

Tạo thư mục lưu cache cho Nginx:

mkdir /var/nginx-caching

Chuyển quyền sở hữu thư mục cache cho User Nginx (Để biết user nào đang được xử dụng để quản lý tiến trình nginx bạn vào file /etc/nginx/nginx.conf). Trong bài viết này là user nginx.

chown nginx:nginx /var/nginx-caching/

Mở file /etc/nginx/nginx.conf và thêm đoạn cấu hình caching vào Block http {}

proxy_cache_path /var/nginx-caching levels=1:2 keys_zone=zhost_cache:10m max_size=10g inactive=60m use_temp_path=off;

Trong đó:

    • proxy_cache_path: Thiết lập vị trí lưu các cache file. Chúng ta thiết lập lưu trong đường dẫn /var/nginx-caching
    • /var/nginx-caching: Đường dẫn lưu Cache cho nginx
    • levels=1:2 : Cấp độ mà nginx sẽ lưu cache. Sẽ được giải thích chi tiết phía dưới.
    • keys_zone=zhost_cache:10m  : dùng thiết lập shared memory zone cho lưu trữ cache keys và metadata. Ở đây sử dụng 10MB.
    • max_size=10g : Thiết lập không gian disk tối đa mà nginx sử dụng để lưu cache.
    • inactive=60m :  Thiết lập thời gian (60 phút) nginx clear cache một số asset mà không được truy cập.
    • use_temp_path=off : không sử dụng temp

Lưu lại và thoát.

Khai báo cache trong Virtual host, mở file virtual host và thêm đoạn khai báo cache (ở đây sử dụng Virtual host default /etc/nginx/conf.d/default.conf).

Tại block location / {} thêm đoạn khai báo cache:

proxy_cache zhost_cache;

Trong đó:

    • proxy_cache: Khai báo cache cho location.
    • zhost_cache: Tên keys_zone được khai báo phía trên.

Khởi động lại Nginx

systemctl restart nginx.service

Như vậy ta đã cấu hình cache xong, Nginx sẽ thực hiện lưu Cache vào đường dẫn /var/nginx-caching khi có user truy cập.

Để kiểm tra cache đã thực sự hoạt động hay chưa, bạn có thể xem dung lượng của folder lưu cache của nginx:

du -sh /var/nginx-caching/

Nếu thấy dung lượng folder cache tăng lên khi có user truy cập thì đã thành công.

Cấu hình Nginx lưu cache trên nhiều vị trí khác nhau

Nếu có nhiều hard disk, chúng ta có thể tách vị trí lưu cache đến nhiều vị trí khác nhau.

Mở file /etc/nginx/nginx.conf và thêm đoạn cấu hình caching vào Block http {}

proxy_cache_path /path/to/cache1 levels=1:2 keys_zone=my_cache_1:10m max_size=10g inactive=60m use_temp_path=off;
proxy_cache_path /path/to/cache2 levels=1:2 keys_zone=my_cache_1:10m max_size=10g inactive=60m use_temp_path=off;

split_clients $request_uri $zhost_cache {
         50% "my_cache_1";
         50% "my_cache_1";
}

Ở đây, chúng ta tách vị trí lưu cache ra 2 vị trí khác nhau là /path/to/cache1 và /path/to/cache2 lưu ở 2 key zone là my_cache_1 và my_cache_3.

Sử dụng khối cấu hình “split_clients” để định nghĩa key zone chung với biến $my_cache cho 2 key zone và cho phép mỗi vị trí sẽ cache một nửa số lượng request (50%). MD5 hash dựa trên biến $request_uri để xác định cache nào được sử dụng cho mỗi request.

Khai báo cache trong Virtual host, mở file virtual host và thêm đoạn khai báo cache (ở đây sử dụng Virtual host default /etc/nginx/conf.d/default.conf).

Tại block location / {} thêm đoạn khai báo cache:

proxy_cache zhost_cache;

 

Một số tùy chọn và tham số cấu hình Caching cho Nginx

proxy_cache_path: Thiết lập vị trí lưu các cache file. Chúng ta thiết lập lưu trong đường dẫn /store/cache/example.com/

  • levels: Chị thì này dùng để thiết lập cách các cache file được lưu đến hệ thống tệp tin (hay là cấp độ tạo thư mục cho lưu cache file). Nếu không định nghĩa, cache file được lưu trực tiếp vào vị trí được định nghĩa. Nếu một số lượng lớn các tệp tin cache được lưu trực tiếp vào một thư mục, khi đó tốc độ truy cập đến tệp tin sẽ chậm đi. Vì vậy, chúng ta định nghĩa levels, ví dụ như trong cấu hình levels=1:2 nghĩa là thư mục được phân thành 2 cấp, khi đó cache file được lưu vào thư mục con của vị trí lưu cache, dựa trên mã md5 hashes.
  • keys_zone: dùng thiết lập shared memory zone cho lưu trữ cache keys và metadata. Một bản sao các keys trong memory sẽ làm cho Nginx nhanh hơn để xác định request nào là HIT hay MISS mà không phải truy cập xuống disk, mục đích tăng tốc độ check. Ở đây, chúng ta định nghĩa keys_zone với tên example.com. Với 1MB zone, có thể lưu trữ dữ liệu cho khoảng 8000 keys, vì thế mà chúng ta cấu hình 400MB, có thể lưu trữ đến 3200000 keys.
  • Inactive: Chỉ thị này được dùng để bảo nginx clear cache một số asset mà không được truy cập trong khoảng time được thiết lập mà không quan tâm đến là cache đó đã expire hay chưa. Inactive content khác với expire content. Nginx không tự động xóa nội dung mà đã expire được định nghĩa bởi một cache control header. Ở đây, chúng ta thiết lập inactive=10d (10 ngày). Mặc định inactive được thiết lập là 10 phút.
  • max_size: Thiết lập không gian disk tối đa mà nginx sử dụng để lưu cache. Nếu không định nghĩa, mặc định nó sử dụng toàn bộ không gian disk có sẵn để sử dụng cho việc lưu cache. Khi cache đạt đến giới hạn được định nghĩa, một tiến trình cache manager được sử dụng để remove các tệp mà được sử dụng gần nhất để đưa cache size về dưới giới hạn được định nghĩa.

proxy_cache_key: Định nghĩa key cho cache. Mặc định cấu hình với giá trị sau: proxy_cache_key $scheme$proxy_host$uri$is_args$args;

Chúng ta có thể thay thế giá trị các biến sử dụng trong định nghĩa key, tùy thuộc giá trị mong muốn. Ví dụ định nghĩa key cho cache như sau: proxy_cache_key "$scheme://$host$request_uri";

proxy_cache_revalidate: Nếu chỉ thị này enable, Nginx xác minh nội dung cache hiện tại vẫn hợp lệ. Cái này cho phép tiết kiệm bandwidth bởi vì server chỉ gửi item đầy đủ nếu nó đã sửa đổi từ lần được khi lại trong header Last-Modified kèm theo tệp tin khi Nginx tổ chức cache nó.

proxy_cache_min_uses: Thiết lập số lần request một nội dung (item) của một client trước khi Nginx thực hiện cache nó. Mặc định giá trị proxy_cache_min_uses là 1.

proxy_cache_use_stale: Khi origin server down trong một khoảng thời gian (mà chưa refesh) gặp các mã lỗi 5xx, khi đó client request nội dung mà đã được cache từ nginx cache server nó sẽ vẫn nhận thông tin đã cache.

Để bật tính năng này, chúng ta cấu hình như sau trong virtual host:

location / {
    # ...
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
}

proxy_next_upstream: Chỉ định trường hợp nào một request sẽ được chuyển qua nginx cache server tiếp theo. Chúng ta chỉ định các trường hợp lỗi sau:

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

proxy_ignore_headers: Chỉ thị cho phép Nginx bỏ qua một số header. Ví dụ bỏ qua header Cache-Control và Set-Cookie

proxy_ignore_headers Cache-Control Set-Cookie;

proxy_cache_methods: Chỉ thị cho phép một số method được cache, mặc định GET và HEAD luôn được phép.

proxy_cache_lock: Tùy bật tùy chọn này với giá trị “on”, nếu nhiều client cùng request đến một file mà hiện tại chưa cache, khi đó chỉ có request đầu tiên được phép thực hiện contact với origin server và sau đó nội dung sẽ được cache.

 

Như vậy là Zhost đã hướng dẫn các bạn chi tiết cách cấu hình Nginx Caching,

Nếu có thắc mắc nào, hãy liên hệ với chúng tôi để được giải đáp.

Chúc các bạn thành công.

Leave a Reply

Your email address will not be published. Required fields are marked *