Налаштування mod_gzip - стиснення трафіку в apache, записки програміста

Непроста це справа - намагатися утримувати частоту появи нових постів в блозі на рівні хоча б раз на тиждень. Вічно всякі дурниці в реалі, на кшталт сесії, псують все плани # 58;) Зціпивши зуби, пишу черговий пост, намагаючись, щоб вийшло цікаво і корисно для читачів.

Про всяк випадок нагадую, що mod_gzip - це модуль для веб-сервера Apache, призначений для стиснення трафіку. Працює це дуже просто - якщо модуль встановлений, а браузер відвідувача при запиті сторінки говорить, що розуміє стиснення gzip:

... то веб-сервер може послати йому не оригінал сторінки, а її стислу gzip'ом версію:

Content-Type: text / html; charset = utf-8
Content-Encoding: gzip

Налаштування mod_gzip - стиснення трафіку в apache, записки програміста

Насправді, в мережі досить багато прикладів налаштування стиснення трафіку за допомогою mod_gzip, але я зіткнувся з деякими труднощами при його використанні, про які хотів би розповісти. Нижче йде мій конфігураційний файл (mod_gzip.conf), який використовується для стиснення веб-трафіку цього блогу. Його можна підключити до httpd.conf (або що там у вашого хостера? У мого - virtual.conf.manual) за допомогою директиви Include:

Завантажити поточну версію файлу mod_gzip.conf можна тут. А ось його код:

Поки все просто. Якщо модуль встановлений, то включаємо його.

mod_gzip_can_negotiate Yes
mod_gzip_static_suffix .gz
AddEncoding gzip .gz

Опція mod_gzip_can_negotiate говорить модулю, що в разі, якщо користувач запросив файл, скажімо main.css, а в одній директорії з ним лежить main.css.gz (розширення задається за допомогою mod_gzip_static_suffix), то потрібно віддати main.css.gz. Зрозуміло, це тільки в тому випадку, якщо клієнт підтримує gzip-стиснення. Таким чином ми можемо заздалегідь стиснути всі файли, які в подальшому не збираємося редагувати, заощадивши тим самим трохи процесорного часу.

Якщо створювати руками стислі копії файлів для попередніх опцій влом, можна поставити тут Yes, завантажити потрібні файли (для них модулем будуть створені стислі копії), а потім поставити назад No. Стислі копії перезаписувати при кожному новому зверненні до файлів, поки тут не буде прописаний No.

mod_gzip_temp_dir / tmp
mod_gzip_keep_workfiles No

Тут можна змінити каталог для тимчасових файлів і вказати, чи потрібно їх зберігати. Останнє може стати в нагоді для налагодження.

mod_gzip_minimum_file_size 500
mod_gzip_maximum_file_size 500000
mod_gzip_maximum_inmem_size 60000

Мінімальний / максимальний розмір файлу, необхідний для того, щоб він стискався, і максимальний розмір файлу, при якому стиснення буде відбуватися повністю в пам'яті відповідно.

mod_gzip_min_http 1000
mod_gzip_handle_methods GET POST
mod_gzip_item_exclude reqheader "User-agent: Mozilla / 4.0 [678]"
mod_gzip_item_include handler ^ cgi-script $

Мінімальна версія протоколу - HTTP / 1.0, виробляти стиснення тільки при GET і POST запитах, виключити клієнтів, які заявляють, що підтримують gzip, хоча насправді це не так і включити стиск даних, які видаються CGI-скриптами.

mod_gzip_item_include mime ^ text /.*
mod_gzip_item_include mime ^ application / x-httpd-php
mod_gzip_item_include mime ^ application / xml
mod_gzip_item_exclude mime ^ image /
mod_gzip_item_include file \ .js $
mod_gzip_item_include file \ .css $

Тут потрібно звернути увагу на кілька моментів. По-перше, браузер Netscape 4 неправильно обробляє стислі css-файли, і це є погано. На щастя, 99% відвідувачів сидять під Firefox, Chrome, Opera або IE, так що турбуватися про одне єдиному криво написаному браузері, яким практично ніхто не користується, турбуватися не варто. По-друге, в багатьох мануалах пропонується замість 16-го рядка написати таке:

mod_gzip_item_include mime ^ text / html $

Тобто, з доларом на кінці, що позначає (якщо ви забули регулярні вирази) кінець рядка. Так ось, виявляється, що це не завжди працює, в залежності, судячи з усього, від версії mod_gzip. Мабуть, це пов'язано з тим, що веб-сервер передає значення Content-Type в такому вигляді:

Content-Type: text / html; charset = utf-8

Як бачите, після text / html ніякого кінця рядка насправді немає.

Дозволяє mod_gzip декодувати відповіді сервера з

Якщо ви не знаєте, що це таке, то просто повірте, що це дійсно повинно бути в конфіги. Todo: написати опис протоколу HTTP і пояснити, що таке chunked.

LogFormat "% h% l% u% t"% V% r "% Out:% n =% n pct." common_with_mod_gzip_info2
CustomLog /full/path/to/logs/mod_gzip.log common_with_mod_gzip_info2

Формат записів в лог-файлі і шлях до лог-файлу. Список слід включити тільки на час тестування mod_gzip, потім вони будуть тільки даремно займати місце на диску. Ось як приблизно будуть виглядати записи в mod_gzip.log:

У першому рядку написано, що файл select-dict.png був переданий в стислому вигляді, оскільки ми сказали не стискати картинки (вони і так непогано стиснуті, якщо це не bmp). У другій - що при запиті статті Цікаві приклади на Perl був успішно виконаний dechunk і вироблено стиск html-коду аж на 73%.

В цілому, моя думка щодо mod_gzip наступне - користуватися ним можна і потрібно. Головним чином, тому що це дозволяє вашим відвідувачам (і пошуковим системам) швидше завантажувати сторінки і економити трафік. Більшість хостерів сьогодні вже не вводять обмежень на обсяг трафіку ваших сайтів і використання CPU їх не сильно турбує (на відміну від числа запущених процесів і обсягу споживаної оперативної пам'яті), тому економія з боку вебмастера грає другорядну роль.

Сподобався пост? Поділися з іншими:

(Необхідно включити JS)