Kompresi Offline: Meningkatkan Performa Nginx

 

  • Published by hendra
  • 06/09/2020 07:01:47 WIB

Salah satu bagian yang dilakukan ketika melakukan setup webserver adalah kompresi, dengan mengaktifkan fitur gzip on (atau ekstensi brotli on) - mengurangi besarnya paket yang dikirim/transfer ke User atau Pengunjung.

Namun, fitur ini memiliki sedikit kelemahan. Ketika website menerima lonjakan trafik yang cukup tinggi, maka dampaknya adalah Nginx akan memproses setiap request dan melakukan kompresi (on-the-fly) sebelum mengirimkannya ke User/Pengunjung - processing overhead.

Meski ini bukan satu-satunya faktor penentu dalam performa, tapi hal ini layak untuk dipertimbangkan. Seperti dalam gambar dibawah ini - sebuah eksperimen kecil menggunakan VM/VPS kapasitas mini untuk menguji seberapa kuat (optimal) setup yang dilakukan ketika mendapat lonjakan trafik.

sadasdWEARsaddfasdAWErqwef.jpg


Oleh karena itu, untuk mengurangi sedikit "beban" pada Nginx dalam mengompress file-file yang akan dikirim ke User adalah dengan mengaktifkan module gzip_static atau brotli (bila ada, karena keduanya secara default tidak disertakan pada Nginx).

gunakan perintah ini pada terminal, untuk memeriksa apakah Nginx sudah mendukung modul ini:

nginx -V 2>&1 | grep gzip_static


Bila outputnya kosong, berarti Nginx yang terinstall belum mendukung modul ini. Anda harus meng-compile-ulang Nginx.

Selanjutnya, kita bisa mengaktifkan modul ini dengan cara:

1. Pada konteks `location`

 Bisa juga pada konteks global, seperti `server` atau `http`. Tergantung mana yang kira-kira diinginkan.

location /assets/ {
gzip_static on;
....
}


2. Mengompress file-file aset secara manual


Prosedur ini yang agak sedikit merepotkan bila file-file aset yang digunakan sangat banyak - a tedious task #LOL. Namun, kami membuat BASH script sederhana untuk membantu memudahkan melakukan pekerjaan ini:

Script ini akan:

  • Mencari dan mengompres¬† file-file aset stylesheet (CSS) dan javascript (JS) pada sebuah direktori dan sub-direktori (recursive) - atau menghapus file-file yang sudah terkompresi.
  • Memodifikasi timestamp pada file yang terkompres (menyesuaikan dengan file aslinya)
  • Mengeset ownership file-file terkompresi sesuai konfigurasi.


DISCLAIMER:
Kami tidak bertanggungjawab atas akibat apa pun yang ditimbulkan oleh script ini. Meski kami sudah menguji script ini pada OS debian, ubuntu tapi - sometimes BUG happens. you've been warned.

#!/usr/bin/env bash
#
#####################################################
# #
# BROTLI/GZIP: compress CSS and JS files #
# in directory (recursive) for use with Webserver #
# oleh Opisboy #
# #
# Usage: ./bro-compress.sh [ -c ] [ -d ] directory #
# c : to compress files #
# d : to remove compressed files #
# #
# eg.: bro-compress.sh -c /var/www/mywebsite #
# #
#####################################################


###################
# CONFIGURATION #
###################

# Compress using brotli? (boolean)
USE_BRO=0

# Compress using gzip? (boolean)
USE_GZP=1

# Brotli executable (path)
BRO=$(which bro)

# Nginx/Apache/Webserver user
WEBUSER=webuser
WEBGROUP=webgroup


#############
# ROUTINE #
#############

NAME="bro-compress.sh"
RED='\033[1;31m'
GRN='\033[1;32m'
NC='\033[0m'


bro_action() {
echo -e "Compressing ${GRN}$1${NC}"
if [ "$USE_BRO" -eq 1 ]; then
$BRO "$1" --force -o "$1.br" && touch -d "$(date -R -r ${1})" "${1}.br"
chown $WEBUSER:$WEBGROUP "$1.br"
chmod 0644 "$1.br"
fi
if [ "$USE_GZP" -eq 1 ]; then
gzip -5 "$1" -c > "$1.gz" && touch -d "$(date -R -r ${1})" "${1}.gz"
chown $WEBUSER:$WEBGROUP "$1.gz"
chmod 0644 "$1.gz"
fi
}

do_compress() {
echo -e "\nProcessing CSS : ${RED}$1${NC}"
find "$1" -type f -iname "*.css" | while read -r x; do bro_action "${x}" ; done
echo -e "Done.\n"

echo -e "Processing JS : ${RED}$1${NC}"
find "$1" -type f -iname "*.js" | while read -r x; do bro_action "${x}" ; done
echo -e "Done.\n"
}

remove_compress() {
echo -e "\nRemoving compressed files in ${RED}$1${NC}"
find "$1" -type f -iname "*.gz" -o -iname "*.br" | while read -r x; do
rm -f "${x}"
echo -e "File ${GRN}${x}${NC}... ${RED}Deleted${NC}"
done
}

bro_compress() {
do_compress "$1"
}

bro_remove() {
remove_compress "$1"
}

print_usage() {
echo -e "\n Usage: $NAME [ -c ] [ -d ] directory\n Options: \n c : to compress files\n d : to remove compressed files\n"
}

if [ $# -ne 2 ]; then
print_usage
exit 1
fi

if [ $(id $WEBUSER >/dev/null 2>&1) ]; then
echo "$WEBUSER doesn't exists!"
exit 1
fi

if [ ! $(getent group "${WEBGROUP}") ]; then
echo "$WEBGROUP not exists"
exit 1
fi

if [[ "$USE_BRO" -eq 0 ]] && [[ "$USE_GZP" -eq 0 ]]; then
echo "Edit configuration in $NAME"
exit 1
fi

case "$1" in
-c)
MYDIR="$2"
bro_compress "${MYDIR}"
;;
-d)
MYDIR="$2"
bro_remove "${MYDIR}"
;;
*)
print_usage
exit 1
;;
esac

exit


Selesai.

Semoga bermanfaat. Tetap semangat dan terus berkarya!

Salam, Opisboy.

- - -
* Sekadar tambahan, untuk mengecek apakah module gzip_static Nginx sudah aktif, bisa dilihat dengan menggunakan strace -p $PID 2>&1 | grep gz seperti tampak dalam gambar dibawah ini.

nginx-gzip_static-strace.png




Comments