NỘI DUNG
I. 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.
- Các trình duyệt web gửi yêu cầu HTTP đến Nginx.
- 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.
- 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.
- PHP-FPM tạo ra một trang HTML tĩnh, sau đó trả lại cho Nginx.
- 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.FastCGI là giao thức giữa Nginx và PHP-FPM nên cache được gọi là FastCGI Cache.
II. Hướng dẫn cấu hình Nginx FastCGI Cache
1. Cài đặt LEMP Stack
Để cấu hình bạn cần cài đặt LEMP Stack vào. Mình đã có viết sẵn một bài cũng khá chi tiết bên dưới. Mời bạn tham khảo và cài đặt nhé.
2. Cấu hình tập tin nginx.conf
Bạn hãy mở file /etc/nginx/nginx.conf
và thêm vào dòng sau bên trong block http {
vi /etc/nginx/nginx.conf
#FastCGI-Cache fastcgi_cache_path /var/run/website1 levels=1:2 keys_zone=website1:100m max_size=10g inactive=60m use_temp_path=off; fastcgi_cache_key "$scheme$request_method$host$request_uri"; #FastCGI-Cache
Chú thích:
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
/var/run/website1
- Tham số level thiết lập hệ thống phân cấp thư mục hai cấp dưới
/var/run/website1
. 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
website1
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.
Tiếp đến bạn tạo thư mục cache path và phân quyền.
Lưu ý: Nếu bạn cài Lemp stack theo hướng dẫn của mình, tạo pool thì bạn phần quyền như bên dưới. Nếu bạn cài theo cách khác bên ngoài. Hãy xem user:group đúng để phân quyền.
mkdir /var/run/website1 chown -R site1:site1 /var/run/website1
3. Chỉnh sửa server block trên vhost domain
Tuỳ vào cấu hình ban đầu khi bạn cài LEMP mà đường dẫn nằm khác nhau. Nếu bạn làm theo hướng dẫn cài đặt LEMP Stack của mình thì mình đặt tại /etc/nginx/sites-enabled
. Và ở đây website của mình là website1.dotrungquan.site
nằm và vhost là /etc/nginx/sites-enabled/site1
vi /etc/nginx/sites-enabled/site1
Và bạn thêm vào cấu hình sau bên dưới ~ .php$ {
#FastCGI-Cache fastcgi_cache website1; 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; fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; #FastCGI-Cache
Chú thích:
- 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.
4. Cấu hình loại trừ Cache
Phiên đăng nhập, cookie, POST request, chuỗi truy vấn, back-end WordPress, sitemap, Feed…. không nên được lưu trữ trong bộ đệm. Để tắt bộ đệm ẩn cho các mục trên, hãy tạo file /etc/nginx/custom/nginx-cache.conf
mkdir -p /etc/nginx/custom vi /etc/nginx/custom/nginx-cache.conf
Sau đó bạn dán nội dung sau và 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; }
Tiếp đến bạn mở lại file cấu hình nginx vhost domain và thêm vào dòng sau trong server {
include /etc/nginx/custom/nginx-cache.conf;
Sau khi cấu hình hoàn tất, bạn hãy kiểm tra file cấu hình xem có lỗi không với lệnh nginx -t
, và khởi động lại dịch vụ nginx
- Kiểm tra file cấu hình
root@sv:/etc/nginx/sites-enabled# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
- Khởi động dịch vụ NGINX
service nginx restart
Kiểm tra Nginx FastCGI Cache
Bạn hãy sử dụng lệnh curl -I để kiểm tra như sau
curl -I http://your-domain.com
Kiểm tra cache băng cách check header ở trình duyệt.
III. Cấu hình FastCGI cache trên WordPress
Bạn hãy đăng nhập vào WordPress và cài đặt một Plugin có tên là Nginx Cache
Sau khi cài đặt Plugin xong, bạn truy cập Tools => Nginx Cache
- Cache zone Path: Nhập vào đường dẫn đã tạo ở bước đầu.
- Purge Cache (Nếu tick): Sẽ tự động xoá cache khi nội dung thay đổi.
Như vậy mình đã hoàn tất hướng dẫn Cài đặt Nginx FastCGI Cache để tối ưu hoá thời gian phản hồi máy chủ. Hy vọng bài viết này sẽ giúp bạn thiết lập tối ưu máy chủ, giúp máy chủ có hiệu xuất tốt.
Chúc bạn thực hiện thành công.