Lewati ke isi

Server & Infrastruktur

Cara Mengaktifkan Nginx FastCGI Cache untuk WordPress

Panduan menyalakan FastCGI cache Nginx untuk WordPress: zona cache, aturan lewati untuk admin dan keranjang, header cek HIT, dan cara membersihkan cache.

Terbit 5 menit baca

Jawaban singkat

FastCGI cache membuat Nginx menyimpan halaman HTML hasil PHP dan menyajikannya langsung tanpa memanggil PHP-FPM dan database. Aktifkan dengan fastcgi_cache_path, kunci cache, dan aturan lewati untuk pengguna login, admin, serta halaman keranjang.

Daftar isi
  1. Sebelum mulai, pahami apa yang di-cache
  2. Langkah mengaktifkan FastCGI cache
  3. 1. Siapkan zona cache di blok http
  4. 2. Tulis aturan kapan cache dilewati
  5. 3. Pasang cache di blok location PHP
  6. 4. Uji konfigurasi dan muat ulang
  7. 5. Cek apakah cache bekerja
  8. Bagaimana membersihkan cache saat artikel diubah?
  9. Pertanyaan yang sering diajukan

WordPress di VPS terasa lambat begitu pengunjung ramai, padahal kebanyakan yang dibuka adalah artikel yang sama? Itu karena setiap kunjungan memaksa PHP menyusun halaman dari awal dan bertanya ke database. FastCGI cache di Nginx memotong jalur itu: halaman yang sudah jadi disimpan di disk, lalu pengunjung berikutnya langsung menerima salinannya tanpa menyentuh PHP sama sekali.

Panduan ini untuk WordPress yang berjalan di Nginx dan PHP-FPM, misalnya hasil pemasangan Nginx, MariaDB, dan PHP di Ubuntu 24.04. Kalau kamu memakai hosting cPanel atau LiteSpeed, cara ini tidak berlaku karena web server-nya berbeda.

Sebelum mulai, pahami apa yang di-cache

FastCGI cache adalah page cache di tingkat server. Yang disimpan adalah HTML utuh untuk satu alamat. Ini berbeda dengan object cache seperti Redis yang menyimpan hasil query database. Perbedaan keduanya dibahas di page cache, object cache, dan Redis di WordPress.

Konsekuensinya, halaman yang isinya berbeda per orang tidak boleh di-cache. Admin yang sedang login, keranjang belanja, checkout, dan halaman akun harus selalu dilewatkan ke PHP. Bagian terpenting dari panduan ini justru aturan pengecualian tersebut.

Langkah mengaktifkan FastCGI cache

1. Siapkan zona cache di blok http

Buka /etc/nginx/nginx.conf atau buat file baru /etc/nginx/conf.d/fastcgi-cache.conf (file di conf.d sudah dimuat di dalam blok http pada paket Nginx Ubuntu):

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

Artinya:

  • keys_zone=WPCACHE:10m membuat zona memori bernama WPCACHE untuk menyimpan kunci. Dokumentasi Nginx menyebut zona 1 MB bisa menampung sekitar 8 ribu kunci, jadi 10 MB sudah lega untuk situs biasa.
  • max_size=1g membatasi ukuran file cache di disk.
  • inactive=60m menghapus halaman yang tidak diakses selama 60 menit, terlepas dari masa berlakunya.
  • fastcgi_cache_key menentukan apa yang membedakan satu halaman dengan halaman lain.

Buat foldernya: sudo mkdir -p /var/cache/nginx/wordpress.

2. Tulis aturan kapan cache dilewati

Di dalam blok server situs WordPress, sebelum blok location, tambahkan:

set $skip_cache 0;

if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }

if ($request_uri ~* "/wp-admin/|/wp-json/|/xmlrpc.php|wp-.*\.php|/feed/|sitemap(_index)?\.xml") {
    set $skip_cache 1;
}

if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
    set $skip_cache 1;
}

Untuk toko WooCommerce, tambahkan pengecualian halaman keranjang dan cookie keranjang:

if ($request_uri ~* "/cart/|/checkout/|/my-account/") { set $skip_cache 1; }
if ($http_cookie ~* "woocommerce_items_in_cart|woocommerce_cart_hash") { set $skip_cache 1; }

Sesuaikan alamat /cart/ dan lainnya bila toko kamu memakai slug berbahasa Indonesia, misalnya /keranjang/.

3. Pasang cache di blok location PHP

Di blok location ~ \.php$ yang sudah ada, tambahkan di bawah fastcgi_pass:

fastcgi_cache WPCACHE;
fastcgi_cache_valid 200 301 302 60m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache_use_stale error timeout updating http_500 http_503;
fastcgi_cache_lock on;
add_header X-Cache-Status $upstream_cache_status;

fastcgi_cache_bypass membuat permintaan tidak membaca dari cache, sedangkan fastcgi_no_cache membuat jawabannya tidak disimpan. Keduanya perlu dipasang bersama.

fastcgi_cache_use_stale membuat Nginx tetap menyajikan salinan lama bila PHP sedang error atau timeout, dan fastcgi_cache_lock mencegah banyak permintaan bersamaan memanggil PHP untuk halaman yang sama ketika cache-nya baru kedaluwarsa.

Satu jebakan kecil: di Nginx, kalau sebuah location punya add_header sendiri, header yang ditulis di tingkat server tidak diwariskan ke location itu. Jika kamu memasang header keamanan di blok server, salin juga ke blok PHP ini.

4. Uji konfigurasi dan muat ulang

sudo nginx -t
sudo systemctl reload nginx

5. Cek apakah cache bekerja

Dari laptop atau server lain, jalankan dua kali:

curl -sI https://domainkamu.com/ | grep -i x-cache-status

Permintaan pertama biasanya MISS, permintaan kedua HIT. Buka juga halaman admin atau tambahkan ?test=1 di alamat, statusnya harus BYPASS. Kalau kamu melihat HIT di halaman checkout, aturan pengecualian belum benar dan harus diperbaiki sebelum dipakai di produksi.

Bagaimana membersihkan cache saat artikel diubah?

Ini titik lemah FastCGI cache. Nginx versi open source tidak punya perintah bawaan untuk menghapus satu halaman dari cache. Pilihannya:

CaraKelebihanKekurangan
Masa berlaku pendek (misalnya 10 sampai 60 menit)Paling sederhanaPerubahan baru terlihat setelah masa berlaku habis
Hapus seluruh folder cachePasti bersihSemua halaman harus dibangun ulang
Plugin seperti Nginx HelperMembersihkan otomatis saat posting diubahButuh izin tulis ke folder cache, atau modul purge tambahan

Menghapus seluruh cache cukup dengan:

sudo find /var/cache/nginx/wordpress -type f -delete

Pertanyaan yang sering diajukan

Apakah FastCGI cache masih perlu kalau sudah pakai plugin cache WordPress?

Tidak wajib keduanya. FastCGI cache bekerja sebelum PHP dipanggil, jadi biasanya lebih ringan dari plugin page cache yang berjalan di PHP. Pakai salah satu saja untuk page cache agar tidak membingungkan saat membersihkan.

Berapa lama masa berlaku cache yang ideal?

Tergantung seberapa sering isi situs berubah. Blog yang jarang update bisa memakai beberapa jam. Situs berita atau toko dengan stok yang sering berubah lebih aman dengan masa berlaku pendek ditambah pembersih otomatis.

Apakah cache ini memengaruhi pengunjung yang login?

Tidak, selama aturan cookie wordpress_logged_in terpasang. Pengunjung yang login selalu dilewatkan ke PHP.

Kenapa statusnya selalu MISS?

Penyebab umum adalah WordPress atau plugin mengirim cookie di setiap halaman, header Cache-Control no-cache dari plugin, atau ada query string. Periksa header respons lengkap dengan curl -I.

Checklist singkat:

  • Zona cache dan kunci cache dibuat di blok http
  • Pengecualian POST, query string, admin, cookie login, dan halaman toko terpasang
  • Header X-Cache-Status menunjukkan HIT di halaman publik dan BYPASS di admin
  • Cara membersihkan cache sudah ditentukan

Sumber & referensi

Baca juga