Przyspiesz swoją stronę z mod_expires
Jako drupalowa agencja, która zapewnia wsparcie Drupala, mocny nacisk kładziemy na wydajność. W niniejszym artykule omówię proste ustawienie odnośnie do czasu ładowania stron z obrazami.
Na Debianie, apache instalowany z repozytorium ma domyślnie wyłączony mod_expires, co poważnie i niepotrzebnie obciąża serwer.
Co robi ten moduł? Kontroluje ustawianie nagłówka EXPIRES i dyrektywy max-age dla headera Cache-Control....
Już wyjaśniam :)
Moduł ten pozwala na informowanie klienta (np. Twojej przeglądarki) jak długo dany zasób może być uznawany za ważny.
Popatrzmy na przykładzie.
Drupal 7 ma w .htaccess następujący wpis:
<IfModule mod_expires.c>
# Enable expirations.
ExpiresActive On
# Cache all files for 2 weeks after access (A).
ExpiresDefault A1209600
<FilesMatch \.php$>
ExpiresActive Off
</FilesMatch>
</IfModule>
Ten fragment kodu powoduje (pod warunkiem włączonego mod_expires), że wszystkie pliki nie będące plikami php serwowane przez apache są oznaczane jako mające ważność przez 2 tygodnie.
Jeśli więc Twoja przeglądarka pobierze zdjęcie raz, to potem przez 2 tygodnie serwuje je ze swojej pamięci zamiast za każdym razem pobierać je z serwera.
Największy zysk osiąga się tu na plikach graficznych. Wszystkie grafiki od templatki strony i wszystkie zdjęcia w treściach pobierane są raz na 2 tygodnie a nie za każdym razem. Na stronie z 10 plikami graficznymi, jeden użytkownik, który odwiedza ją co 3 dni, robi łącznie 10 zamiast 50 zapytań do apacha tygodniowo, czyli 5 razy mniej. Jeśli za każdym razem przegląda 3 podstwony, to możesz zaoszczędzić 140 zapytań. To 14 razy mniej zapytań po pliki!!
Bez mod_expires varnish działa bardzo słabo
Jeśli Twój serwer nie ma włączonego mod_expires, varnish na nie wiele się na serwerze zdaje.
W ustawieniach wydajności strony na Drupalu
(admin/config/development/performance)
możemy ustawić kiedy ma wygasać cache dla zcachowanych stron. Ustawienie to wpływa jednak tylko na żądanie dla strony (html i css jest zcachowany).
Żądania obrazków to odrępbne zapytania do serwera i jeżli nie włączymy mod_expires nie ustawia się na nich nagłówek EXPIRES ani dyrektywa max-age. Varnish traktuje je więc jak pliki które tracą ważność po każdym podaniu i nie zapamiętuje ich. Za każdym razem zapytanie o nie przechodzi aż do apache, zużywając zasoby serwera.
Wracając do naszego przykładu, jeśli na stronie masz 10 plików graficznych i stoi ona za varnishem, to jeśli nie włączysz mod_expires, użytkownik wykona:
- min 2 żądania do vrnish (strona i plik css) - nagłówki ustawione przez ustawienia wydajności drupala
- 10 żądań do apache w celu pobrania obrazków
Jesli włączymy mod_expires, wszystkie 12 zapytań może być zrealizowanych przez varnish, wogle nie dotykając dysków serwera.
Dzięki mod_expires, znacząco poprawia się varnish hit rate i twoje dyski żyją o wiele wiele dłużej.
A Ty masz włączony mod_expires?
Jeśli nie to
sudo a2enmod mod_expires sudo service apache2 reload