Връзка с поддръжката

Отговаряме по имейл, обикновено до два дни.

Google reCAPTCHA проверява това изпращане срещу злоупотреби; данни се изпращат към Google. Скриптът се зарежда само когато този формуляр бъде отворен.

← Всички публикации

Компресиране на един и същ файл всеки път

Apache компресира отговорите в движение. За страница, която всеки път е различна, това е единствената възможност. За стилов лист, който се променя веднъж месечно, това означава, че сървърът върши същата работа отново за всеки посетител, седмици наред, и всеки път изхвърля резултата. Кеш за това няма.

Измерено на 19 август 2026 г. по съществуваща връзка, със собствените файлове на този сайт style.css (124 kB) и world.js (102 kB):

времебайтове
без компресия2,9 ms124 755
gzip, в движение18,1 ms34 995
brotli, в движение14,5 ms32 685
world.js, gzip47,9 ms38 283
world.js, brotli15,9 ms38 086
без компресия2,9 msgzip18,1 msbrotli14,5 msworld.js gzip47,9 msworld.js brotli15,9 ms

Четирийсет и осем милисекунди процесорно време на заявка, за да се получи байт по байт идентичен резултат. На малък сървър това не е грешка от закръгляване.

Компресиране веднъж, на диска

Стъпка при изграждането записва компресирания файл до оригинала, а правило за пренаписване го сервира, когато браузърът съобщи, че приема gzip. Сервирането на готов файл струва колкото сервирането на всеки друг файл.

gzip, а не brotli, по скучна причина: на тази машина няма инсталиран изпълним файл на brotli. Файловете излизат с около 7 % по-големи, отколкото биха били с brotli, а времето на сървъра е една пета от това, което струва brotli в движение. Този компромис си струваше да се приеме сега, вместо да се чака по-хубаво решение.

Версията е в името на файла

Изграждането записва style.css.<mtime>.gz, а ?v= в HTML кода е същото време на промяна. Пренаписването се задейства само когато съществува файл със съответстващото число.

Тази подредба има свойство, което си струва да се заложи нарочно: ако стиловият лист се промени, а повторното изграждане бъде забравено, числото в HTML кода сочи към файл, който не съществува, пренаписването не се задейства и Apache сервира оригинала нормално. Най-лошият случай е, че ускорението липсва. Остарял стилов лист не може да излезе. Всяка схема за кеширане трябва да се проверява с този въпрос — когато нещо се обърка, става ли бавно или става грешно?

Грешката по средата

Сервираният файл вече е gzip, така че не бива да се компресира отново на излизане. Първоначално конфигурацията задаваше no-gzip, което спира единия от двата компресора на Apache. Другият, mod_brotli, весело компресира готовия gzip файл с brotli, докато заглавката на отговора продължаваше да казва gzip.

Браузърите получаваха нечетимо съдържание. Това не беше забелязано при поглед към страницата — беше забелязано при сумиране на байтовете, когато се получи число без никакъв смисъл. Трябват и двете: no-gzip и no-brotli — и само едното от тях е очевидното.

Реклама