Hướng dẫn cài đặt Nginx FastCGI Cache để tối ưu WordPress
Nginx là một trong những máy chủ web phổ biến nhất trên thế giới với khả năng phục vụ website với lưu lượng truy cập lớn, tiết kiệm tài nguyên hệ thống cùng những tính năng tuyệt vời như Reverse Proxy, Load Balancing.
Việc thêm cache cho Nginx là cách đơn giản để cải thiện hoạt động, khả dụng và tính sẵn sàng của ứng dụng web, đặc biệt là WordPress.
Bài viết này sẽ hướng dẫn bạn cách cài đặt Nginx FastCGI Cache giúp giảm tải máy chủ, load website của bạn nhanh hơn.
Cơ chế Nginx FastCGI Cache
Trường hợp không có cache, ứng dụng web phản hồi trực tiếp cho user
Khi tích hợp cache vào Nginx, mọi request đều đi qua nó
Một ví dụ về HTTP request trong hình dưới
Dựa vào đó, Nginx tạo một hash key
Nginx kiểm tra hash key này có tồn tại trong bộ nhớ. Nếu không, nó cho request đi thẳng vào ứng dụng
Ứng dụng trả lời và phản hồi sẽ được lưu trong thư mục hệ thống
Chỉ duy nhất hash key tạo trước đó được thêm vào bộ nhớ
Sau cùng user nhận được phản hồi
Khi user request vào ứng dụng đó lần hai, Nginx lại tạo một hash key và kiểm tra sự tồn tại của nó trên bộ nhớ. Nginx sẽ phục vụ file được cache trong thư mục hệ thống có liên quan đến hash key
Cấu hình Nginx FastCGI Cache
1. Chỉnh sửa tập tin cấu hình chính
Trong tập tin /etc/nginx/nginx.conf, thêm 2 dòng sau vào http block:
fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=phpcache:100m max_size=10g inactive=60m use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
Lệnh fastcgi_cache_path tạo đường dẫn bộ đệm (chỉ khả dụng trong http block)
- Đối số đầu tiên chỉ định vị trí lưu cache (/etc/nginx/cache)
- Tham số levels thiết lập hệ thống phân cấp dưới thư mục cache, các tệp đều đặt chung một thư mục nếu tham số này không được cấu hình
- Đối số thứ 3 đặt tên cho cache zone là phpcache có dung lượng là 100m
- max_size: kích thước tối đa của toàn bộ cache là 10GB, nếu không được chỉ định sẽ sử dụng tất cả dung lượng đĩa còn lại
- inactive: dữ liệu không hoạt động (60 phút) sẽ bị xóa khỏi bộ đệm
- use_temp_path: bắt buộc Nginx ghi trực tiếp vào thư mục đệm, không sao chép dữ liệu qua vùng lưu trữ tạm thời
Lệnh fastcgi_cache_key định dạng key (khóa) của cache file để tra cứu bộ đệm
KEY: httpGETwww.tamtt.ml/info.php
- $scheme: http
- $request_method: GET
- $host: www.tamtt.ml
- $request_uri: /info.php
Bạn có thể thay đổi định dạng key này theo ý mình
Tiến hành tạo và phân quyền thư mục cache
mkdir -p /etc/nginx/cache
chown -R nginx:nginx /etc/nginx/cache
2. Chỉnh sửa Server Block (vhost)
Mở tập tin cấu hình vhost, thường nằm tại vị trí /etc/nginx/conf.d/your-domain.conf
Cuộn xuống vị trí ~.php$ thêm các dòng
fastcgi_cache phpcache;
fastcgi_cache_valid 200 301 302 60m;
fastcgi_cache_revalidate on;
fastcgi_cache_methods GET HEAD;
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
fastcgi_cache_min_uses 3;
fastcgi_cache_background_update on;
fastcgi_cache_lock on;
add_header X-FastCGI-Cache $upstream_cache_status;
Các tham số fastcgi_cache mang nghĩa:
- Lệnh đầu kích hoạt vùng nhớ tạo trước đó trên lệnh path
- valid: đặt thời gian bộ đệm tùy mã trạng thái HTTP (vd: 200, 301, 302 trong 60 phút)
- revalidate: Nginx sẽ không tải lại nội dung khi thấy mã code 304, not modified
- method: áp dụng với các phương thức GET HEAD
- use_stale: Nginx phục vụ nội dung cũ hết hạn khi response ứng dụng hết thời gian chờ hoặc trả về mã trạng thái 50x
- min_uses: ra lệnh cho Nginx cache lại response sau khi nó được request theo số lần quy định (3 lần)
- background_update: phối hợp với lệnh use_stale để cập nhật nội dung mới khi ứng dụng sẵn sàng
- lock: cho phép mỗi request đầu tiên đi tới ứng dụng gốc
- X-FastCGI-Cache: thể hiện header trạng thái của cache
Về phần $upstream_cache_status, bạn tham khảo các trạng thái ở link sau
Kiểm tra cấu hình và tải lại Nginx
nginx -t && systemctl reload nginx
3. Kiểm tra FastCGI Cache
Dùng công cụ curl để lấy tiêu đề phản hồi HTTP
curl -I http://your-domain.com
Tiêu đề X-FastCGI-Cache hiện HIT cho biết phản hồi đã được phục vụ từ bộ đệm, còn MISS là chưa cache
4. Cấu hình loại trừ Cache
Các mục không nên lưu trữ trong bộ đệm:
- Phiên đăng nhập
- Cookie
- POST request
- Query
- Back-end WordPress
- Feed
- …
Tạo file /etc/nginx/custom/nginx-cache.conf tắt bộ đệm ẩn cho các mục đó, dán nội dung sau vào:
set $skip_cache 0;
# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
# Don't cache uris containing the following segments
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|^/feed/*|/tag/.*/feed/*|index.php|/.*sitemap.*.(xml|xsl)") {
set $skip_cache 1;
}
# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
Sau đó mở file server block (Vhost) rồi thêm phía trên dòng Location ~.php$
include /etc/nginx/custom/nginx-cache.conf;
Thêm tiếp vào section ~.php$ cấu hình sau:
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
Lưu và tải lại Nginx
Tự động xóa bộ nhớ Cache trong WordPress
Cài plugins Nginx Cache, truy cập Tools -> Nginx Cache và kích hoạt nó lên
- Cache Zone Path: đường dẫn thư mục lưu cache
- Purge Cache: xóa cache tự động khi có thay đổi về nội dung
Bạn kiểm tra bằng việc xóa một trong những bài viết của mình để xem bộ đệm có tự động xóa theo hay không.
Chúc bạn thành công!