Экономия трафика с помощью mod_compress в Lighttpd (Debian Squeeze)
Версия и автор
Version 1.0
Author: Falko Timme
Follow me on Twitter
Короткое объяснение термина
mod_compress — модуль Lighttpd, который сжимает текстовые ресурсы (gzip/deflate) и хранит их в кэше, чтобы отдавать клиентам готовые сжатые файлы без повторной компрессии каждого запроса.
1 Предварительная заметка
Я предполагаю, что у вас уже есть рабочая конфигурация Lighttpd на Debian Squeeze, например, как в руководстве: Installing Lighttpd With PHP5 And MySQL Support On Debian Squeeze. Если сервер ещё не настроен, настройте базовый стек до включения mod_compress.
2 Включение и настройка mod_compress
Откройте файл конфигурации Lighttpd:
vi /etc/lighttpd/lighttpd.confУбедитесь, что в секции server.modules включён модуль mod_compress (по умолчанию он активен в Debian Squeeze):
server.modules = (
"mod_expire",
"mod_access",
"mod_alias",
"mod_compress",
"mod_redirect",
# "mod_rewrite",
)
[...]Далее найдите параметры compress.cache-dir и compress.filetype:
[...]
compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype = ("application/x-javascript", "text/css", "text/html", "text/plain")
[...]Параметр compress.cache-dir указывает каталог, где Lighttpd хранит сжатые копии. Параметр compress.filetype определяет типы файлов для сжатия. Чтобы учесть разные MIME для JavaScript, расширьте список:
[...]
compress.filetype = ("application/x-javascript", "application/javascript", "text/javascript", "text/x-js", "text/css", "text/html", "text/plain")
[...]Убедитесь, что каталог кэша существует и принадлежит пользователю/группе www-data:
ls -la /var/cache/lighttpd/compress/Пример вывода:
root@server1:~# ls -la /var/cache/lighttpd/compress/
total 8
drwxr-xr-x 2 www-data www-data 4096 Nov 12 12:45 .
drwxr-xr-x 4 www-data www-data 4096 Feb 17 17:57 ..
root@server1:~#Если каталога нет, создайте и задайте права:
mkdir -p /var/cache/lighttpd/compress/
chown www-data:www-data /var/cache/lighttpd/compress/Перезапустите Lighttpd:
/etc/init.d/lighttpd restartImportant: сжатие увеличивает использование CPU на сервере, но часто выигрывает за счёт меньшего времени передачи и уменьшенного сетевого трафика.
3 Сжатие PHP
PHP умеет сжимать вывод самостоятельно, поэтому сжатие PHP не нужно дублировать в Lighttpd. Для включения сжатия в PHP откройте файл:
vi /etc/php5/cgi/php.iniИ включите zlib.output_compression:
[...]
; Transparent output compression using the zlib library
; Valid values for this option are 'off', 'on', or a specific buffer size
; to be used for compression (default is 4KB)
; Note: Resulting chunk size may vary due to nature of compression. PHP
; outputs chunks that are few hundreds bytes each as a result of
; compression. If you prefer a larger chunk size for better
; performance, enable output_buffering in addition.
; Note: You need to use zlib.output_handler instead of the standard
; output_handler, or otherwise the output will be corrupted.
; http://php.net/zlib.output-compression
zlib.output_compression = On
[...]После правки перезапустите Lighttpd:
/etc/init.d/lighttpd restartNote: Если вы используете PHP-FPM или другой SAPI, убедитесь, что настройка правится в подходящем php.ini для вашей SAPI.
4 Очистка каталога сжатых файлов
Каталог сжатых файлов (/var/cache/lighttpd/compress/) должен регулярно очищаться от старых объектов. В Debian Squeeze обычно есть cron-задание /etc/cron.daily/lighttpd:
cat /etc/cron.daily/lighttpd#!/bin/sh
# Cleanup lighttpd compress cache
cache=/var/cache/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Этот скрипт удаляет файлы, к которым не обращались более 30 дней. Если такого cron-файла нет, добавьте вручную задачу в crontab:
crontab -eИ добавьте строку, например:
23 4 * * * /usr/bin/find /var/cache/lighttpd/compress -type f -atime +30 -print0 | /usr/bin/xargs -0 -r /bin/rm(Эта задача будет запускаться ежедневно в 04:23.)
5 Тестирование
Чтобы проверить работу сжатия, установите расширение Live HTTP Headers для Firefox (или используйте инструменты разработчика в современных браузерах) и откройте статическую HTML-страницу. В заголовках запроса клиент должен отправлять Accept-Encoding: gzip,deflate, а сервер — отвечать Content-Encoding: gzip для сжатого ответа.

Если посмотреть в каталог /var/cache/lighttpd/compress/, там должны появиться файлы с суффиксом gzip:
ls -la /var/cache/lighttpd/compress/root@server1:~# ls -la /var/cache/lighttpd/compress/
total 16
drwxr-xr-x 2 www-data www-data 4096 Mar 7 16:32 .
drwxr-xr-x 4 www-data www-data 4096 Feb 17 17:57 ..
-rw------- 1 www-data www-data 3102 Mar 7 16:32 howto.html-gzip-237485-9070-1299510809
-rw------- 1 www-data www-data 1562 Mar 7 16:30 index.lighttpd.html-gzip-237105-3585-1297961821
root@server1:~#Расширенные рекомендации и отладка
Когда сжатие не даёт выгоды
- Если ваш сайт в основном отдаёт уже сжатые бинарные форматы (например, изображения, видео, архивы), повторное сжатие неэффективно.
- На очень нагруженных CPU серверах компрессия может увеличить задержку ответа. В таком случае рассмотрите использование предварительно сжатых файлов (см. далее) или offloading на CDN.
Альтернативные подходы
- Предварительное сжатие при сборке: генерируйте .gz-файлы на этапе деплоя и отдавайте их напрямую веб-сервером по условию Accept-Encoding.
- Использование CDN: многие CDN автоматически сжимают и кэшируют контент ближе к пользователю.
- Nginx/Apache: если вы планируете миграцию, у этих серверов свои модули сжатия (gzip, mod_deflate) с другой логикой и настройками.
Мини-методология для оценки эффективности
- Измерьте средний размер текстовых ресурсов и долю трафика, приходящуюся на них.
- Включите сжатие в тестовой среде.
- Протестируйте время загрузки и нагрузку CPU при реальном трафике (или синтетическом).
- Сравните экономию трафика и дополнительную CPU-нагрузку; решите по соотношению выгода/затраты.
Чеклист для внедрения (роль: администратор)
- Проверить поддержку mod_compress в установленной версии Lighttpd.
- Добавить/расширить compress.filetype для всех нужных MIME.
- Убедиться в существовании и правах каталога compress.cache-dir.
- Настроить cron для очистки старых файлов.
- Включить zlib.output_compression для PHP (если применимо).
- Протестировать Accept-Encoding/Content-Encoding и проверить содержимое каталога кэша.
Безопасность и стабильность
- Не храните в каталоге кэша файлы с слабой очерёдностью прав доступа; используйте www-data:www-data.
- Следите за тем, чтобы доступ к каталогу кэша не был открыт публично через конфигурацию сервера.
- При ручной очистке используйте безопасные команды find/xargs, чтобы не удалить лишнего.
Краткий справочник (1 строка)
- gzip — алгоритм сжатия; Accept-Encoding/Content-Encoding — заголовки, по которым клиент и сервер согласуют сжатие; zlib.output_compression — директива PHP для сжатия вывода.
Полезные варианты и тестовые сценарии
- Повторный запрос одного и того же ресурса: убедиться, что сервер отдаёт файл из кэша и Content-Encoding присутствует.
- Запрос с отключенным Accept-Encoding: сервер должен отдавать несжатый ресурс.
- Нагрузочный тест: при росте параллельных соединений проверить CPU и время ответа.
6 Ссылки и ресурсы
- Lighttpd mod_compress: http://redmine.lighttpd.net/wiki/1/Docs:ModCompress
- Live HTTP Headers Plugin for Firefox: https://addons.mozilla.org/en-us/firefox/addon/live-http-headers/
- Debian: http://www.debian.org/
Краткое резюме
mod_compress — простой и эффективный способ снизить сетевой трафик для текстовых ресурсов на Lighttpd. Он требует небольших изменений в конфигурации, наличия каталога кэша и периодической очистки старых файлов. Тестируйте производительность до и после включения и рассматривайте альтернативы (предварительное сжатие, CDN) при высоких нагрузках.
Notes: Если вы используете современный стек или CDN, сравните встроенную компрессию с возможностями внешних сервисов.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента