Cara Cache Konten di NGINX


NGINX menjadi server web sumber terbuka terkonsolidasi dan berkinerja tinggi yang mempercepat pengiriman konten dan aplikasi, meningkatkan keamanan, dan meningkatkan skalabilitas. Salah satu kasus penggunaan Nginx yang paling umum adalah Caching Konten, yang merupakan cara paling efektif untuk meningkatkan kinerja situs web.

Baca Juga: 10 Alat Caching Sumber Terbuka Teratas untuk Linux

Anda dapat menggunakan NGINX untuk mempercepat server asal lokal dengan mengonfigurasikannya ke cache respons dari server upstream dan juga untuk membuat server edge untuk jaringan pengiriman konten (CDN). NGINX mendukung beberapa CDN terbesar.

Saat dikonfigurasi sebagai cache, NGINX akan:

  • cache konten statis dan dinamis.
  • meningkatkan kinerja konten dinamis dengan micro-caching.
  • menyajikan konten basi sambil memvalidasi ulang di latar belakang untuk kinerja yang lebih baik.
  • menimpa atau mengatur header Kontrol-Cache, dan banyak lagi.

Dalam artikel ini, Anda akan mempelajari cara mengonfigurasi NGINX sebagai Caching Konten di Linux agar server web Anda berjalan seefisien mungkin.

Prasyarat:

Anda seharusnya sudah menginstal NGINX di server Linux Anda, jika belum ikuti panduan berikut untuk menginstal Nginx:

  • Cara Install Nginx di CentOS 8
  • Cara Install Nginx di CentOS 7

Cache Konten Statis di Nginx

Konten statis adalah konten website yang tetap sama (tidak berubah) di seluruh halaman. Contoh konten statis antara lain file seperti gambar, video, dokumen; File CSS, dan file JavaScript.

Jika situs web Anda menggunakan banyak konten statis, Anda dapat mengoptimalkan kinerjanya dengan mengaktifkan cache sisi klien tempat browser menyimpan salinan konten statis untuk akses lebih cepat.

Contoh konfigurasi berikut dapat dilakukan, cukup ganti www.example.com dengan URL nama situs web Anda dan buat modifikasi pada nama jalur lain jika diperlukan.

server {
    # substitute your web server's URL for www.example.com
    server_name www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

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

    location ~ .php$ {
        try_files $uri =404;
        include fastcgi_params;
        # substitute the socket, or address and port, of your WordPress server
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
 	}   

    location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg
                  |jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid
                  |midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

Cache Konten Dinamis di Nginx

NGINX menggunakan cache berbasis disk persisten yang terletak di suatu tempat di sistem file lokal. Jadi mulailah dengan membuat direktori disk lokal untuk menyimpan konten cache.
# mkdir -p /var/cache/nginx

Selanjutnya, atur kepemilikan yang sesuai pada direktori cache. Ini harus dimiliki oleh pengguna NGINX (nginx) dan grup (nginx) sebagai berikut.

chown nginx:nginx /var/cache/nginx

Sekarang lanjutkan lebih jauh untuk melihat cara mengaktifkan konten dinamis di Nginx di bagian bawah.

Mengaktifkan FastCGI Cache di NGINX

FastCGI (atau FCGI) adalah protokol yang banyak digunakan untuk menghubungkan aplikasi interaktif seperti PHP dengan server web seperti NGINX. Ini merupakan perpanjangan dari CGI (Common Gateway Interface).

Keuntungan utama FCGI adalah ia mengelola beberapa permintaan CGI dalam satu proses. Tanpanya, server web harus membuka proses baru (yang harus dikontrol, memproses permintaan, dan ditutup) untuk setiap permintaan klien atas suatu layanan.

Untuk memproses skrip PHP dalam penerapan tumpukan LEMP, NGINX menggunakan FPM (FastCGI Process Manager) atau PHP-FPM, implementasi PHP FastCGI alternatif yang populer. Setelah proses PHP-FPM berjalan, NGINX dikonfigurasikan untuk mem-proxy permintaan pemrosesan. Jadi NGINX juga dapat dikonfigurasi untuk menyimpan respons dari server aplikasi backend PHP-FPM.

Di bawah NGINX, cache konten FastCGI dideklarasikan menggunakan direktif yang disebut fastcgi_cache_path di http{} tingkat atas konteksnya, dalam struktur konfigurasi NGINX. Anda juga dapat menambahkan fastcgi_cache_key yang mendefinisikan kunci (pengidentifikasi permintaan) untuk cache.

Selain itu, untuk membaca status cache upstream, tambahkan direktif add_header X-Cache-Status dalam konteks http{} – ini berguna untuk tujuan debugging.

Dengan asumsi file konfigurasi blok server situs Anda terletak di /etc/nginx/conf.d/testapp.conf atau /etc/nginx/sites-available/testapp.conf ( di bawah Ubuntu dan turunannya), buka file pengeditan dan tambahkan baris berikut di bagian atas file.

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHEZONE:10m; inactive=60m max_size=40m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;

Direktif fastcgi_cache_path menentukan jumlah parameter yaitu:

  • /var/cache/nginx – jalur ke direktori disk lokal untuk cache.
  • levels – menentukan level hierarki cache, dan menyiapkan hierarki direktori dua tingkat di bawah /var/cache/nginx.
  • keys_zone (name:size) – memungkinkan pembuatan zona memori bersama tempat semua kunci aktif dan informasi tentang data (meta) disimpan. Perhatikan bahwa menyimpan kunci di memori mempercepat proses pemeriksaan, dengan memudahkan NGINX menentukan apakah kunci tersebut LEWATKAN atau HIT, tanpa memeriksa status pada disk.
  • tidak aktif – menentukan jangka waktu setelah data cache yang tidak diakses selama waktu yang ditentukan akan dihapus dari cache terlepas dari kesegarannya. Nilai 60m dalam contoh konfigurasi kita berarti file yang tidak diakses setelah 60 akan dihapus dari cache.
  • max_size – menentukan ukuran maksimum cache. Ada lebih banyak parameter yang dapat Anda gunakan di sini (baca dokumentasi NGINX untuk informasi lebih lanjut).

Variabel dalam direktif fastcgi_cache_key dijelaskan di bawah.

NGINX menggunakannya dalam menghitung kunci (pengidentifikasi) suatu permintaan. Yang penting, untuk mengirim respons yang di-cache ke klien, permintaan tersebut harus memiliki kunci yang sama dengan respons yang di-cache.

  • $scheme – skema permintaan, HTTP atau HTTPS.
  • $request_method – metode permintaan, biasanya “GET ” atau “POST ”.
  • $host – dapat berupa nama host dari baris permintaan, atau nama host dari kolom header permintaan “Host ”, atau nama server yang cocok dengan permintaan, sesuai urutan prioritas .
  • $request_uri – berarti URI permintaan asli yang lengkap (dengan argumen).

Selain itu, variabel $upstream_cache_status dalam direktif add_header X-Cache-Status dihitung untuk setiap permintaan yang ditanggapi NGINX, baik itu LEWATKAN (respons tidak ditemukan dalam cache, didapat dari server aplikasi) atau HIT (respons diberikan dari cache) atau nilai lain yang didukung.

Selanjutnya, dalam direktif location yang meneruskan permintaan PHP ke PHP-FPM, gunakan direktif fastcgi_cache untuk mengaktifkan cache yang baru saja Anda tentukan di atas.

Atur juga waktu cache untuk respons berbeda menggunakan direktif fastcgi_cache_valid seperti yang ditunjukkan.

fastcgi_cache CACHEZONE;
fastcgi_cache_valid  60m;

Jika hanya waktu cache yang ditentukan seperti dalam kasus kami, hanya respons 200, 301, dan 302 yang di-cache. Namun Anda juga dapat menentukan respons secara eksplisit atau menggunakan apa pun (untuk kode respons apa pun):

fastcgi_cache CACHEZONE;
fastcgi_cache_valid 200  301 203 60m;
fastcgi_cache_valid 404 10m;
OR
fastcgi_cache CACHEZONE;
fastcgi_cache_valid  any 10m;

Menyempurnakan Kinerja Caching FastCGI di Nginx

Untuk menyetel berapa kali permintaan dengan kunci yang sama harus dibuat sebelum respons di-cache, sertakan direktif fastcgi_cache_min_uses, baik di http{} atau konteks server{} atau lokasi{}.

fastcgi_cache_min_uses  3

Untuk mengaktifkan validasi ulang item cache yang kedaluwarsa menggunakan permintaan bersyarat dengan bidang header “Jika-Dimodifikasi-Sejak ” dan “Jika-Tidak Ada-Match ”, tambahkan fastcgi_cache_revalidate direktif, dalam konteks http{} atau server{} atau lokasi{}.

fastcgi_cache_revalidate on;

Anda juga dapat menginstruksikan NGINX untuk mengirimkan konten yang di-cache ketika server asal atau server FCGI tidak aktif, menggunakan direktif proxy_cache_use_stale, dalam direktif lokasi.

Contoh konfigurasi ini berarti bahwa ketika NGINX menerima kesalahan, batas waktu, dan kesalahan apa pun yang ditentukan dari server upstream dan memiliki versi lama dari file yang diminta dalam konten cache, maka file tersebut akan dikirimkan.

proxy_cache_use_stale error timeout http_500;

Perintah lain yang berguna untuk menyempurnakan kinerja caching FCGI adalah fastcgi_cache_background_update yang bekerja bersama dengan perintah proxy_cache_use_stale. Jika diaktifkan, NGINX akan memerintahkan NGINX untuk menyajikan konten basi ketika klien meminta file yang kedaluwarsa atau sedang dalam proses diperbarui dari server upstream.

fastcgi_cache_background_update on;

fastcgi_cache_lock juga berguna, untuk menyempurnakan kinerja cache karena jika beberapa klien meminta konten yang sama yang tidak ada dalam cache, NGINX hanya akan meneruskan permintaan pertama ke server upstream, menyimpan cache respons kemudian melayani permintaan klien lain dari cache.

fastcgi_cache_lock on;

Setelah melakukan semua perubahan di atas pada file konfigurasi NGINX, simpan dan tutup. Kemudian periksa struktur konfigurasi untuk mengetahui adanya kesalahan sintaksis sebelum memulai ulang layanan NGINX.

nginx -t
systemctl restart nginx

Selanjutnya, uji apakah cache berfungsi dengan baik, coba akses aplikasi web atau situs Anda menggunakan perintah curl berikut (pertama kali akan menunjukkan LEWATKAN, tetapi permintaan berikutnya harus menunjukkan HIT seperti yang ditunjukkan pada tangkapan layar).

curl -I http://testapp.linux-console.net

Berikut tangkapan layar lain yang menunjukkan NGINX menyajikan data basi.

Menambahkan Pengecualian untuk Melewati Cache

Dimungkinkan untuk menetapkan kondisi di mana NGINX tidak boleh mengirimkan tanggapan yang di-cache ke klien, menggunakan direktif fastcgi_cache_bypass. Dan untuk memerintahkan NGINX agar tidak menyimpan respons dari server upstream sama sekali, gunakan fastcgi_no_cache.

Misalnya, jika Anda ingin permintaan POST dan URL dengan string kueri selalu masuk ke PHP. Pertama, deklarasikan pernyataan if untuk mengatur kondisi sebagai berikut.

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

Kemudian aktifkan pengecualian di atas dalam direktif location yang meneruskan permintaan PHP ke PHP-FPM, menggunakan fastcgi_cache_bypass dan fastcgi_no_cache arahan.

 
fastcgi_cache_bypass $skip_cache; 
fastcgi_no_cache $skip_cache;

Ada banyak bagian lain dari situs Anda yang mungkin tidak ingin Anda aktifkan cache kontennya. Berikut ini contoh konfigurasi NGINX untuk meningkatkan kinerja situs WordPress, yang disediakan di blog nginx.com.

Untuk menggunakannya, buat perubahan (seperti domain, jalur, nama file, dll.) untuk mencerminkan apa yang ada di lingkungan Anda.

fastcgi_cache_path /var/run/NGINX-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m; 
fastcgi_cache_key "$scheme$request_method$host$request_uri"; 
server { 
	server_name example.com www.example.com; 
	root /var/www/example.com; 
	index index.php; 
	access_log /var/log/NGINX/example.com.access.log; 
	error_log /var/log/NGINX/example.com.error.log; 
	set $skip_cache 0; 
	# POST requests and URLs with a query string should always go to PHP 	
	if ($request_method = POST) { 
		set $skip_cache 1; 
	} 
	if ($query_string != "") {
		set $skip_cache 1; 
	} 
	# Don't cache URIs containing the following segments 
	if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php |sitemap(_index)?.xml") { 
		set $skip_cache 1; 
	} 
	# Don't use the cache for logged-in users or recent commenters 
	if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass |wordpress_no_cache|wordpress_logged_in") {
		set $skip_cache 1; 
	} 
	location / { 
		try_files $uri $uri/ /index.php?$args; 
	} 
	location ~ .php$ { 
		try_files $uri /index.php; 
		include fastcgi_params; 
		fastcgi_pass unix:/var/run/php5-fpm.sock; 
		fastcgi_cache_bypass $skip_cache; 
		fastcgi_no_cache $skip_cache; 
		fastcgi_cache WORDPRESS; 
		fastcgi_cache_valid 60m; 
	} 
	location ~ /purge(/.*) {
		fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1"; 
	} 
	location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg |gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi |wav|bmp|rtf)$ { 
		access_log off; 
		log_not_found off; 
		expires max; 
	} 
	location = /robots.txt { 
		access_log off; 
		log_not_found off; 
	}
	location ~ /. { 
		deny all; 
		access_log off; 
		log_not_found off; 
	} 
}

Mengaktifkan Proxy Cache di NGINX

NGINX juga mendukung cache respons dari server proxy lainnya (ditentukan oleh arahan proxy_pass). Untuk kasus pengujian ini, kami menggunakan NGINX sebagai reverse proxy untuk aplikasi web Node.js, jadi kami akan mengaktifkan NGINX sebagai cache untuk aplikasi Node.js. Semua arahan konfigurasi yang digunakan di sini memiliki arti yang sama dengan arahan FastCGI di bagian sebelumnya, jadi kami tidak akan menjelaskannya lagi.

Untuk mengaktifkan cache respons dari server proksi, sertakan direktif proxy_cache_path dalam konteks http{} tingkat atas. Untuk menentukan bagaimana permintaan di-cache, Anda juga dapat menambahkan direktif proxy_cache_key sebagai berikut.

proxy_cache_path /var/cache/nginx app1 keys_zone=PROXYCACHE:100m inactive=60m max_size=500m;
proxy_cache_key  "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_min_uses 3;

Selanjutnya, aktifkan cache di arahan lokasi.

location / {
	proxy_pass http://127.0.0.1:3000;
	proxy_cache        PROXYCACHE;
	proxy_cache_valid 200 302 10m;
	proxy_cache_valid 404      1m;
}

Untuk menentukan kondisi di mana NGINX tidak mengirimkan konten cache dan tidak menyimpan respons sama sekali dari server upstream, sertakan proxy_cache_bypass dan proxy_no_cache.

 
proxy_cache_bypass  $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache        $http_pragma $http_authorization;

Menyempurnakan Kinerja Cache Proksi

Arahan berikut berguna untuk menyempurnakan kinerja cache proxy. Arahan tersebut juga memiliki arti yang sama dengan arahan FastCGI.

proxy_cache_min_uses 3;
proxy_cache_revalidate on;
proxy_cache_use_stale error timeout updating http_500;
proxy_cache_background_update on;
proxy_cache_lock on;

Untuk informasi lebih lanjut dan arahan konfigurasi cache, lihat dokumentasi untuk dua modul utama ngx_http_fastcgi_module dan ngx_http_proxy_module.

Sumber Daya Tambahan: Caching Konten NGINX dan Tip untuk Meningkatkan Kinerja WordPress.