Poprawa wydajności witryny poprzez włączenie buforowania w Apache

Przegląd

Większość witryn internetowych zawiera duże ilości treści, która pozostaje niezmieniona lub jest rzadko modyfikowana po publikacji. I za każdym razem, gdy jest ona żądana od serwera WWW, zmodyfikowana lub nie, jest ona ponownie przetwarzana i przesyłana do klienta, niepotrzebnie zużywając cenne zasoby systemowe i przepustowość sieci. Jak twoja witryna lub aplikacja zyskuje na popularności, większe zapotrzebowanie zostanie umieszczone na serwerze do przetwarzania treści, które jest, choć dynamicznie generowane, statyczne.

To nie jest efektywne wykorzystanie zasobów i to w końcu skończy się kosztować dużo pieniędzy, jak zainstalować więcej sprzętu, aby utrzymać się z obciążeniem. W tym miejscu pojawia się buforowanie. Nie marnujmy cykli procesora lub pamięci RAM na przetwarzanie poprzednio dostępnych treści, które prawdopodobnie nie zmienią się w określonym czasie. Zamiast tego, będziemy serwować wstępnie przetworzoną treść, tymczasowo przechowywaną na serwerze lub w pamięci podręcznej przeglądarki internetowej. I tylko wtedy, gdy zawartość została zmodyfikowana lub upłynął określony czas, ponownie przetworzymy żądaną zawartość.

Konfiguracja buforowania w Apache

Apache posiada trzy moduły do buforowania zawartości, jeden umożliwia buforowanie, a pozostałe dwa określają, gdzie istnieje magazyn buforowania – na dysku lub w pamięci. Określenie, którego modułu użyć do buforowania zależy od dostępnych zasobów sprzętowych i wymagań wydajnościowych.

Serwowanie z dysku jest powolne, ale mniej kosztowne. Serwowanie z pamięci jest szybkie, ale drogie – zarówno w kosztach, jak i w zużyciu zasobów. Można jednak zwiększyć wydajność pamięci podręcznej dysku, umieszczając ją na pamięci SSDFLASH zamiast na konwencjonalnym dysku wirującym.

  1. Upewnij się, że moduł cache_module jest ładowany przez Apache, sprawdzając, czy poniższa linia istnieje w pliku konfiguracyjnym serwera Apache, bez komentarza.
    LoadModule cache_module modules/mod_cache.so
  2. W przypadku buforowania na dysku, upewnij się, że moduł disk_cache_module jest ładowany przez Apache. Poszukaj następującej linii, nieskomentowanej.
    LoadModule disk_cache_module modules/mod_disk_cache.so
  3. Dodaj następujące linie albo do pliku konfiguracyjnego serwera Apache (dla globalnych) albo wewnątrz dyrektywy VirtualHost (dla zlokalizowanych aplikacji).
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-admin

    CacheEnable disk /

    Unable caching to disk for relative directory „/”.

    Cacheroot

    Ustalenie katalogu przechowywania pamięci podręcznej, gdzie cała zbuforowana zawartość będzie zapisywana.

    CacheDefaultExpire

    Ustalenie domyślnej daty wygaśnięcia, względem daty oryginalnego żądania, w sekundach.

    CacheDisable

    Wyłącza buforowanie dla względnych ścieżek następujących po opcji. Obszary wrażliwe i te, które nie powinny być buforowane powinny być dodane tutaj.

Ustawianie wygaśnięcia zawartości

Buforowanie wymaga daty wygaśnięcia, aby działało. Bez daty wygaśnięcia zawartości, cache nie może określić czy jest ona nieświeża czy nie.

Użyj Apache’s Mod_Expires

Ten moduł pozwala ci zdefiniować daty wygaśnięcia dla twojej zawartości, jako całości lub indywidualnie na podstawie typu lub pasującego łańcucha.

  1. Upewnij się, że moduł jest ładowany do Apache. Otwórz plik konfiguracyjny serwera (httpd.conf w CentOS) i poszukaj tej linii. Odkomentuj ją, jeśli jest zakomentowana znakiem '#’.
    LoadModule expires_module modules/mod_expires.so
  2. Dodaj następujące linie do konfiguracji serwera Apache, konfiguracji wirtualnego hosta, dyrektywy katalogowej lub .htaccess, w zależności od tego, gdzie chcesz ustawić politykę buforowania.
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day"</IfModule></pre>

    ExpiresActive On

    Włącza mod expires.

    ExpiresDefault

    Ustawia domyślną datę wygaśnięcia dla całej zawartości. Dostęp plus 1 dzień ustawia czas wygaśnięcia na czas dostępu do zawartości + 1 dzień, co oznacza, że będzie ona buforowana przez 24 godziny.

  3. Jeśli chcesz przypisać różne wartości wygaśnięcia do określonych typów zawartości, możesz użyć opcji ExpiresByType, oprócz lub bez opcji ExpiresDefault. Oto kilka przykładów:
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day" ExpiresByType image/jpg "access plus 5 days" ExpiresByType image/jpeg "access plus 5 days" ExpiresByType image/gif "access plus 5 days" ExpiresByType image/png "access plus 5 days" ExpiresByType text/css "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresByType image/x-icon "access plus 1 year"</IfModule>

Użyj nagłówków HTTP w aplikacji internetowej

Daty wygaśnięcia i ostatniej modyfikacji mogą być zdefiniowane przez aplikację internetową za pomocą parametrów nagłówka HTTP. To daje kontrolę nad świeżością treści programistom lub aplikacji. Jak to zrobić, zależy od aplikacji.

  • HTML
    Użyj znacznika Meta i zdefiniuj wiek zawartości. W poniższym przykładzie, ustaw buforowanie na prywatne (tylko klient żądający) i maksymalny wiek na 1 godzinę (3600 sekund).
    <meta http-equiv="Cache-control" content="private,max-age:3600">
  • PHP
    Użyj funkcji Header() aby ustawić wiek zawartości w nagłówku dokumentów.
    header("Cache-Control: private, max-age=3600");

Buforowanie nie wygasającej zawartości

Czasami potrzebujesz buforować zawartość, która nie ma ustawionej daty wygaśnięcia. Jak wspomnieliśmy wcześniej, daty wygaśnięcia są domyślnie wymagane do działania mechanizmu cache’owania. Możemy jednak poinstruować Apache’a, aby dołączał domyślną datę wygaśnięcia do zawartości, która nie ma zdefiniowanej daty wygaśnięcia i buforował ją. Opcja CacheIgnoreNoLastMod pozwala nam to zrobić.

  1. Dodaj opcję CacheIgnoreNoLastMod z wartością On do miejsca, w którym włączyłeś buforowanie – pliku konfiguracyjnego serwera Apache lub pliku konfiguracyjnego Virtual Hosts.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod On

Uniemożliwienie przeglądarkom buforowania zawartości

Problem z powyższymi konfiguracjami buforowania polega na tym, że zawartość twojej aplikacji jest buforowana w dwóch miejscach: na kliencie i na serwerze. Jeśli zaktualizujesz swoją zawartość i chcesz, aby użytkownik zobaczył ją natychmiast, może nie być w stanie, jeśli jego lokalnie zbuforowana wersja nie wygasła. Możesz skrócić czas wygaśnięcia, ale wtedy możesz całkowicie pokonać cel buforowania.

Przejmij pełną kontrolę nad buforowaniem, zamiast tego włączając je tylko na serwerze. Zmuszaj przeglądarkę do pobierania zawartości z serwera dla każdego żądania, ale serwuj wstępnie przetworzoną zawartość Java lub PHP, na przykład, chyba że zawartość została zmodyfikowana. Dzięki temu użytkownik zawsze widzi najnowszą wersję, a jednocześnie nie marnuje niepotrzebnie cykli procesora ani pamięci RAM na ponowne przetwarzanie.

  1. Dodaj opcję CacheIgnoreCacheControl do lokalizacji, w której włączone jest buforowanie – pliku konfiguracyjnego serwera Apache lub konfiguracji hosta wirtualnego – z wartością On . Powoduje to, że Apache ignoruje żądania odświeżenia zawartości przeglądarki. Cała zawartość będzie serwowana z pamięci podręcznej serwera, gdzie to możliwe, dopóki nie wygaśnie.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod OnCacheIgnoreCacheControl On
  2. Zapisz zmiany.
  3. Restart Apache, aby zastosować zmiany.

WordPress i inne frameworki aplikacji

Frameworki, takie jak WordPress i podobne do CodeIgniter, kierują całą zawartość przez Index.php. W zależności od tego jak napisałeś swoje reguły mod_rewrite, twoja zbuforowana zawartość będzie wyświetlana niepoprawnie. Może się okazać, że zawartość jednej z żądanych stron, kategorii, itp. pojawi się zamiast tego, co faktycznie było żądane.

Aby temu zapobiec, musimy upewnić się, że cache Apache’a bierze pod uwagę parametry dołączone na końcu index.php, kiedy zawartość jest buforowana i pobierana. Zmodyfikuj regułę Rewrite dla index.php, jak widać na poniższym przykładzie.

# WordPress Permalink rewritesRewriteBase /RewriteRule ^index.php$ – RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php/ 

Dodaj komentarz