Sebenarnya pas membahas Varnish untuk mengcache halaman website secara penuh tidaklah perlu dilakukan kalau menggunakan Nginx. Setidaknya bisa kita hindari lah menginstall paket aplikasi lainnya. Ini disebabkan dalam Nginx sendiri ada sistem cache serupa yakni FastCGI Cache atau kadang disebut juga microcache.

Tutorial kali ini memanfaatkan WordPress, jadi ada beberapa hal yang nanti lebih fokus kesana. Tidak banyak bedanya kalau saya perhatikan konfigurasi akhirnya misal dengan website berbasis PHP+MySQL biasa.

Pertama mari kita buat direktori untuk menyimpan cachenya:

mkdir /usr/share/nginx/cache

Ada yang bilang tahap ini tidak diperlukan karena nanti akan dibuat otomatis oleh Nginx asal lokasi direktorinya telah dimasukkan dalam konfigurasi. Tinggal restart katanya. Ini belum saya ujicoba benar tidaknya, sudah kebiasaan soalnya. 🙂 Ternyata tidak bisa, Nginx langsung error kalau direktorinya tidak ada. Yak, satu mitos sudah terpecahkan. Haha. 😀

Kemudian kita edit konfigurasi virtual host Nginx:

nano /etc/nginx/sites-available/servernesia.com

Dan tambahkan kode berikut diatas blok server {}:

fastcgi_cache_path /usr/share/nginx/cache/ levels=1:2 keys_zone=microcache:10m max_size=256m inactive=1h;
add_header X-Cache $upstream_cache_status;

Alternatifnya bisa anda masukkan kedalam konfigurasi Nginx (/etc/nginx/nginx.conf) tapi letakkan dibawah blok http {}. Ini terserah anda, tapi saya lebih suka diaktifkan per virtual host biar tidak bingung nantinya.

Lanjutkan scroll kebawah sampai anda menemukan setting untuk proses PHP-FPMnya (location ~ \.php$ {}), dan isikan dengan kode berikut:

fastcgi_cache  microcache;
fastcgi_cache_key $scheme$host$request_uri$request_method;
fastcgi_cache_valid 200 301 302 30s;
fastcgi_cache_use_stale updating error timeout invalid_header http_500;

fastcgi_pass_header Set-Cookie;
fastcgi_pass_header Cookie;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

fastcgi_cache_bypass $tanpa_cache;
fastcgi_no_cache $tanpa_cache;

Letakkan setelah kode yang sudah ada di dalam blok tersebut ya.

Akhirnya kita tambahkan sedikit peraturan soal pengunjung yang mana akan dilayankan cachenya dan tentu saja yang sudah login jangan diberi cache. Letakkan dalam blok location / {}:

set $tanpa_cache 0;

if ($request_method != GET){
    set $tanpa_cache 1;
}

if ($query_string != ""){
    set $tanpa_cache 1;
}

if ($request_uri ~* "/(wp-login.php|wp-admin|login.php|backend|admin)"){
    set $tanpa_cache 1;
}

if ($http_cookie ~* "PHPSESSID"){
    set $tanpa_cache 1;
}

if ($http_cookie ~* "wordpress_logged_in_"){
    set $tanpa_cache 1;
}

Bila sudah maka reload/restart Nginx:

service nginx reload

Tahu darimana kita kalau FastCGI cachenya sudah berhasil aktif? Tentu saja dengan mengecek headernya saat halaman situsnya diakses:

curl -X GET -I https://servernesia.com/

Balasannya akan seperti berikut:

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 08 Apr 2016 22:30:15 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Cache: HIT

Yeah… sukses sudah. Haha. 😀 Kalau tulisannya X-Cache adalah HIT berarti sudah ada cachenya dan kalau MISS berarti belum, tinggal anda reload halaman websitenya biasanya langsung ditambahkan ke cache.

Mau cara tes yang lebih brutal? Setelah anda mengakses beberapa halaman kemudian matikan PHP-FPMnya. 😛 Serius, kalau memang sudah aktif maka bisa dilayankan langsung dari Nginx tanpa perlu memanggil mesin PHP. Jelas lebih ringan lagi performa VPS anda kalau tidak perlu memproses PHP. 🙂

Sedikit catatan, kadang bermasalah pada permalink dan atau login pengguna. Ini karena yang dicache salah atau tidak dideteksi adanya cookie. Karena itulah sistem cache seperti ini paling cocok diterapkan pada jenis pengunjung yang hanya membaca tanpa komentar, dan ini rasionya cukup besar pastinya. Bandingkan saja angka analytics anda dengan berapa banyak komentar yang masuk. 🙂

*Inspirasi panduan kali ini dari mbak Shafira dan mas Aziz yang dengan setia menanyakan soal optimasi dan cache Nginx. 😀 Dan saya lupa kalau ada satu-dua blog WordPress yang sudah menggunakannya, baru ketemu notepadnya. 😛