Przyspiesz swoją stronę i odciąż serwer z mod_expires

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

 

W ramach wsparcia dla Drupala utrzymujemy istniejące strony internetowe i rozbudowujemy je o nowe funkcjonalności