Стискати той самий файл щоразу заново
Apache стискає відповіді на льоту. Для сторінки, яка щоразу інша, це єдиний шлях. Для таблиці стилів, що змінюється раз на місяць, це означає, що сервер робить ту саму роботу наново для кожного відвідувача, тижнями, і щоразу викидає результат. Кешу для цього немає.
Виміряно 19 серпня 2026 року по вже встановленому з’єднанню, на власних style.css (124 кБ) і world.js (102 кБ) цього сайту:
| час | байтів | |
| без стиснення | 2,9 мс | 124 755 |
| gzip, на льоту | 18,1 мс | 34 995 |
| brotli, на льоту | 14,5 мс | 32 685 |
| world.js, gzip | 47,9 мс | 38 283 |
| world.js, brotli | 15,9 мс | 38 086 |
Сорок вісім мілісекунд процесора на запит заради результату, що збігається байт у байт. На Raspberry Pi це не похибка округлення.
Стиснути один раз, на диск
Крок збирання кладе стиснений файл поруч із початковим, а правило перепису віддає його, коли браузер повідомляє, що приймає gzip. Віддати готовий файл коштує стільки, скільки коштує віддати будь-який файл.
gzip, а не brotli, з нудної причини: на цій машині не встановлено програми brotli. Файли виходять приблизно на 7 % більшими, ніж зробив би brotli, а час сервера — п’ята частина того, що коштує brotli на льоту. Цей обмін варто було здійснити зараз, а не чекати гарнішої відповіді.
Версія стоїть в імені файлу
Збирання пише style.css.<mtime>.gz, а ?v= у розмітці — той самий час зміни. Правило перепису спрацьовує лише тоді, коли файл із відповідним числом існує.
У цього влаштування є властивість, заради якої варто проєктувати навмисне: якщо змінити таблицю стилів і забути перезібрати, число в розмітці вкаже на неіснуючий файл, правило не спрацює, і Apache звичайним чином віддасть оригінал. Найгірше, що станеться, — зникне прискорення. Застаріла таблиця стилів вийти не може. Будь-яку схему кешування варто перевіряти цим питанням — коли вона ламається, стає повільно чи стає хибно?
Помилка посеред усього цього
Файл, що віддається, уже в gzip, отже на виході його не можна стискати вдруге. У налаштуванні спершу стояло no-gzip, і це зупиняє один із двох стискачів Apache. Другий, mod_brotli, бадьоро пакував готовий gzip-файл іще раз у brotli, доки заголовок відповіді й далі стверджував gzip.
Браузери отримували нечитний вміст. Помітили це не при погляді на сторінку — помітили при додаванні байтів, де вийшло число, що не мало сенсу. Потрібні обидва, no-gzip і no-brotli, і лише один із них очевидний.