Nginx – kompresowanie plików dla gzip_static

Ruski serwer WWW ma przydatną funkcję serwowania wersji plików skompresowanych gzip’em – przez co możemy plik skompresować raz i będzie on serwowany klientom obsługującym kompresję HTTP ale już bez każdorazowego kompresowania go. Jest to bardzo przydatne na stronach z dużym ruchem gdzie można w ten sposób zaoszczędzić takty CPU na właściwą obsługę połączeń a nie kompresję. Drugie miejsce gdzie może to być przydatne to VPS’y i “cienkie” serwery, które na kompresji przy większym obciążeniu spędzają zbyt dużo czasu i daje się to odczuć w działaniu strony. A że obecnie standardem jest ładowanie przez stronki np. jQuery, paru pluginów do niego, jQueryUI, masy CSS’ów, itd – to na prawdę jest co kompresować 🙂

Dodatkowa zaleta tego rozwiązania jest taka, że o ile w przypadku kompresji online raczej kompresujemy na niskich poziomach by nieco zmniejszyć dane a równocześnie nie zabijać CPU – to w przypadku kompresji pod ten moduł możemy raz na jakiś czas “przejechać” pliki maksymalną kompresją by były jeszcze mniejsze (zaoszczędzi to nieco pasma i równocześnie przyspieszy ładowanie strony bo jest mniej do pobrania).

Prekompresję wybranych typów plików można przeprowadzić np. tak:

find /var/www -iname *.js -print0 |xargs -0 -I'{}' sh -c 'gzip -c9 "{}" > "{}.gz" && touch -r "{}" "{}.gz"'
find /var/www -iname *.css -print0 |xargs -0 -I'{}' sh -c 'gzip -c9 "{}" > "{}.gz" && touch -r "{}" "{}.gz"'

gzip skompresuje a touch zadba by timestampy obu plików były takie same (co jest zalecaną praktyką przy wykorzystaniu tego modułu). Dwa powyższe polecenia można odpalić praktycznie w ciemno na obecnie serwowanej stronie i nie powinny spowodować zbyt dużego chaosu… Trzeba pamiętać jedynie by zostały uruchomione z użytkownika, który ma dostęp do zapisu w danym vhoście i by serwer WWW miał dostęp do tak utworzonego pliku.

Z moich obserwacji wynika że gdy timestamp pliku bez gz jest nowszy niż wersji skompresowanej to serwowana jest ta świeższa wersja ale wtedy już z ewentualną kompresją online.

Mocniejsze kompresowanie plików PNG

Może nie do końca w temacie tego posta ale bardzo często gdy stosuję gzip_static_module to optymalizuję też PNG’i. Pliki PNG są kompresowane w sposób bezstratny ale przeważnie programy graficzne nie zapisują ich w najmniejszej możliwej postaci bo trwałoby to zbyt długo. Można użyć do tego celu narzędzi takich jak: optipng lub pngcrush. A poniżej odpowiedni one-liner by skompresować wszystkie PNG’i w serwisach WWW:

find /var/www -iname '*.png' -print0 |xargs -0 optipng -quiet -preserve -o7

Uwaga! Wywołanie tego skryptu może potrwać bardzo długo i z tego powodu raczej nie nadaje się do umieszczenia w cronie. Jednak ręczne puszczenie po dużych zmianach w serwisie lub z filtrem w find by kompresowane były tylko nowsze pliki będzie OK.

Optymalizowanie plików JPG/JPEG

Co prawda pliki JPG/JPEG kompresują się stratnie ale możne je nieco zoptymalizować np. usuwając niepotrzebne dane z nagłówków i zamieniając na progresywne. Możemy do tego wykorzystać takie polecenie:

find /var/www -iname '*.jpg' -print0 | xargs -0 -I'{}' sh -c 'jpegtran -optimize -progressive -copy none -outfile "{}" "{}"'

2 thoughts on “Nginx – kompresowanie plików dla gzip_static”

Leave a Reply

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