Cài đặt Nginx FastCGI Cache để giảm thời gian phản hồi của máy chủ

C

Nginx là một trong những máy chủ web phổ biến nhất trên thế giới và có khả năng phục vụ các trang web với dung lượng lớn. Nó tiết kiệm tài nguyên hệ thống hơn Apache và có thể được sử dụng làm máy chủ web hoặc proxy ngược. FastCGI Cache sẽ giúp giảm tải cho server, từ đó tăng tốc độ load trang.

Nginx FastCGI Cache là gì?

Nginx được cấu hình để chuyển yêu cầu PHP sang PHP-FPM vì bản thân Nginx không thể xử lý mã PHP. Hãy cùng tìm hiểu cách mà LEMP hoạt động.

  1. Các trình duyệt web gửi yêu cầu HTTP đến Nginx.
  2. Nếu Nginx tìm thấy mã PHP, nó sẽ chuyển yêu cầu tới PHP-FPM để xử lý mã PHP.
  3. Nếu cần, PHP-FPM sẽ truy vấn cơ sở dữ liệu MySQL/MariaDB để lấy những gì nó cần.
  4. PHP-FPM tạo ra một trang HTML tĩnh, sau đó trả lại cho Nginx.
  5. Cuối cùng, Nginx gửi trang HTML tĩnh tới trình duyệt web.

Nginx hoạt động cực nhanh khi phục vụ các trang HTML tĩnh. Thay vì chuyển yêu cầu trang động tới PHP-FPM, Nginx có thể lưu trữ trang HTML đã tạo để lần sau nó có thể gửi các trang được lưu trong bộ nhớ cache tới trình duyệt web.

  • Điều này có thể cải thiện đáng kể thời gian phản hồi của máy chủ và giảm tải cho PHP-FPM và MySQL/MariaDB.
  • Nó cũng cho phép Nginx phục vụ các trang web từ bộ đệm khi máy chủ cơ sở dữ liệu PHP-FPM gặp vấn đề (MySQL/MariaDB thường sẽ không hoạt động khi máy chủ Linux của bạn hết dung lượng).

FastCGI là giao thức giữa Nginx và PHP-FPM nên cache được gọi là FastCGI Cache.

Hướng dẫn cài đặt Nginx FastCGI Cache

1. Cài đặt LEMP stack

Để cài đặt FastCGI Cach trước tiên bạn cần cài đặt một LEMP stack, mình thường dùng DigitalOcean vì nó có sẵn one click install LEMP stack, rất tiện.

2. Cấu hình NGINX

Chỉnh sửa tập tin cấu hình chính Nginx /etc/nginx/nginx.conf.

sudo vi /etc/nginx/nginx.conf

Trong http block, các bạn thêm 2 dòng sau:

fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=THICHCACHE:100m max_size=10g inactive=60m use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Lệnh fastcgi_cache_path sẽ tạo bộ đệm FastCGI. Lệnh này chỉ khả dụng trong block http của tệp cấu hình Nginx.

  • Đối số đầu tiên chỉ định vị trí lưu cache (/etc/nginx/cache/).
  • Tham số level thiết lập hệ thống phân cấp thư mục hai cấp dưới /etc/nginx/cache/. Nếu có quá nhiều tệp trong một thư mục có thể làm chậm việc truy cập tệp, vì vậy  bạn nên sử dụng thư mục hai cấp . Nếu tham số level không được cấu hình, Nginx sẽ đặt tất cả các tệp trong cùng một thư mục.
  • Đối số thứ 3 chỉ định tên của tên vùng nhớ chung (THICHCACHE) và kích thước của nó (100M). Vùng nhớ này để lưu trữ các khóa bộ đệm và siêu dữ liệu như thời gian sử dụng. Có một bản sao của các phím trong bộ nhớ cho phép Nginx nhanh chóng xác định xem yêu cầu là HIT hay MISS mà không cần phải vào đĩa, giúp tăng tốc đáng kể việc kiểm tra. Vùng 1 MB có thể lưu trữ dữ liệu cho khoảng 8.000 khóa, vì vậy vùng 100 MB có thể lưu trữ dữ liệu cho khoảng 800.000 khóa.
  • max_size đặt giới hạn tối đa của kích thước bộ đệm (10GB trong ví dụ này). Nếu không được chỉ định, bộ đệm có thể sử dụng tất cả dung lượng đĩa còn lại. Khi bộ đệm đạt kích thước tối đa, trình quản lý bộ đệm Nginx sẽ xóa các tệp được sử dụng gần đây nhất khỏi bộ đệm.
  • inactive : Dữ liệu không được truy cập trong khoảng thời gian không hoạt động (60 phút) sẽ được trình quản lý bộ đệm xóa khỏi bộ đệm, bất kể nó đã hết hạn hay chưa. Giá trị mặc định là 10 phút. Bạn cũng có thể sử dụng các giá trị như 12h (12 giờ) và 7d (7 ngày).
  • use_temp_path: Đầu tiên Nginx ghi các tệp được định sẵn cho bộ đệm vào vùng lưu trữ tạm thời (/var/lib/nginx/fastcgi/). use_temp_path = off bắt buộc Nginx ghi chúng trực tiếp vào thư mục bộ đệm để tránh việc sao chép dữ liệu không cần thiết giữa các hệ thống tệp.

Lệnh thứ hai fastcgi_cache_key xác định khóa để tra cứu bộ đệm. Nginx sẽ áp dụng hàm băm MD5sum trên khóa bộ đệm và sử dụng kết quả băm làm tên của các tệp bộ đệm. Sau khi nhập hai chỉ thị trong block http, lưu và đóng tệp.

Sau đó các bạn tiến hành tạo thư mục chứa cache và phân quyền cho nó

sudo mkdir -p /etc/nginx/cache
sudo chown -R www-data:www-data /etc/nginx/cache

Lưu ý www-data là user Nginx của bạn.

3. Chỉnh sửa Server Block

Tiếp theo mở tập tin cấu hình Server Block (Vhost) của bạn.

sudo vi /etc/nginx/conf.d/thich.dev.conf

Thêm dòng sau vào block server:

server{
# ...
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
# ...
}

Cuộn xuống vị trí ~\.php$. Thêm các dòng sau trong phần này.

server{
    # ...
    location ~ \.php$ {
        # ...
        fastcgi_cache THICHCACHE;
        fastcgi_cache_valid 200 301 302 60m;
        fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
        fastcgi_cache_min_uses 1;
        fastcgi_cache_lock on;
        add_header X-FastCGI-Cache $upstream_cache_status;
    }
    # ...
}
  • Lệnh fastcgi_cache cho phép lưu vào bộ đệm, sử dụng vùng nhớ được tạo trước đó bởi lệnh fastcgi_cache_path.
  • Fastcgi_cache_valid đặt thời gian bộ đệm tùy thuộc vào mã trạng thái HTTP. Trong ví dụ trên, các phản hồi với mã trạng thái 200, 301, 302 sẽ được lưu trong 60 phút. Bạn cũng có thể sử dụng khoảng thời gian như 12h (12 giờ) và 7ngày (7 ngày).
  • Nginx có thể phân phối nội dung cũ từ bộ đệm của nó khi nó nhận được nội dung cập nhật từ máy chủ PHP-FPM. Ví dụ: khi máy chủ cơ sở dữ liệu MySQL/MariaDB ngừng hoạt động. Thay vì chuyển lỗi cho khách hàng, Nginx có thể cung cấp phiên bản cũ của tệp từ bộ đệm của nó. Để kích hoạt chức năng này, chúng tôi đã thêm fastcgi_cache_use_stale.
  • fastcgi_cache_min_uses đặt số lần một mục mà khách hàng phải yêu cầu trước khi Nginx lưu trữ nó. Giá trị mặc định là 1.
  • Khi bật fastcgi_cache_lock, nếu nhiều máy khách yêu cầu một tệp không có trong bộ đệm, chỉ những yêu cầu đầu tiên trong số đó mới được phép thông qua máy chủ PHP-FPM. Các yêu cầu còn lại chờ yêu cầu đó được bão hòa và sau đó sử dụng tệp từ trong bộ đệm. Nếu không bật fastcgi_cache_lock, tất cả các yêu cầu sẽ được chuyển thẳng đến máy chủ PHP-FPM .
  • Dòng thứ 3 thêm tiêu đề X-FastCGI-Cache trong phản hồi HTTP. Nó có thể được sử dụng để xác thực xem yêu cầu đã được phục vụ từ bộ đệm FastCGI hay chưa.

Bây giờ lưu và đóng tệp cấu hình Server Block (Vhost). Sau đó kiểm tra cấu hình Nginx của bạn.

nginx -t

Nếu không có lỗi nào được thông báo hãy tải lại Nginx.

sudo service nginx reload

4. Kiểm tra Nginx FastCGI Cache

curl -I https://thich.dev

Hãy xem tiêu đề X-FastCGI-CacheHIT cho biết phản hồi đã được phục vụ từ bộ đệm.

Vậy là xong.

5. Cấu hình loại trừ cache

Sau khi cấu hình thành công, website của bạn sẽ được cache tất cả các trang, vì vậy chúng ta cần loại bỏ một số trang không nên cache như: Phiên đăng nhậpcookie POST requestchuỗi truy vấnback-end WordPresssitemapFeed….. Để tắt bộ đệm ẩn cho các mục trên, hãy tạo file /etc/nginx/snipets/nginx-cache.conf

Trong hướng dẫn này mình sẽ cấu hình loại trừ cache cho website sử dụng wordpress.

sudo vi /etc/nginx/snipets/nginx-cache.conf

Dán nội dung sau vào file

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) của bạn và thêm phía trên dòng Location ~\.php$

include /etc/nginx/snipets/nginx-cache.conf;

Tiếp theo trong section  ~\.php$ thêm vào các cấu hình sau.

fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;

Lưu tệp và tải lại Nginx để cấu hình có hiệu lực.

sudo service nginx reload

6. Cấu hình tự động xóa bộ nhớ cache với WordPress

Đầu tiên, bạn cần cài đặt và kích hoạt plugin Nginx Cache trên trang web WordPress của bạn. Sau khi cài đặt và kích hoạt plugins  truy cập Tools -> Nginx Cache và cấu hình plugins

  • Cache Zone Path: Đường dẫn tới thư mục lưu cache
  • Purge Cache: Tự động xoá cache khi có thay đổi về nội dung

Bây giờ bạn có thể sửa đổi một trong những bài viết của mình để xem liệu bộ đệm có được tự động xóa hay không.

Tham khảo: https://blog.hostvn.net/chia-se/cai-dat-nginx-fastcgi-cache-de-giam-thoi-gian-phan-hoi-cua-may-chu-wordpress.html

Add Comment

By Thích Dev

Thích Dev

Mình thích
thì
mình dev hoy

Get in touch

Quickly communicate covalent niche markets for maintainable sources. Collaboratively harness resource sucking experiences whereas cost effective meta-services.

Tags

Dev Languages