Neu ban dang chay WordPress tren VPS bang Nginx va chua bat FastCGI Cache, ban dang bo lai mot trong nhung buoc toi uu hieuqua nhat. Minhc da test tren nhieu du an, va sau khi bat FastCGI Cache, TTFB giam tu 800ms xuong con duoi 50ms. Khong can plugin, khong can Varnish, chi can Nginx.
Trong bai nay, minh se huong dan ban cau hinh Nginx FastCGI Cache cho WordPress tu A den Z, bao gom: tao cache zone, viet bypass rules cho nguoi dung dang nhap, xu ly WooCommerce, va purge cache khi publish bai moi.
Nginx FastCGI Cache la gi va vi sao ban nen dung no?

Nginx FastCGI Cache la co che caching o muc server (server-level). Khi Nginx nhan duoc phan hoi HTML tu PHP-FPM, no luu ban sao do xuong dia. cac request tiep theo cung URL se duoc Nginx phuc vu truc tiep tu cache, khong can goi PHP hay MySQL mot lan nao het.
Dieu nay khac biet hoan toan voi caching plugin nhu WP Rocket hay W3 Total Cache. cac plugin do van chay qua PHP de quyet dinh co serve cache hay khong. voi FastCGI Cache, PHP khong bao gio duoc goi neu cache con hop le. Ket qua: CPU giam, RAM giam, TTFB that thap, va server chiu duoc traffic spike tot hon nhieu.
Dieu kien tien quyet de bat dau cau hinh FastCGI Cache
Truoc khi bat dau, ban can dam bao:
- VPS chay Nginx (khong phai Apache, khong phai OpenLiteSpeed)
- PHP-FPM da duoc cau hinh va hoat dong binh thuong
- Co quyen root hoac sudo de chinh sua file cau hinh Nginx
- Da backup toan bo cau hinh Nginx hien tai
Minh luon khuyen backup truoc khi sua bat cu gi. Mot loi cu phap trong file Nginx co the lam site ban sap hoan toan.
Buoc 1: Tao cache zone trong nginx.conf
Mo file /etc/nginx/nginx.conf, tim den khoi http { va them cac dong sau:
# FastCGI Cache Zone
fastcgi_cache_path /var/run/nginx-cache levels=1:2 \
keys_zone=WORDPRESS:100m \
inactive=60m \
max_size=1g;
fastcgi_cache_key "$scheme$request_method$host$request_uri";Minh giai thich tung tham so:
- /var/run/nginx-cache: Thu muc luu file cache. Nginx can quyen ghi vao day.
- levels=1:2: Tao cau truc thu muc 2 cap de file cache khong bi nam tat ca cung noi, giam tai I/O.
- keys_zone=WORDPRESS:100m: Cap 100MB RAM de luu cache keys (khong phai luu noi dung). 1MB chua duoc khoang 8.000 keys.
- inactive=60m: File cache khong duoc truy cap trong 60 phut se tu xoa.
- max_size=1g: Cache chiem nhieu nhat 1GB dia. Vuot qua, Nginx tu dong xoa file cu nhat.
Tao thu muc cache va phan quyen:
sudo mkdir -p /var/run/nginx-cache
sudo chown -R www-data:www-data /var/run/nginx-cacheBuoc 2: Cau hinh cache trong server block
Mo file cau hinh site cua ban, thuong nam o /etc/nginx/sites-available/thienlv.com (hoac domain cua ban). Them cac rule bypass cache vao khoi server {:
# Set skip cache variables
set $skip_cache 0;
set $skip_reason "";
# POST requests - khong cache
if ($request_method = POST) {
set $skip_cache 1;
set $skip_reason "POST";
}
# Query string - khong cache
if ($query_string != "") {
set $skip_cache 1;
set $skip_reason "QUERY";
}
# Logged-in users - khong cache
if ($http_cookie ~* "wordpress_logged_in|comment_author|wp-postpass") {
set $skip_cache 1;
set $skip_reason "AUTH";
}
# WooCommerce cart/checkout - khong cache
if ($http_cookie ~* "woocommerce_items_in_cart|woocommerce_cart_hash|wp_woocommerce_session") {
set $skip_cache 1;
set $skip_reason "WOO";
}Tai khoi location ~ \.php$ {, them cac chi thi cache:
location ~ \.php$ {
# ... cac cau hinh fastcgi_pass hien co ...
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 301 302 1h;
fastcgi_cache_valid 404 1m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# Serve stale while updating
fastcgi_cache_use_stale updating error timeout invalid_header http_500;
# Prevent thundering herd
fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 5s;
# Add debug header
add_header X-FastCGI-Cache $upstream_cache_status;
}Mot so tham so quan trong can chu y:
- fastcgi_cache_valid 200 1h: Cache trang 200 thanh cong trong 1 gio. ban co the giam xuong 5-15 phut neu site thay doi noi dung thuong xuyen.
- fastcgi_cache_use_stale updating: Khi cache het han, Nginx van serve ban cu trong khi fetch ban moi. nguoi dung khong bao gio thay trang cham.
- fastcgi_cache_lock on: Khi cache miss, chi 1 request duoc phep goi PHP. cac request khac cho, tranh thundering herd.
Buoc 3: Xu ly WooCommerce va trang khong nen cache
Neu ban chay WooCommerce, mot so trang bat buoc khong duoc cache vi chua du lieu theo tung user:
# WooCommerce no-cache pages
if ($request_uri ~* "/cart|/checkout|/my-account|/wp-login.php") {
set $skip_cache 1;
set $skip_reason "WOO_PAGE";
}
# REST API - khong cache
if ($request_uri ~* "^/wp-json/") {
set $skip_cache 1;
set $skip_reason "API";
}Nguyen tac cua minh la: bat cu trang nao chua noi dung thay doi theo user hay theo session, phai skip cache. Khong chi WooCommerce, ma ca cac trang thanh vien, forum, hay trang co form tim kiem.
Buoc 4: Purge cache khi publish hoac update bai viet
Day la phan quan trong nhat. Khi ban publish bai moi hoac sua bai cu, cache cu can duoc xoa. Co 2 cach de lam viec nay.
Cach 1: Xoa file cache truc tiep qua WordPress hook
Them doan code sau vao file functions.php cua theme hoac plugin cua ban:
add_action('transition_post_status', 'purge_fastcgi_cache_on_publish', 10, 3);
function purge_fastcgi_cache_on_publish($new_status, $old_status, $post) {
if ($new_status !== 'publish') return;
$cache_path = '/var/run/nginx-cache';
// Purge homepage
purge_fastcgi_cache_file(home_url('/'), $cache_path);
// Purge post URL
purge_fastcgi_cache_file(get_permalink($post), $cache_path);
// Purge category/archive pages
foreach (get_the_category($post->ID) as $cat) {
purge_fastcgi_cache_file(get_category_link($cat), $cache_path);
}
}
function purge_fastcgi_cache_file($url, $cache_path) {
$cache_key = md5('httpsGET' . $url);
$cache_file = $cache_path . '/' . substr($cache_key, -1) . '/' . substr($cache_key, -3, 2) . '/' . $cache_key;
if (file_exists($cache_file)) {
@unlink($cache_file);
}
}Cach 2: Dung plugin Nginx Helper
Neu ban khong muon code thu cong, cai plugin Nginx Helper tu WordPress.org. Plugin nay ho tro purge cache qua filesystem hoac qua HTTP request (neu server co module ngx_cache_purge). Cau hinh don gian: chi dinh duong dan cache path, bat toggle “Enable Purge”, xong.
Buoc 5: Test va verify cache bang curl
Sau khi cau hinh xong, reload Nginx va test:
sudo nginx -t && sudo systemctl reload nginxChay 2 lan curl cung mot URL de xem cache hoat dong:
# Request dau tien - MISS (cache chua co)
curl -I https://thienlv.com/
# Header: X-FastCGI-Cache: MISS
# Request thu hai - HIT (da lay tu cache)
curl -I https://thienlv.com/
# Header: X-FastCGI-Cache: HITNeu ban thay HIT o request thu hai, cache da hoat dong. Neu van MISS, kiem tra lai bypass rules co dong long khong, hoac kiem tra thu muc cache co quyen ghi khong.
Buoc 6: Monitor cache hit rate qua access log
De theo doi hieu suat cache, them bien $upstream_cache_status vao access log format:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'cache:$upstream_cache_status';
access_log /var/log/nginx/access.log main;Sau do, ban co the tinh hit rate bang lenh:
# Hit rate trong 1 gio gan nhat
awk '{print $NF}' /var/log/nginx/access.log | \
grep -c 'cache:HIT' && \
awk '{print $NF}' /var/log/nginx/access.log | \
grep -cE 'cache:(MISS|BYPASS|EXPIRED)'Mot FastCGI Cache khoe manh cho WordPress blog cong cong nen dat 80-95% HIT rate. Neu thap hon, bat debug header va kiem tra URL nao dang bi MISS lien tuc.
Microcaching: Ky thuat tang giam cho site traffic cao
Neu site ban co traffic cao, nhieu bai viet moi duoc publish lien tuc, hay xem xet microcaching. Day la ky thuat dat TTL rat ngan, chi 10-60 giay:
fastcgi_cache_valid 200 30s;Voici tai sao no hieu qua: mot bai viet moi publish nhan 1.000 visitor trong 30 giay dau, chi 1 request hit PHP (cache miss), 999 request con lai duoc serve tu cache. nguoi dung khong nhan ra noi dung delayed 30 giay, nhung server thi khong bao gio qua tai.
Minh da ap dung microcaching cho mot tin tuc site co 50.000 UV/ngay. Truoc do, CPU luon chay 80-90% trong gio cao diem. Sau khi bat microcaching 30s, CPU giam xuong 20-30%. ket qua bat ngo.
Mot so loi thuong gap khi cau hinh FastCGI Cache
Loi 1: nguoi dung dang nhap nhin thay trang cua nguoi khac. Nguyen nhan la cookie check khong day du. Dam bao rule wordpress_logged_in duoc dat dung trong $http_cookie match.
Loi 2: Cart WooCommerce khong cap nhat. Kiem tra cookie woocommerce_items_in_cart da duoc them vao bypass list chua. neu co, nguoi dung them vao gio hang phai luon nhan phan hoi PHP fresh.
Loi 3: Cache khong purge khi publish. Kiem tra path /var/run/nginx-cache trong code purge trung khop voi fastcgi_cache_path trong Nginx config. user chay PHP-FPM (thuong la www-data) can quyen xoa file trong thu muc nay.
Loi 4: X-FastCGI-Cache luon hien BYPASS. Dieu nay co nghia la bypass rules dang ban cho tat ca request. Kiem tra $query_string rule: mot so plugin WordPress them query args vao URL, gay trigger bypass lien tuc. ban co the loai bo mot so UTM parameters khoi query string match.
Ket luan: FastCGI Cache la buoc toi uu ban nen lam ngay
Neu ban dang chay WordPress tren VPS Nginx, FastCGI Cache la mot trong nhung buoc toi uu co ROI cao nhat. khong can plugin, khong can service bo sung, chi can them vai dong cau hinh. Server cua ban se cham dut khip hon, TTFB that thap, va Core Web Vitals se tot hon nhieu.
Sau khi doc xong bai nay, ban co the thuc hanh ngay tren VPS cua minh. Neu gap loi gi, de lai comment, minh se giup ban fix. Minhc cung khuyen ban doc them bai cau hinh Redis Object Cache cho WordPress ma minh da viet truoc do. FastCGI Cache va Redis Object Cache ho tro lan nhau: FastCGI cache giup full-page caching o muc server, con Redis object cache giup PHP-FPM chay nhanh hon khi cache miss.