Skip to content Skip to main navigation Skip to footer

Thiết lập Nginx FastCGI Cache trên NGINX giảm thời gian phản hồi máy chủ

Thiết lập Nginx FastCGI Cache trên NGINX giảm thời gian phản hồi máy chủ cho website WordPress của bạn.

I. Tổng quan

Nginx FastCGI Cache là gì?

Trước khi đi vào thực hiện cài đặt hãy cùng mình tìm hiểu qua về Nginx FastCGI Cache nhé. Nếu bạn đang sử dụng LEMP thì chắc bạn sẽ biết bằng Nginx xử lý các file tĩnh rất tốt, và Nginx sẽ không xử lý được các yêu cầu mã PHP, do đó nginx được định cấu hình để chuyển các yêu cầu PHP đến PHP-FPM. Và mình sẽ mô tả cách hoạt động, mô hình của LEMP để bạn nắm nhé.

  • Khi client (người dùng) truy cập vào website, trình duyệt sẽ gửi một yêu cầu (request) HTTP đến Nginx, và khi đó nó sẽ tìm nạp trang từ hệ thống tệp.
  • Nếu Nginx tìm thấy mã PHP trong trang nó sẽ chuyển yêu cầu tới PHP-FPM để xử lý các mã PHP này. Và nếu cần thì PHP-FPM sẽ truy vấp cơ sở dữ liệu MySQL/MariaDB để tìm kiếm và lấy những gì mà PHP-FPM cần.
  • Sau đó PHP-FPM sẽ tạo ra một trang tĩnh là HTML và trả ngược lại cho Nginx và cuối cùng Nginx phản hồi (response) gửi trang HTML tĩnh đến cho trình duyệt web trả về kết quả ở client

Khi lựa chọn máy chủ webserver để xây dựng website mình luôn ưu tiên Nginx, vì Nginx nó rất nhanh khi cung cấp các trang tĩnh HTML. Và thay vì chuyển các yêu cầu trang động PHP đến PHP-FPM để xử lý tạo ra trang HTML mọi lúc, thì khi đó Nginx có thể lưu vào bộ nhớ cache trang HTML đã tạo để lần sau nó có thể gửi các trang đã lưu trong bộ nhớ cache tới trình duyệt web, loại bỏ các yêu cầu PHP và cở sở dữ liệu.

  • Điều này có thể cải thiện đáng kể thời gian phản hồi máy chủ và giảm tải trên PHP-FPM và máy chủ cở sở dữ liệu.
  • Nó cũng cho phép Nginx phân phát các trang web từ bộ nhớ cache khi máy chủ cơ sở dữ liệu hoặc PHP-FPM gặp sự cố (ảnh đính kèm)
  • FastCGI là giao thức giữa Nginx và PHP-FPM nên cache được gọi là FasstCGI Cache.

Để không mất thời gian của các bạn hãy cùng mình đi vào các bước thực hiện nhé. Trong các bước mình sẽ hướng dẫn chi tiết kèm theo các mô tả đính kèm.

II. Các bước cấu hình

Để cấu hình Nginx FastCGI Cache trên NGINX bạn thực hiện tuần tự theo các bước sau. Vì các thao tác chỉnh sửa file cấu hình và nếu bạn là người mới mình sẽ thêm một lệnh cp (copy) sao chép ra một bản mới để phòng một trường hợp cấu hình sai hoặc xoá nhầm có thể phục hồi lại được.

Bước 1: Chỉnh sửa file cấu hình NGINX

Đầu tiên bạn hãy mở file cấu hình nginx.conf và thêm các dòng sau vào bên trong block http { như sau.

AZDIGI Tutorial
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
vi /etc/nginx/nginx.conf
    
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache FASTCGICACHE;
fastcgi_cache_valid 60m;
add_header X-FastCGI-Cache $upstream_cache_status;

Trong đó:

  • fastcgi_cache_bypass $skip_cache: Xác định các điều kiện mà theo đó phản hồi sẽ không được lấy từ bộ nhớ cache. Trong khi fastcgi_no_cache $skip_cache xác định các điều kiện mà theo đó phản hồi sẽ không được lưu vào bộ nhớ cache.
  • fastcgi_cache FASTCGICACHE:
  • fastcgi_cache_valid 60m: Thiết lập thời gian tuỳ thuộc vào bộ nhớ cache mã trang thái HTTP. Trong bài viết này thì các phẩn hồi sẽ được lưu vào bộ nhớ đệm trong 60 phút (Bạn có thể tuỳ chọn theo ngày hoặc giờ ví dụ là 24h, 7d)
  • add_header X-FastCGI-Cache $upstream_cache_status: Dòng này được sử dụng để xác nhận xem các yêu cầu đã được phục vụ từ bộ nhớ cache FastCGI hay là chưa.
Thiết lập Nginx FastCGI Cache trên NGINX

Bước 2: Định cấu hình NGINX để kích hoạt FastCGI Cache

Bạn hãy mở file cấu hình vhost của domain để định cấu hình cache. Trước tiên bạn cần xác định được file vhost domain của bạn nằm ở đâu trước đã. Bạn có thể tìm kiếm nhanh bằng cách mở file nginx.conf kiểm tra. Thông thường thì các file sẽ được include tại đây include /etc/nginx/conf.d/*.conf;.

Lưu ý: Thay my_domain.conf bằng tên miền của bạn

Sau khi đã xác định được bạn hãy mở file cấu hình vhost domain và thêm các dòng sau.

AZDIGI Tutorial
cp /etc/nginx/conf.d/my_domain.conf /etc/nginx/conf.d/my_domain.conf.bak
vi /etc/nginx/conf.d/my_domain.conf
    

Bạn hãy copy 4 dòng bên dưới và thêm ở trên block server { như ảnh minh hoạ bên dưới.

fastcgi_cache_path /var/run/nginx-fastcgi-cache levels=1:2 keys_zone=FASTCGICACHE:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

Trong đó

  • fastcgi_cache_path: Dòng này tạo bộ nhớ caceh FastCGI được lưu trong đường dẫn /var/run/nginx-fsatcgi-cache.
    • levels: sẽ xác định phân cấp của bộ nhớ cache
    • keys_zone (name:size): Cho phép tạo vùng bộ nhớ chia sẻ nơi lưu trữ tất cả các khóa hoạt động và thông tin về dữ liệu (meta). Lưu ý rằng việc lưu trữ các khóa trong bộ nhớ sẽ tăng tốc quá trình kiểm tra, bằng cách giúp NGINX dễ dàng xác định xem MISS hay HIT của nó mà không cần kiểm tra trạng thái trên disk.
  • fastcgi_cache_key: Xác định khoá để tra cứu bộ nhớ cache. Nginx sẽ áp dụng hàm MD5sum trên khoá bộ nhớ cache và sử dụng kết quả hash làm tên của tệp bộ nhớ cache.
  • fastcgi_cache_use_stale: Làm cho bộ nhớ cache Nginx trở nên mạnh mẽ hơn. Điều này yêu cầu Nginx tiếp tục cung cấp các bản đã lưu trong bộ nhớ cache cũ cuả một trang ngay cả khi PHP gặp sự cố.
  • fastcgi_ignore_headers: Vô hiệu hoá việc xử lý các trường tiêu đề phản hồi nhất định từ máy chủ FastCGI (bạn có thể tìm hiểu thêm ở trang này.)
Thiết lập Nginx FastCGI Cache trên NGINX

Bước 3: Cấu hình nội dung không lưu vào bộ nhớ Cache

Các phiên đăng nhập, cookie người dùng, các yêu cầu POST, chuỗi truy vấn, WordPress back-end, sơ đồ trang web (sitemap), feeds và tác giả nhận xét không nên lưu vào bộ nhớ đệm. Và để tắt bộ nhớ đệm cho các mục trên, hãy chỉnh sửa tệp cấu hình nginx tại file nginx.conf. Tại đây bạn hãy thêm các dòng sau bên dưới block location ~ .php$

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/|index.php|sitemap(_index)?.xml") {
     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;
 }

Ảnh minh hoạ thực tế

Thiết lập Nginx FastCGI Cache trên NGINX

Sau khi đã thêm vào file cấu hình vhost hoàn tất. Bạn hãy di chuyển sang bước tiếp theo để hoàn thành.

Bước 4: Khởi động lại dịch vụ NGINX

Trước khi khởi động lại dịch vụ bạn hãy test file cấu hình nginx bằng cách sử dụng cú pháp nginx -t để kiểm tra. Nếu kết quả trả về nginx: configuration file /etc/nginx/nginx.conf test is successful thì bạn hãy khởi động lại dịch vụ.

AZDIGI Tutorial
nginx -t
service nginx restart
    
Thiết lập Nginx FastCGI Cache trên NGINX

Bước 5: Cài đặt Plugin và kiểm tra Cache

Cài đặt Plugin Cache

Bước cuối cùng bạn cần làm là cài đặt plugin NGINX Cache của WordPress để tự động xóa bộ nhớ cache FastCGI bất cứ khi nào nội dung trang web WordPress của bạn thay đổi. Có nhiều plugin để bạn lựa chọn, nhưng trong bài này mình sẽ sử dụng một plugin của Till Krüss, và plugin đó có tên là NGINX Cache.

Sau khi cài đặt hoàn tất, bạn thực hiện kích hoạt Plugin lên để sử dụng.

Thiết lập Nginx FastCGI Cache trên NGINX

Tiếp theo bạn truy cập vào Tools => Nginx Cache. Ở phần Cache Zone Path bạn hãy nhập vào đường dẫn lưu cache mà đã tạo ở Bước 2 trong dòng fastcgi_cache_path /var/run/nginx-fastcgi-cache. Sau khi nhập xong bạn thực hiện click Save Changes để áp dụng thay đổi.

Thiết lập Nginx FastCGI Cache trên NGINX

Kiểm tra FastCGI Cache

Tại cửa sổ Terminal bạn nhập vào lệnh curl -I https://my-domain để kiểm tra trực tiếp. Nếu xuất hiện dòng X-FastCGI-Cache: HIT có nghĩa đã cache thành công. Và nếu xuất hiện X-FastCGI-Cache: MISS có nghĩa trang đó chưa được cache lại.

Ngoài ra bạn có thể kiểm tra từ trình duyệt bằng cache kiểm tra Headers. Bận nhấm phím F12 sau đó di chuyển sang Tab Network và reload lại wesbite. Sau đó kiểm tra phần Response Headers nếu hiện X-FastCGI-Cache: HIT thì đã cache hoàn tất.

Bảng so sánh trước và sau khi cache

Mình sử dụng ApacheBench để kiểm tra trước và sau khi cache.

AZDIGI Tutorial
ab -n 100 -c 10 https://lab5.dotrungquan.info/
    

Lệnh này có nghĩa là 100 kết nối từ 10 người dùng khác nhau. Và ảnh bên dưới là kết quả benchmark của mình. Bạn hãy xem các thông số từ dưới dòng Document Length và các thông số quan trọng là Requests per second: Time per request:Time per request: trước và sau khi cache khác biệt rất rõ rệt.

III. Tổng kết

Như vậy mình đã hướng dẫn hoàn tất các bước thiết lập Nginx FastCGI Cache trên NGINX giảm thời gian phản hồi máy chủ. Chúc các bạn có thể thực hiện thành công. Xem thêm các bài viết hữu ích về VPS Linux tại đường dẫn sau:

Nếu các bạn cần hỗ trợ các bạn có thể liên hệ bộ phận hỗ trợ theo các cách bên dưới: