Aby umożliwić odwiedzającym nasze strony cachowanie obrazków (tak by nie musieli pobierać ich każdorazowo bo przecież nie zmieniają się aż tak często) konieczne jest ustawienie nagłówków: Cache-Control, Expires dla odpowiednich typów plików. W Apachem jest do tego dedykowany moduł - mod_expires. W Debianie dostarczany jest on bez domyślnej globalnej konfiguracji - a ja lubię gdy cacheuje mi się większość statyki. Zawsze można dostosować czas cachowania pod siebie względem określonego typu pliku, np. dla Java Scriptów ustawić na 1 dzień gdy często się zmieniają. Można też w samej aplikacji zmieniać ścieżkę do pliku by wymusić odświeżenie (lub podawać ścieżkę z jakimś losowym identyfikatorem wycinanym przez mod_rewrite).

Cache-Control, Expires

Najpierw tworzymy globalny config (oczywiście można sobie robić też taki per host - jak kto woli):

cat > /etc/apache2/mods-available/expires.conf < <CONF
<IfModule mod_expires.c>
# włączamy moduł
ExpiresActive on

# cacheowanie typowych obrazów przez 3 miesiące
ExpiresByType image/jpg "access plus 3 months"
ExpiresByType image/gif "access plus 3 months"
ExpiresByType image/jpeg "access plus 3 months"
ExpiresByType image/png "access plus 3 months"

# cacheowanie CSS i JavaScript przez 2-1 miesiąca
ExpiresByType text/css "access plus 2 month"
ExpiresByType text/javascript "access plus 1 day"
ExpiresByType application/javascript "access plus 1 day"

# domyślna wartość cachowania
ExpiresDefault "access plus 3 months"

CONF

Dokładniejsze wyjaśnienie składni można znaleźć tutaj. Teraz aktywujemy moduł i restartujemy Apache’go (nie jestem pewien czy sam reload by wystarczył):

a2enmod expires
service apache2 restart

I tyle - jeśli sprawdzimy nagłówki (Firebug w Firefoxie albo Narzędzia programistyczne w Chromie) dla odpowiednich typów plików to powinny one zawierać przykładowo takie wartości:


Cache-Control: max-age=7776000
Expires: Thu, 19 Apr 2012 15:48:13 GMT

FileETag

Ustawiając powyższą konfigurację warto wyłączyć generowanie nagłówka ETag. Co prawda w dawnym zamyśle miał to być mechanizm pozwalający zbliżony do cachowania a dający 100% pewności że nowy plik zostanie pobrany a aktualne w kopie w cache już nie. Polega na obliczeniu hasha na podstawie “pewnych” danych o pliku (np. INode, data modyfikacji, rozmiar) - jeżeli posiadasz aktualny hash to nie musisz pobierać danych.

Pomysł na początku nie był zły… ale obecne strony często udostępniają nawet kilkadziesiąt (i więcej) niedużych plików. By pobrać potrzebne do wygenerowania ETag’a dane trzeba wywołać operację stat na pliku co przy wielu równoczesnych odwołaniach potrafi mocno obciążyć dyski.

Na serwerach ze średnim i dużym obciążeniem warto wyłączyć generowanie nagłówka w ten sposób:

echo "FileETag None" >> /etc/apache2/httpd.conf
service apache2 reload