Ten sam plik kompresowany za każdym razem
Apache kompresuje odpowiedzi w locie. Dla strony, która za każdym razem wygląda inaczej, to jedyna droga. Dla arkusza stylów, który zmienia się raz w miesiącu, znaczy to, że serwer wykonuje tę samą pracę na nowo dla każdego odwiedzającego, tygodniami, i za każdym razem wyrzuca wynik. Pamięci podręcznej na to nie ma.
Zmierzone 19 sierpnia 2026 po istniejącym połączeniu, na własnym style.css (124 kB) i world.js (102 kB) tej witryny:
| czas | bajty | |
| bez kompresji | 2,9 ms | 124 755 |
| gzip, w locie | 18,1 ms | 34 995 |
| brotli, w locie | 14,5 ms | 32 685 |
| world.js, gzip | 47,9 ms | 38 283 |
| world.js, brotli | 15,9 ms | 38 086 |
Czterdzieści osiem milisekund procesora, na żądanie, dla wyniku identycznego co do bajta. Na Raspberry Pi to nie jest błąd zaokrąglenia.
Skompresować raz, na dysk
Krok budowania kładzie skompresowany plik obok oryginału, a reguła przepisania podaje go, gdy przeglądarka mówi, że przyjmuje gzip. Podanie gotowego pliku kosztuje tyle, ile kosztuje podanie każdego pliku.
gzip, a nie brotli, z nudnego powodu: na tej maszynie nie ma zainstalowanego polecenia brotli. Pliki wychodzą przez to o jakieś 7 % większe niż przy brotli, a czas serwera to jedna piąta tego, co kosztuje brotli w locie. Tę zamianę warto było zrobić teraz, zamiast czekać na ładniejszą odpowiedź.
Wersja stoi w nazwie pliku
Krok budowania zapisuje style.css.<mtime>.gz, a ?v= w kodzie strony to ten sam czas modyfikacji. Reguła przepisania zadziała tylko wtedy, gdy plik z pasującą liczbą istnieje.
Ten układ ma cechę, dla której warto projektować celowo: kto zmieni arkusz stylów i zapomni przebudować, ma w kodzie strony liczbę, do której nie ma pliku, reguła nie zadziała, a Apache poda zwyczajnie oryginał. Najgorszy przypadek to brak przyspieszenia. Przestarzały arkusz nie może wyjść. Każdy mechanizm pamięci podręcznej należy sprawdzić tym pytaniem — kiedy pójdzie źle, robi się wolno czy robi się źle?
Usterka pośrodku tego wszystkiego
Podawany plik jest już gzipem, nie wolno go więc kompresować po raz drugi w drodze na zewnątrz. W konfiguracji stało najpierw no-gzip, a to zatrzymuje jeden z dwóch kompresorów Apache. Drugi, mod_brotli, wesoło pakował gotowy plik gzip jeszcze raz w brotli, podczas gdy nagłówek odpowiedzi dalej twierdził gzip.
Przeglądarki dostawały treść nie do odczytania. Wyszło to na jaw nie przy oglądaniu strony — wyszło przy zliczaniu bajtów, gdzie wyszła liczba bez sensu. Potrzebne są oba, no-gzip i no-brotli, a tylko jedno z nich jest tym oczywistym.