High Performance WordPress dengan Nginx Microcaching

WordPress secara default tidaklah scalable.

Ketika saya mencoba menginstal WordPress setelah sekian lama... (Terakhir menjadi pengguna WordPress untuk penggunaan pribadi di 2010), baru kali ini saya iseng melakukan benchmark bagaimana jika dihantam oleh ribuan request sekaligus. Alhasil didapati hanya mampu melayani 5 - 20 request/detik pada VPS single core. Harapan saya minimal mampu sekitar 300/detik.

Apa yang salah?

Sampai disini kemungkinan sebagian orang akan bongkar pasang web server, dari Apache ke Nginx, atau sebaliknya. Membandingkan keunggulan masing-masing, bla, bla..

Menurut saya sebaiknya perlu dicari dulu letak bottleneck-nya.

Ketika melihat di "top", process "mariadb" paling berat bekerja hingga 80% lebih dan seperti stuck agak lama meskipun benchmark telah selesai.

Bagaimana Solusinya?

Setelah jelas, permasalahan utama yaitu bottleneck di koneksi database. mariadb kewalahan menangani permintaan data secara berulang-ulang secara cepat.

Caching adalah solusinya.

Karena saya tidak punya waktu untuk riset mengenai database caching di WordPress, saya hanya menerapkan microcaching pada web server. Spoiler: Hasilnya tetap signifikan.

Microcaching di Nginx

Cara yang paling tepat untuk caching laman menurut saya adalah di bagian di mana request pertama kali masuk, dalam hal ini web server Nginx. Karena saya tidak menggunakan instrumen cache lainnya seperti Varnish. Faktanya saya menghindari pemasangan instrumen berantai agar tidak menambah latency. Nginx saja sudah cukup handal.

Microcaching adalah melakukan cache laman dalam waktu yang relatif singkat, misalnya 1 detik. Ini bisa meningkatkan performa tetapi tidak mengurangi user experience.

Tentu tidak semua laman boleh di-cache, seperti laman admin / dashboard. Nginx tidak akan mencache-nya. Tanya kenapa?

Nginx respect header seperti no-cache, no-store, dsb yang muncul dari laman admin / dashboard. Maka jika anda membuat aplikasi sendiri pastikan anda me-manage header cache dengan benar agar compatible dengan web server / reverse proxy, dan demi keamanan. Untuk WordPress, tentu mereka para pengembang sudah aware dengan hal ini.

Berikut contoh konfigurasi saya jika menggunakan Nginx dan php-fpm. Bisa taruh di block http, atau server.

  1. fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:100m inactive=10s; 
  2. fastcgi_cache_key "$request_method$scheme$host:9000$request_uri"; 

inactive bisa diatur sesuai kebutuhan, defaultnya adalah 10 menit. Saya biasa menggunakan maksimal hingga 120 detik atau 2 menit. Mungkin lebih ideal menggunakan tmpfs di /data/nginx/cache jika mengharuskan waktu cache yang sangat singkat.

fastcgi_cache_key adalah key unik untuk mengidentifikasi cache. Di situ key telah dinamai seunik mungkin.

Info: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html

PENTING:
* Anda juga perlu menaruh fastcgi_cache mycache untuk mengaktifkan cache. Biasanya di block location yang diinginkan.
* Untuk dapat men-cache halaman secara paksa (tanpa perlu adanya Cache-Control dari upstream), bisa tambahkan fastcgi_cache_valid 200 301 302 404 120s;. Direktif ini tidak akan memaksa jika ada Set-Cookie. Jadi aman.

Jika anda menggunakan Nginx sebagai reverse proxy. Microcaching juga dapat dilakukan dengan direktif sejenis dengan awalan proxy_.

Yaitu proxy_cache_path, proxy_cache_key, dsb.

Setelah menerapkan microcaching, didapati WordPress dapat melayani request setidaknya 200 - 300 request/detik dan cukup sesuai harapan.

#Linux #WordPress