Перевод статьи Ben Martin «Faster Web page load times for mobile devices with Ziproxy». Ziproxy — сетевой прокси-сервер, но в отличие от большинства способов работы прокси-серверов, вроде Squid, он сделан, чтобы сжимать выбранное содержимое прежде, чем отправить его клиенту. Это может быть полезно для работы с такими мобильными устройствами, как портативные интернет-планшеты, которые не могут получить много пользы от высокого разрешения, изображений высокого качества или в тех случаях, когда браузер потребляет чрезмерное количество ресурсов при низкой скорости и дорогом трафике. Ziproxy умеет сжимать изображения JPEG или JPEG 2000, понижая их качество (делая меньше) и оптимизировать размер содержимого HTML и CSS до сжатия их с помощью gzip. Хотя изображения JPEG 2000 требует много вычислительной мощности для декодирования, они могут быть сделаны существенно меньше, чем PNG или обычные изображения JPEG. Многие браузеры автоматически разворачивают сжатое содержимое, являющееся кодированным gzip, так что конечный пользователь не может предположить, какое сжатие HTML и CSS использовалось. Репозитории Fedora, Ubuntu и OpenSUSE не содержат пакетов Ziproxy. Я соберу из исходных кодов последнюю версию Ziproxy 2.5.2 на 64-битном компьютере с Fedora 9. Если вы хотите пережимать изображения в формат JPEG 2000, вы должны установить пакеты разработки JasPer перед сборкой Ziproxy. JasPer доступен в качестве установки 1-Click для OpenSUSE, его пакет есть в Ubuntu Hardy и он доступен в репозиториях Fedora 9 под именем jasper-devel. Команды для сборки Ziproxy показаны ниже. Я обнаружил, что, даже с установленными пакетами разработки JasPer, мне пришлось добавить опцию --with-jasper для сборки с поддержкой JPEG 2000. $ tar xjf /FromWeb/ziproxy-2.5.2.tar.bz2 $ cd ./ziproxy-2.5.2/ $ ./configure --with-jasper $ make $ sudo make install $ su -l # cp -av etc/ziproxy /etc # chown -R root.root /etc/ziproxy Ziproxy поставляется с файлом init.d, который может быть использован для старта демона, но есть несколько проблем со стартом Ziproxy с помощью этого скрипта. Например, директория Ziproxy жестко закодирована, и скрипт не найдет бинарный файл, если он установлен в /usr/local. Наиболее серьезная проблема в том, что он запускает Ziproxy под суперпользователем. Чтобы исправить эти проблемы, я создал нового пользователя для запуска программы, затем отредактировал скрипт так, как показал ниже. В строке, вызывающей printf, я убрал «g» из оригинального вызова к gprintf. Заключение в оболочку вызова Ziproxy с помощью команды su — главное изменение. # useradd ziproxy # mkdir /var/log/ziproxy # chown ziproxy.ziproxy /var/log/ziproxy # cp /.../ziproxy-2.5.2/etc/init.d/ziproxy /etc/init.d # vi /etc/init.d/ziproxy ... PID_FILE=/var/tmp/ziproxy.pid ZIPROXY=/usr/local/bin/ziproxy ... printf "Starting %s: " "${PROGNAME}" ... su -c "${ZIPROXY} -d -c ${ZIPROXY_CONF} >${PID_FILE}" ziproxy ... # /etc/init.d/ziproxy start Вы можете запускать Ziproxy либо через xinetd, либо в качестве отдельного демона. Я запущу его в качестве отдельного демона, так как это обычно дает прирост производительности. Любая фильтрация клиентского подключения, которая может быть сделана через xinetd, может быть сделана через фильтрацию пакетов и использовать форвардинг SSH порта для безопасного доступа к Ziproxy из интернета. Перед стартом Ziproxy, взгляните на его конфигурационный файл. Первые опции позволят вам указать порт и адрес, к которым будет связан Ziproxy. Опция OnlyFrom позволяет вас указать IP адрес или непрерывный диапазон IP адресов (в форме начальный IP — конечный IP), которым дозволен доступ к прокси. Если значение OnlyFrom не указано, тогда любой клиент может подключаться к адресу и порту, на которых работает Ziproxy. Если вы используете Ziproxy в качестве веб-прокси для мобильных устройств, оптимальным решением будет установить OnlyFrom=127.0.0.1 и использовать форвардинг SSH порта для подключения к веб-прокси. Множество опций в ziproxy.conf указывают, какие форматы файлов будут (пере)сжаты, в какие форматы изображений можно их сжимать, и насколько активно устанавливать параметры сжатия изображения. Как и указано в приведенных выше двух вариантах использования, вряд ли вы можете захотеть, чтобы изображения сжимались в формат JPEG 2000 для устройств с минимальным размером ОЗУ и встроенным медленным ЦПУ, — таких, как интернет планшет. С другой стороны, мы можете захотеть, чтобы все изображения были пересжаты в JPEG 2000, если вы планируете получать доступ к прокси с быстрого лаптопа, но с медленным подключением. Настройки качества сжатия изображения могут меняться в зависимости от того, насколько большое (в пикселях) изображения. Более вероятно, что вы предпочтете изображение лучшего качества для более крупных изображений на странице. В качестве дополнительного бонуса, если вы укажите отрицательные значения, тогда изображение сначала будет конвертировано в черно-белое, а затем сжато с указанным качеством. Вы должны указать четыре значения для настройки качества, чтобы использовать их для изображений до 5000, 50000 и 250000 пикселов и все изображения с большими размерами. Например, ImageQuality={17,20,23,25}. Если вы хотите сделать сжатие в JPEG 2000, используйте ключевое слово JP2ImageQuality. По умолчанию, Ziproxy будет пытаться сжать изображения PNG, JPG и GIF. Вы можете выключить сжатие для определенного формата изображений с помощью булевых опций типа ProcessJPG. Если вы хотите сделать пережатие в формат JPEG 2000 вместо нормального JPEG (если это возможно), тогда установите ProcessToJP2=true. И наоборот, если вы хотите пересжать изображение JPEG 2000 в нормальный JPEG, установите ForceOutputNoJP2=true. Есть ещё небольшой набор опций, относящихся к тому, как сжимать изображения JPEG. Чтобы узнать подробности, изучите пример ziporoxy.conf. Для работы со сжатием текста, установите Gzip=true/false; по умолчанию true. Если ваш клиент не поддерживает сжатое с помощью gzip содержимое или вы получаете доступ к прокси через SSH и предпочитаете использовать сжатие по SSH, вы должны выключить этот параметр. Опция Compressible={"shockwave","foo"} позволяет вам передать Ziproxy список других типов данных, которые следует подвергать сжатию. Набор опций, начинающихся с префикса Process, позволяет указать вам, должны ли сжиматься файлы HTML, CSS и JavaScript по пути. Эти опции делают содержимое немного меньше, но они обозначены как экспериментальные. Вы можете установить предел (в байтах) размера файлов, который Ziproxy будет пытаться (пере)сжать, используя опцию MaxSize. Устанавливка всех значений ImageQuality на отрицательные для того, чтобы заставить Ziproxy конвертировать все изображения в черно-белые, дает быструю визуальную индикацию, какие изображения на странице обработал Ziproxy. Изучение логов в течении тестирования на linux.com и slashdot.org не показало большого сжатия. В сущности, единственными вещами, ставшими черно-белыми, были не-флешевые рекламные блоки. Используя аналогичную настройку и посещая другие сайты, вроде arstechnica.com, я обнаружил, что большинство изображений на странице были черно-белые, и было значительно сокращение в байтах, прошедших между Ziproxy и браузером. При промотре сайта Project Gutenberg, множество CSS-файлов при передаче были сжаты на 25% от их оригинального размера. Хотя они были только 5 и 20 КБ каждый в оригинале, сокращения размеров будут заметны, если вы используете медленное подключение. Изображение размером в 30 КБ, на котором изображено портативное устройство для чтения книг, также стало равным 5 КБ. При скачивании более крупных файлов, таких, как текст «Мертвых Душ», при использовании Ziproxy, передача становится на 60% меньше, чем без него. Результат поиска книги также уменьшился с 8 до 3 КБ, будучи просмотренным через Ziproxy. В качестве последнего теста на сайте Gutenberg, я скачал несжатую версию «Игрока» Достоевского, размером 343 КБ, и Ziproxy передал 89 КБ браузеру. Для сравнения, сжатая в .zip версия книги имеет размер 126 КБ. Конечно, передача между Ziproxy и сайтом Gutenberg будет значительно больше при скачивании несжатой версии, но, как ни странно, меньшее количество байт передастся между Ziproxy и браузером при скачивании несжатой версии. На сайтах, загруженных изображениями, вроде flickr.com, вы увидете более существенный прирост от пережатия. Используя черно-белые JPEG с качествами сжатия -20 и -15, вы увидите много изображений, ставших размером менее, чем 10% от их изначального размера. Конечно, с такими строгими настройками вы заметите искажения черно-белых изображений от сжатия JPEG. Дальнейшее повышение качества Одним из методов использования Ziproxy является настройка его таким образом, чтобы он допускал подключения только от localhost. В таком случае, клиенты будут использовать форвардинг SSH порта для доступа к прокси, подкючая порт клиентского компьютера, к компьютеру, на котором запущен Ziproxy. Не смотря на то, что у SSH есть опция -C для сжатия передаваемой информации, выключив сжатие SSH и положившись на сжатие Ziproxy, вы получите лучшее сжатие, в особенности изображений. Общее сжатие (ssh -C использует gzip) не способно работать с JPEG для изображений. Реклама и safebrowsing могут заключать в себе львиную долю байт, передаваемых в процессе просмотра сайта. Даже если вы избавляетесь от рекламы с помощью программ типа Adblock Plus, Ziproxy может дать заметные уменьшения в числе байт, переданных вашему клиенту. То, насколько эффективно Ziproxy сжимает содержимое CSS и HTML зависит от того, как хорошо сайты, которые вы просматриваете, уже извлекают пользу от неявного сжатия, поддерживаемого клиентом. Хотя сжатие gzip HTML и CSS сохраняет байты так, что конечный пользователь не может этого заметить, опции настройки также позволяют вам указывать, насколько много искажений может вноситься в ваши изображения для того, чтобы сохранить ещё больше байт. |