WordPress-Nginx : Menjadikan Web Lebih Ngebut Dengan Cache

Posted by

Setelah artikel sebelumnya membahas cara install Nginx, PHP 7.x, MariaDB, dan WordPress di Ubuntu 18.04 Atau Debian 9, maka artikel kali ini saya akan membahas penggunaan cache untuk WordPress di Nginx agar website menjadi lebih ngebut.

Kita tau bersama kalau WordPress men-generate suatu halaman web secara dynamic yang memberikan fleksibilitas lebih bagi kita dalam men-develop web.

Namun sebagai konsekuensinya webpage loading menjadi lebih lambat karena diperlukan berbagai proses backend untuk men-generate suatu halaman web seperti php proses, koneksi database, dan lain sebagainya.

Oleh sebab itu, kita memerlukan sistem cache dimana hasil dari berbagai proses tersebut di simpan dalam bentuk static files, sehingga jika terjadi request selanjutnya Nginx akan langsung mengirim file tersebut sebagai respon.

Lingkup Pembahasan

Sebagai gambaran, saya akan membahas cara mengimplementasikan cache untuk WordPress di Nginx menggunakan FastCGI untuk menghandle Page Cache dan Redis untuk Object Cache dengan langkah – langkah berikut ini.

  1. Konfigurasi spesifik Fastcgi cache

    Lakukan konfigurasi FastCGI cache directives dan FastCGI restrictions.

  2. Konfigurasi Fastcgi cache di level virtual server

    Lakukan konfigurasi FastCGI di virtual server dengan melakukan konfigurasi cache zone, header, cache rules, skip cache, memory zone, dan cache time.

  3. Install Redis

    Install Redis server, kemudian install juga Redis client sebagai PHP extension agar PHP dapat berkomunikasi dengan Redis server.

  4. Konfigurasi Redis

    Lakukan konfigurasi Redis, terutama pada bagian maxmemory dan maxmemory policy.

  5. Koneksikan Redis dengan WordPress

    Selanjutnya koneksikan redis dengan wordpress menggunakan drop-in file atau menggunakan Plugin.

Pada artikel ini saya menyertakan konfigurasi Nginx untuk W3 Total Cache , WP Super Cache, dan Cache Enabler jika anda lebih memilih menggunakan Plugin tersebut.

Hal tersebut perlu dilakukan agar cache Plugin seperti W3 Total Cache, WP Super Cache, ataupun Cache Enabler bisa terintegrasi dengan baik di Nginx.

PAGE CACHE

Page cache berfungsi untuk men-cache file HTML yang dihasilkan oleh PHP, sehingga jika terjadi request page yang sama Nginx bisa langsung me respon dengan file cache HTML tersebut.

Untuk menggunakan page cache di Nginx kita bisa menggunakan module fasctCGI dengan konfigurasi berikut ini.

1.  Konfigurasi Spesifik FastCGI

Jika anda mengikuti rangkaian pembahasan sebelumnya, tentu anda sudah paham jika kita akan membuat file fcgi-cache.conf sebagai berikut.


sudo touch /etc/nginx/global/fcgi-cache.conf
 

Setelah itu buka file tersebut


sudo nano /etc/nginx/global/fcgi-cache.conf
 

Dengan dasar dokumentasi fastCGI dan konfigurasi fastCGI dari Nginx, berikut ini formula konfigurasi yang saya terapkan.

a.  Konfigurasi Cache Directives

Berikut ini konfigurasi fastCGI cache parameter yang saya terapkan.


fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_502 http_503 http_504;;
fastcgi_cache_revalidate on;
fastcgi_cache_background_update on;
fastcgi_cache_lock on;
 

Directive konfigurasi di atas bisa di pahami sebagai berikut.

  • fastcgi_cache_key menentukan cara penamaan file cache yang berbentuk hash, yang di enkripsi menggunakan md5
  • fastcgi_cache_use_stale menginstruksikan Nginx untuk menggunakan file cache yang lama (stale content) ketika terjadi kendala saat memproses konten baru dari fastCGI server yang mana biasanya di sebabkan karena timeout atau PHP down.
  • fastcgi_cache_revalidate on akan melakukan pengecekan terhadap item cache yang expired apakah ada perubahan atau tidak. Jika ada, maka fastCGI baru akan memproses fresh konten tersebut. Hal ini membuat penggunaan bandwidth lebih hemat.
  • fastcgi_cache_background_update jika dikombinasikan dengan parameter updating pada directive fastcgi_cache_use_stale, maka akan menginstruksikan nginx untuk mengirim stale content sebagai konten sementara untuk item yang sudah expired, lalu pada background process fresh item di generated untuk menggantikan expired content tersebut.
  • fastcgi_cache_lock jika dalam kondisi on, maka saat terjadi multiple request dan file cache belum ada, maka hanya satu request yang akan diteruskan untuk memproses file cache. Request lainnya akan menunggu hingga file cache siap untuk di gunakan.

b.  Cache Restrictions

Selanjutnya kita perlu untuk menerapkan cache restrictions supaya tidak semua konten di cache oleh fastCGI.

Lah, gimana sih? Bukannya bagus karena web jadi makin cepat?

Betul, tapi bayangkan jika anda login dan page tersebut di cache, maka visitor lain juga akan melihat page login kita tersebut yang beresiko membuat informasi login kita leaked.

Pertama saya akan menentukan contraint agar fastCGI tetap melakukan cache terhadap konten selain yang kita tentukan dalam cache restrictions.


set $skip_cache 0;
 

Cache restrictions pertama yang saya tentukan adalah restriction untuk POST request.


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

Selanjutnya adalah request yang menggunakan query string.


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

Berikutnya saya akan menerapkan restriction untuk URL yang mengandung komponen vital seperti wp-admin, index.php, dan lain sebagainya.


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

Lalu saya juga akan menerapkan restriction untuk user yang login serta user yang melakukan comment.


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

c.  Full Config

Secara keseluruhan anda bisa melihat file fcgi-cache.conf sebagai berikut.


# FastCGI Cache Config
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_502 http_503 http_504;;
fastcgi_cache_revalidate on;
fastcgi_cache_background_update on;
fastcgi_cache_lock on;

# Don't skip Cache by default
set $skip_cache 0;

# POST requests restriction
if ($request_method = POST) {
	set $skip_cache 1;
}

# Query requests restriction
if ($query_string != "") {
	set $skip_cache 1;
}

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

# logged in users or recent commenters restriction
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
	set $skip_cache 1;
}
 

2.  Konfigurasi Virtual Server

a.  FastCGI Cache Zone

Melirik dokumentasi Nginx tersebut maka kita akan menentukan FastCGI cache zone dengan menambahkan baris konfigurasi berikut ini sebelum server block.

fastcgi_cache_path /var/omgoblog.com/cache levels=1:2 keys_zone=omgoblog.com:100m inactive=60m;

Directive di atas secara garis besar sebagai berikut.

  • fastcgi_cache_path merupakan lokasi dari fastCGI cache.
  • levels merupakan level subdirektori, dimana 1: 2 akan membuat struktur subdirektori menjadi /var/omgoblog.com/cache/c/29/b7f54b2df7773722d382f4809d65029c.
  • keys_zone merupakan zona shared memory tempat untuk menyimpan key dan data informasi cache dimana keys_zone=omgoblog.com:100m menandakan kalau zona shared memory di identifikasi dengan nama omgoblog.com dengan ukuran maksimal 100 MB.
  • inactive merupakan waktu yang di perlukan untuk menyimpan data cache yang tidak di gunakan. Dengan nilai 60m, saya menerapkan fastCGI untuk tetap menyimpan data cache yang tidak di gunakan selama 60 menit.

b.  FastCGI Header Config

Untuk menampilkan status fastCGI cache, kita akan menggunakan header berikut ini.


add_header X-Fcgi-Cache $upstream_cache_status;
 

Dengan menerapkan header di atas, maka kita bisa melihat status dari halaman web, apakah berhasil ter-cache atau tidak.

Selanjutnya, saya akan menginstruksikan Nginx untuk tetap melakukan Caching terhadap item yang memiliki header Cache-Control yang di set Private, No-Cache, atau No-Store. Begitu juga item yang memiliki header Expires dan Set-Cookie selain dari cache restriction yang telah kita terapkan di atas sebagai berikut.


fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
 

c.  FastCGI Cache Rules

Untuk cache rules karena kita sudah define sebelumnya pada file terpisah, maka kita cukup menyertakan file tersebut saja.


include global/fcgi-cache.conf;
 

d.  PHP Skip Cache

Pada file fcgi-cache.conf saya sudah mengeset skip cache, maka saya akan menerapkan rules tersebut pada file PHP sebagai berikut.


fastcgi_cache_bypass $skip_cache;

fastcgi_no_cache $skip_cache;
 

e.  Menentukan Memory Zone PHP

Kita akan menerapkan cache pada file PHP, sehingga kita perlu menentukan memory zone yang akan di gunakan yang telah di define sebelumnya.


fastcgi_cache omgoblog.com;
 

f.  Menentukan Cache Time

Dan yang terakhir, saya akan menentukan waktu cache untuk respon dari file PHP sebagai berikut.


fastcgi_cache_valid any 60m;
 

Maksud saya menerapkan directives tersebut adalah agar beberapa respon di cache untuk sementara waktu, sehingga Nginx tidak perlu melakukan proses query request yang sama berkali – kali misalnya, padahal respon uang di hasilkan 404.

Selain itu, walaupun mungkin tidak terlalu signifikan, tetapi directive di atas lumayan sebagai usaha untuk menanggulangi user yang “iseng” mengakses hal yang sama berkali – kali.

Puluhan kali mungkin masih oke, tapi kalau ribuan atau bahkan jutaan kali maka server saya yang low resource ini bisa down!

g.  Full konfigurasi Virtual Server

Seluruh konfigurasi di atas secara full bisa anda lihat sebagai berikut.


fastcgi_cache_path /var/omgoblog.com/cache levels=1:2 keys_zone=omgoblog.com:100m inactive=60m;

server {
	# Ports and Server Name
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	server_name omgoblog.com;

	# Document root
	root /var/omgoblog.com/wordpress;
	
	# Certificate Files
	ssl_certificate		 /etc/letsencrypt/live/omgoblog.com/fullchain.pem;
	ssl_certificate_key	 /etc/letsencrypt/live/omgoblog.com/privkey.pem;

	# File to be used as index
	index index.php;

	# Security Header
	add_header X-Frame-Options "SAMEORIGIN" always;
	add_header X-Content-Type-Options "nosniff" always;
	add_header X-Xss-Protection "1; mode=block" always;
	
	# Header to force the used of HTTPS
	add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
	
	# FastCGI Header Conf
	add_header Fastcgi-Cache $upstream_cache_status;
	fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
	
	# Root Location
	location / {
		try_files $uri $uri/ /index.php?$args;
	}
	
	# Restriction
	include global/wp-restrictions.conf;
	
	# Static Files
	include global/static.conf;
	
	# SSL Config
	include global/ssl.conf;
	
	# Fastcgi cache rules
	include global/fcgi-cache.conf;

	# PHP Files
	location ~ \.php$ {
		try_files $uri =404;
		include global/fastcgi-params.conf;

		fastcgi_pass   php;
		
		# Applied skip cache define in fcgi-cache.conf.
		fastcgi_cache_bypass $skip_cache;
		fastcgi_no_cache $skip_cache;

		# Define memory zone for caching.
		fastcgi_cache omgoblog.com;

		# Define caching time.
		fastcgi_cache_valid any 60m;
	}
}

# Redirect http to https
server {
	listen 80;
	listen [::]:80;
	server_name omgoblog.com www.omgoblog.com;

	return 301 https://omgoblog.com$request_uri;
}

# Redirect www to non-www
server {
	listen 443;
	listen [::]:443;
	server_name www.omgoblog.com;

	return 301 https://omgoblog.com$request_uri;
}
 

3.  Restart Service

Saya membuat poin tersendiri untuk restart service karena hal ini merupakan area rawan lupa.

Setelah semua konfigurasi anda beres, pastikan dengan mengeksekusi command sudo nginx -t. Dan kalau konfigurasi anda tidak ada error, selanjutnya lakukan restart service.


sudo service nginx restart
 

4.  FastCGI Flush Cache

Untuk melakukan flush cache ada dua cara yang bisa anda lakukan, yaitu menggunakan plugin atau melalui shell.

Cara termudah adalah menggunakan plugin Nginx Cache dari Till Krüss.

Jika anda ingin melakukan flush cache dari shell, maka eksekusi command berikut.


rm -Rf /var/omgoblog.com/cache/*
 

OBJECT CACHE

Untuk mencapai performa WordPress yang optimal maka kita perlu untuk mengimplementasikan object cache, yaitu dengan menyimpan data yang dihasilkan dari proses komputasi dengan load yang tinggi seperti database query misalnya.

Jadi WordPress tidak perlu melakukan query database setiap kali terjadi page loading karena hasil query sudah tersedia di object cache.

untuk mengimplementasikan object cache ini anda bisa menggunakan redis atau memcached.

Mana yang sebaiknya di gunakan, redis atau memcached ?

Dalam hal Read/Write, Redis dan memcached berimbang dalam hal kecepatan. Namun dalam hal memory usage, Disk I/O Dumping, dan Scaling, Redis lebih unggul di bandingkan Memcached.

Jadi saya pribadi merekomendasikan untuk menggunakan Redis sebagai object cache.

1.  Install Redis

Untuk menginstall redis, maka eksekusi command berikut.


sudo apt-get install redis-server
 

Agar redis bisa berkomunikasi dengan wordpress, maka PHP harus memiliki ekstensi / module redis.

Jika anda mengikuti step pada artikel sebelumnya pada bagian install PHP, maka ekstensi redis sudah terinstall di server.

Jika belum, maka install module redis dengan mengeksekusi command berikut.


sudo apt-get install php-redis
 

2.  Konfigurasi Redis

Setelah redis terinstall, selanjutnya buka file konfigurasi redis.


sudo nano /etc/redis/redis.conf
 

Lalu tekan ctrl+w dan ketik # maxmemory <bytes> lalu tekan enter. Aktifkan konfigurasi tersebut dengan menghapus # di awal baris, dan ubah menjadi seperti berikut ini.


maxmemory 64mb
 

Selanjutnya tekan ctrl+w  lagi dan ketik # maxmemory-policy lalu tekan enterAktifkan konfigurasi tersebut dengan menghapus # di awal baris, dan ubah menjadi seperti berikut ini.


maxmemory-policy allkeys-lru
 

Selanjutnya tekan ctrl + x dan enter untuk melakukan save konfigurasi.

3.  WordPress Object Cache

Supaya Redis bisa berfungsi dalam menghandle object cache WordPress, anda bisa menggunakan drop-in file atau plugin.

a.  Drop-in File

Jika anda tidak ingin menggunakan plugin, maka anda bisa gunakan PHP Script yang di buat oleh Eric Mann dan Erick Hitter.

Pertama, kita download script object-cache.php tersebut ke dalam folder wp-content.

cd /var/omgoblog.com/wordpress/wp-content
wget https://github.com/ericmann/Redis-Object-Cache/raw/master/object-cache.php

b.  Plugin

Jika anda menggunakan Plugin W3 Total Cache, anda bisa langsung mengaktifkan object cache menggunakan redis dari panel setting W3TC.

 Jika tidak dan anda memilih untuk menggunakan plugin, maka saya menyarankan untuk menggunakan plugin Redis Object Cache dari Till Krüss yang ringan dan good coded.

Salah satu keuntungan menggunakan plugin yaitu anda tidak perlu repot melakukan flush cache dari shell linux.

4.  Restart Service

Setelah step di atas anda lakukan, jangan lupa untuk restart service.

sudo service redis-server restart
sudo service php7.3-fpm restart

5.  Flush Cache

Jika anda menggunakan plugin, maka flush cache bisa dengan mudah anda lakukan dari WordPress Admin Console.

Tapi jika tidak, atau anda ingin melakukan flush cache dari shell, maka eksekusi command berikut.


redis-cli flushall
 

KONFIGURASI NGINX UNTUK CACHE PLUGIN

1.  W3 Total Cache

a.  File w3tc.conf

Pertama buat file w3tc.conf.


sudo touch /etc/nginx/global/w3tc.conf
 

Lalu buka file tersebut dengan command berikut.


sudo nano /etc/nginx/global/w3tc.conf
 

Selanjutnya masukkan konfigurasi berikut ini.


# W3 TOTAL CACHE CHECK 
set $cache_uri $request_uri;

# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
        set $cache_uri 'null cache';
}   
if ($query_string != "") {
        set $cache_uri 'null cache';
}   

# Don't cache uris containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
        set $cache_uri 'null cache';
}   

# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
        set $cache_uri 'null cache';
}
 

Lalu simpan file tersebut dengan menekan ctrl+x → Y → enter.

b.  Konfigurasi Virtual Server

Supaya W3 Total Cache bisa berjalan lancar di Nginx maka kita perlu melakukan konfigurasi pada file virtual server.

Berdasarkan artikel sebelumnya, konfigurasi virtual server saya ada di folder conf.d/omgoblog.conf. Oleh sebab itu saya akan melakukan konfigurasi pada file tersebut.

Pertama, ubah directives location dari


location / {
	try_files $uri $uri/ /index.php?$args;
}
 

menjadi seperti ini.


location / {
	try_files /wp-content/w3tc/pgcache/$cache_uri/_index.html $uri $uri/ /index.php?$args ;
}
 

Selanjutnya, masukkan file konfigurasi w3tc.conf seperti berikut ini.


include global/w3tc.conf
 

Lalu simpan file tersebut dengan menekan ctrl+x → Y → enter.

Maka file omgoblog.conf  secara lengkap bisa anda lihat sebagai berikut.


server {
	# Ports and Server Name
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	server_name omgoblog.com;

	# Document root
	root /var/omgoblog.com/wordpress;
	
	# Certificate Files
	ssl_certificate		 /etc/letsencrypt/live/omgoblog.com/fullchain.pem;
	ssl_certificate_key	 /etc/letsencrypt/live/omgoblog.com/privkey.pem;

	# File to be used as index
	index index.php;

	# Security Header
	add_header X-Frame-Options "SAMEORIGIN" always;
	add_header X-Content-Type-Options "nosniff" always;
	add_header X-Xss-Protection "1; mode=block" always;
	
	# Header to force the used of HTTPS
	add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
	
	## Root Location
	location / {
		try_files /wp-content/w3tc/pgcache/$cache_uri/_index.html $uri $uri/ /index.php?$args ;
	}
	
	# W3 Total Cache
	include global/w3tc.conf;
	
	# Restriction
	include global/wp-restrictions.conf;
	
	# Static Files
	include global/static.conf;
	
	## SSL Config
	include global/ssl.conf;

	# PHP Files
	location ~ \.php$ {
		try_files $uri =404;
		include global/fastcgi-params.conf;

		fastcgi_pass   php;
	}
}

## Redirect http to https
server {
	listen 80;
	listen [::]:80;
	server_name omgoblog.com www.omgoblog.com;

	return 301 https://omgoblog.com$request_uri;
}

## Redirect www to non-www
server {
	listen 443;
	listen [::]:443;
	server_name www.omgoblog.com;

	return 301 https://omgoblog.com$request_uri;
}
 

2.  WP Super Cache

a.  File wp-super-cache.conf

Pertama buat file wp-super-cache.conf.


sudo touch /etc/nginx/global/wp-super-cache.conf
 

Lalu buka file tersebut dengan command berikut.


sudo nano /etc/nginx/global/wp-super-cache.conf
 </code

Selanjutnya masukkan konfigurasi berikut ini.


# WP Super Cache rules.
# Designed to be included from a 'wordpress-ms-...' configuration file.

set $cache_uri $request_uri;

# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
        set $cache_uri 'null cache';
}
   
if ($query_string != "") {
        set $cache_uri 'null cache';
}   

# Don't cache uris containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
        set $cache_uri 'null cache';
}   

# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
        set $cache_uri 'null cache';
}

 </code

Lalu simpan file tersebut dengan menekan ctrl+x → Y → enter.

b.  Konfigurasi Virtual Server

Berdasarkan artikel sebelumnya, konfigurasi virtual server saya ada di folder conf.d/omgoblog.conf. Oleh sebab itu saya akan melakukan konfigurasi pada file tersebut.

Pertama, ubah directives location dari


location / {
	try_files $uri $uri/ /index.php?$args;
}
 

menjadi seperti ini.


location / {
	try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php?$args ;
}
 

Selanjutnya, masukkan file konfigurasi wp-super-cache.conf seperti berikut ini.


include global/wp-super-cache.conf
 

Lalu simpan file tersebut dengan menekan ctrl+x → Y → enter.

Maka file omgoblog.conf  secara lengkap bisa anda lihat sebagai berikut.


server {
	# Ports and Server Name
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	server_name omgoblog.com;

	# Document root
	root /var/omgoblog.com/wordpress;
	
	# Certificate Files
	ssl_certificate		 /etc/letsencrypt/live/omgoblog.com/fullchain.pem;
	ssl_certificate_key	 /etc/letsencrypt/live/omgoblog.com/privkey.pem;

	# File to be used as index
	index index.php;

	# Security Header
	add_header X-Frame-Options "SAMEORIGIN" always;
	add_header X-Content-Type-Options "nosniff" always;
	add_header X-Xss-Protection "1; mode=block" always;
	
	# Header to force the used of HTTPS
	add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
	
	## Root Location
	location / {
		try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php?$args ;
	}
	
	# WP Super Cache Config
	include global/wp-super-cache.conf;
	
	# Restriction
	include global/wp-restrictions.conf;
	
	# Static Files
	include global/static.conf;
	
	## SSL Config
	include global/ssl.conf;

	# PHP Files
	location ~ \.php$ {
		try_files $uri =404;
		include global/fastcgi-params.conf;

		fastcgi_pass   php;
	}
}

## Redirect http to https
server {
	listen 80;
	listen [::]:80;
	server_name omgoblog.com www.omgoblog.com;

	return 301 https://omgoblog.com$request_uri;
}

## Redirect www to non-www
server {
	listen 443;
	listen [::]:443;
	server_name www.omgoblog.com;

	return 301 https://omgoblog.com$request_uri;
}
 

3.  Cache Enabler

a.  File cache-enabler.conf

Pertama buat file cache-enabler.conf.


sudo touch /etc/nginx/global/cache-enabler.conf
 

Lalu buka file tersebut dengan command berikut.


sudo nano /etc/nginx/global/cache-enabler.conf
 

Selanjutnya masukkan konfigurasi berikut ini.


set $cache_uri $request_uri;

    # bypass cache if POST requests or URLs with a query string
    if ($request_method = POST) {
        set $cache_uri 'nullcache';
    }
    if ($query_string != "") {
        set $cache_uri 'nullcache';
    }

    # bypass cache if URLs containing the following strings
    if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
        set $cache_uri 'nullcache';
    }

    # bypass cache if the cookies containing the following strings
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
        set $cache_uri 'nullcache';
    }

    # custom sub directory e.g. /blog
    set $custom_subdir '';

    # default html file
    set $cache_enabler_uri '${custom_subdir}/wp-content/cache/cache-enabler/${http_host}${cache_uri}index.html';

    # webp html file
    if ($http_accept ~* "image/webp") {
        set $cache_enabler_uri '${custom_subdir}/wp-content/cache/cache-enabler/${http_host}${cache_uri}index-webp.html';
    }

 

Lalu simpan file tersebut dengan menekan ctrl+x → Y → enter.

b.  Konfigurasi Virtual Server

Berdasarkan artikel sebelumnya, konfigurasi virtual server saya ada di folder conf.d/omgoblog.conf. Oleh sebab itu saya akan melakukan konfigurasi pada file tersebut.

Pertama, ubah directives location dari


location / {
	try_files $uri $uri/ /index.php?$args;
}
 

menjadi seperti ini.


location / {
	try_files $cache_enabler_uri $uri $uri/ $custom_subdir/index.php?$args;
}
 

Selanjutnya, masukkan file konfigurasi cache-enabler.conf seperti berikut ini.


include global/cache-enabler.conf
 

Lalu simpan file tersebut dengan menekan ctrl+x → Y → enter.

Maka file omgoblog.conf  secara lengkap bisa anda lihat sebagai berikut.


server {
	# Ports and Server Name
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	server_name omgoblog.com;

	# Document root
	root /var/omgoblog.com/wordpress;
	
	# Certificate Files
	ssl_certificate		 /etc/letsencrypt/live/omgoblog.com/fullchain.pem;
	ssl_certificate_key	 /etc/letsencrypt/live/omgoblog.com/privkey.pem;

	# File to be used as index
	index index.php;

	# Security Header
	add_header X-Frame-Options "SAMEORIGIN" always;
	add_header X-Content-Type-Options "nosniff" always;
	add_header X-Xss-Protection "1; mode=block" always;
	
	# Header to force the used of HTTPS
	add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
	
	## Root Location
	location / {
		try_files $cache_enabler_uri $uri $uri/ $custom_subdir/index.php?$args;
	}
	
	# Cache Enabler Config
	include global/cache-enabler.conf;
	
	# Restriction
	include global/wp-restrictions.conf;
	
	# Static Files
	include global/static.conf;
	
	## SSL Config
	include global/ssl.conf;

	# PHP Files
	location ~ \.php$ {
		try_files $uri =404;
		include global/fastcgi-params.conf;

		fastcgi_pass   php;
	}
}

## Redirect http to https
server {
	listen 80;
	listen [::]:80;
	server_name omgoblog.com www.omgoblog.com;

	return 301 https://omgoblog.com$request_uri;
}

## Redirect www to non-www
server {
	listen 443;
	listen [::]:443;
	server_name www.omgoblog.com;

	return 301 https://omgoblog.com$request_uri;
}
 </code

Conclusion

Cache memang lebih mudah di implementasikan menggunakan plugin seperti W3 Total Cache, WP Super Cache, Cache Enabler, dan lain sebagainya.

Namun sayang rasanya jika anda tidak memanfaatkan FastCGI sebagai Page Cache bawaan dari Nginx.

Untuk performa pun FastCGI lebih unggul, sehingga kombinasi antara FastCGI dan Redis merupakan duet maut yang bisa anda manfaatkan untuk mendongkrak performa web anda secara signifikan.

Namun ada satu kekurangan dari FastCGI dan Redis jika di bandingkan cache plugin di atas.

Berdasarkan pengalaman saya, anda tetap akan mengunjungi terminal linux untuk memanage FastCGI dan Redis, walaupun anda telah menggunakan Plugin bantuan ataupun drop-in file.

Terutama redis, karena ada saatnya anda perlu merestart service, melakukan upgrade, dan lain sebagainya.

Sedangkan Cache Plugin seperti W3 Total Cache, WP Super Cache, Cache Enabler, dan lain sebagainya di atur melalui WordPress Dashboard yang mana tentunya mungkin lebih nyaman untuk anda.

One comment

  1. Hi, very nice website, cheers!
    ——————————————————
    Need cheap and reliable hosting? Our shared plans start at $10 for an year and VPS plans for $6/Mo.
    ——————————————————
    Check here: [check name link – edited by admin]

Leave a Reply

Your email address will not be published. Required fields are marked *