0VPS Tweaks to improve web performance

Whilst I haven’t writ­ten many new art­icles recently I have spent con­sid­er­able time updat­ing and revis­ing the behind-the-scenes side of things, namely vari­ous secur­ity (TLS) set­tings on my VPS that hosts sev­er­al sites includ­ing this one.  Anoth­er thing I have also worked to enhance recently is to improve my use of gzip, and a new format called brotli

Briefly, gzip (and brotli) can be used to com­press resources before they are sent to the browser, which reduces the amount of data sent, and hence should mean a site loads faster.  The down­side is that com­press­ing resources takes time, which could out­weigh the gains from the smal­ler sizes.  The ideal solu­tion is to have resources com­pressed in advance, rather than com­pressed by the http serv­er in real­time.  Most of my web­sites use word­press which con­tains lots of files in plu­gins, themes etc, so going through all of these and manu­ally com­press­ing them everytime there is an update would be imprac­tic­al.  The answer is to use a script which mon­it­ors the sys­tem for file changes, and cre­ates com­pressed files as needed.  Below is the script I have recently writ­ten to do exactly this.

#!/bin/bash                               

inotifywait -m -q -e CREATE -e MODIFY -e MOVED_TO -r "/var/www/" --format "%w%f" --excludei '\.(jpg|png|gif|ico|log|sql|zip|gz|pdf|php|swf|ttf|eot|woff|cst|jst|br|cts)$' |
while read file
do
if [[ $file =~ \.(css)$ ]];
then
fname="${file%.*}"
if [ -f "$fname".min.css ]
then
rm -f $file.gz
rm -f $file.br
zopfli --gzip $file
bro --quality 11 --input $file --output $file.br
chmod 664 $file.br
chmod 664 $file.gz
chown wordpress:wordpress $file.br
chown wordpress:wordpress $file.gz
else
rm -f $file.gz
rm -f $file.br
cat $file | cleancss > $fname.cst
cat $file | cleancss | bro --quality 11 --output $file.br
zopfli --gzip $fname.cst -c > $fname.css.gz
chmod 664 $file.br
chmod 664 $file.gz
chown wordpress:wordpress $file.br
chown wordpress:wordpress $file.gz
rm -f $fname.cst
fi
fi

if [[ $file =~ \.(js)$ ]];
then
fname="${file%.*}"
if [ -f "$fname".min.css ]
then
rm -f $file.gz
rm -f $file.br
zopfli --gzip $file
bro --quality 11 --input $file --output $file.br
chmod 664 $file.br
chmod 664 $file.gz
chown wordpress:wordpress $file.br
chown wordpress:wordpress $file.gz
else
rm -f $file.gz
rm -f $file.br
uglifyjs $fname.js > $fname.jst
zopfli --gzip $fname.jst -c > $fname.js.gz
bro --quality 11 --input $fname.jst --output $file.br
chmod 664 $file.br
chmod 664 $file.gz
chown wordpress:wordpress $file.br
chown wordpress:wordpress $file.gz
rm -f $fname.jst
fi
fi

origfs=$(wc -c < "$file")
gzfs=$(wc -c <"$file.gz")
brfs=$(wc -c <"$file.br")

if [ "$origfs" -lt "$gzfs" ];
then
rm $file.gz -f
fi
if [ "$origfs" -lt "$brfs" ];
then
rm $file.br -f
fi

done

Leave a Reply