Serwer www – cache – część pierwsza.

To, że trzeba keszować, i co trzeba keszować, a czego nie można to już wiemy. Wiemy też jak powinniśmy keszować. Mając tą wiedzę, przejdźmy do czynu!

Keszowanie to dość rozległy temat. Ten artykuł to pierwsza część, obejmująca konfigurację serwera http oraz PHP.

Keszować możemy na różne sposoby, bardziej lub mniej wydajnie.
Najpowszechniejsze metody keszowania to:
1. modyfikacja nagłówków http, kompresja po stronie httpd, kompresja php po stronie php
2. serwer keszujący, np. Varnish
3. keszowanie pehapa przez x-cache
4. keszowanie *sql wykorzystując np. memcache
5. keszowanie aplikacji webowych, np. WordPress


Z przyczyn całkowicie mi nie znanych, ostatnio na maszynach zacząłem stosować lighttpd zamiast nginx. Nie mam pojęcia czemu, lecz obydwa działają sprawnie, są przyjemne i bezbolesne
w konfiguracji, dla tego nie sugerujcie się moim wyborem 😉 (jedyne czego nie zamierzam w życiu tknąć z własnej woli to Apache..) Jednak z tego powodu opisywane prze zemnie konfiguracje będą
narazie dotyczyły właśnie lighttpd.
Tyle tytułem wstępu, przejdźmy do działań.

1.

1.1 Modyfikacja nagłówków http(modyfikacja konfiguracji serwera HTTP)

Pierwsze co musimy zrobić, to dopisanie odpowiedniego modułu do naszego lighhttpd.
Przyda nam się

mod_setenv mod_expire

UWAGA!! ważne, by mod_expire ładować PRZED mod_fastcgi. Można go załadować nawet na samym początku.

No i to tyle teraz sobie tylko keszujemy co chcemy, na przykład:

expire.url = ( "/fotki_kotow/" => "access plus 1 month" )

Taki fragment pliku konfiguracyjnego sprawi, że pliki znajdujące się w podanym folderze keszowane będą przez miesiąc od ostatniego dostępu do nich.
Oczywiście, możemy sobie dowolnie zmieniać tą właściwość zgodnie ze składnią, która prezentuje się następująco:

<access|modification> plus  <years|months|days|hours|minutes|seconds>
Możemy też zastosowac keszowanie dla całego hosta:
$HTTP["url"] =~ "^/" {
    expire.url = ( "" => "access 1000 days" )
}
 

Jeśli chcemy dodać publicznie widoczny nagłówek do żądania HTTP skorzystamy z mod_setenv:

setenv.add-response-header += (
    "Cache-Control" => "public"
)

Zagadka. Co robi ten fragment configu?

setenv.add-response-header += (
    "Cache-Control" => "public, must-revalidate"
)
 

Po wprowadzonych zmianach pozostaje nam jeszcze przeładować config:

service lighttpd reload

Zmienione nagłówki możemy łatwo sobie podejrzeć:

admin@smwh ~ $ curl -I smwh.caelian.net/index.html
HTTP/1.1 200 OK
Server: Yo mama is better hacker
Cache-Control: public, must-revalidate, max-age=432000000
Expires: Mon, 08 Nov 2027 17:04:23 GMT
Content-Type: text/html
Accept-Ranges: bytes
ETag: "3373405330"
Last-Modified: Mon, 24 Feb 2014 17:28:17 GMT
Content-Length: 19
Date: Sat, 01 Mar 2014 17:04:23 GMT

1.2 **Kompresja**

Razem z keszowaniem, jest to jedna z powszechnie stosowanych metod minimalizacji ruchu na serwerze i jego obciążenia, więc przy tej okazji również ją możemy sobie omówić.
Do tego celu wykorzystamy moduł lighttpd o nazwie ‚mod_compress’. Upewnijcie się więc, że jest on poprawnie dodany do modułów w pliku konfiguracyjnym.
Jego ustawienie to nie jest żadna wielka filozofia, całość zajmuje dwie linijki, które jednak można dostosować do swoich potrzeb, a są to:

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

Pierwsza z nich wskazuje folder, w której przechowywany będzie cache. Folder musi istnieć, a użytkownik uruchamiający serwer www musi mieć do niego prawa odczytu i zapisu. Nikt poza nim
oczywiście takich praw mieć nie powinien, a nawet można zabrać prawo odczytu dla postronnych(postronni, inni użytkownicy systemu moim zdaniem nie powinni mieć prawa odczytu zawartości kesza
serwera www).

Jeżeli serwer uruchomiony jest na nieco mocniejszym systemie niż [jakiś piździk][1] to można rozważyć przeniesienie tego folderu do pamięci RAM, przez co znaaacznie zwiększyłaby się prędkość
dostępu, odczytu i zapisu tego poniekąd kesza. Trzeba jednak wtedy pamiętać o ograniczeniu przestrzeni dostępnej dla tego folderu.

Druga linijka opisuje typ plików, które podlegać mają kompresji. Jako, że javascript występuje pod przeróżnymi postaciami, to aby jego kompresja sprawnie działała w każdym przypadku linię tą
należy zmodyfikować do postaci:

compress.filetype           = ("application/x-javascript", "application/javascript", "text/javascript", "text/x-js", "text/css", 
"text/html", "text/plain")

1.3 Kompresja PHP

Tu sprawa jest banalnie prosta, bo wystarczy w pliku konfiguracyjnym:

/etc/php5/cgi/php.ini

ustawić:

zlib.output_compression = on 

Oczywiście możemy się pobawić jeszcze stopniem kompresji i innymi dynksami, lecz dobranie optymalnych wartości może zająć trochę czasu 😉

Tak jak nachlani jegomoście usuwani są z pubów, tak samo stare, skrompresowane dane należy okresowo wywalać. Doskonale do tego nadaje się cron.
W pliku

/etc/cron.daily/lighttpd

zamieszczamy skrypt który się tym zajmie:

#!/bin/sh
# ŹRÓDŁO: howtoforge.com
# Cleanup lighttpd compress cache
cache=/var/cache/lighttpd #lokalizacja kesza z pliku konfiguracyjnego lighttpd
if test -d "$cache/compress"; then
    su -s /bin/sh -c "find $cache/compress -type f -atime +30 -print0 | xargs -0 -r rm" www-data
fi
if test -d "$cache/uploads"; then
    su -s /bin/sh -c "find $cache/uploads -type f -atime +1 -print0 | xargs -0 -r rm" www-data
fi

W ten sposób pozbywać się będziemy archiwów starszych niż 30 dni 😉

[1]: https://caelian.net/wordpress/?p=32

Leave a Reply

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