О том как я optipng на shared hosting fozzy ставил

в 2:18, , рубрики: nix, Настройка Linux, сжатие данных, хостинг, метки:

Предисловие

Привет, читатели. Это мой первый пост на хабре. Нахожусь в приподнятом настроении, поэтому решил поделиться знанием с миром, ну и для себя оставить, когда через месяц сложно будет вспомнить последовательность действий. Частенько мне приходилось уже изобретенное колесо изобретать снова. Получалось быстрее, тем не менее, мне это стоило обычно недюжинного напряжения ума.

Многие, как и мы, хостят свои сайты на т.н. shared hosting. Наш хостер fozzy всем хорош, менять его желания никакого нет, поэтому, когда в google adwords поддержке нас ткнули носом в низкий рейтинг pagespeed insight на мобильной версии, пришлось снова вернуться к вопросу оптимизации изображений.

Несколько месяцев назад этот вопрос уже возникал. Я пытался по всяким мануалам, в том числе с Хабра, добиться высокого рейтинга на pagepseed, но одно дело получить 100 баллов при загрузке страницы:

<html><body>Hello world!</body></html>

и совсем другое дело получить высокую оценку на странице интернет магазина, на котором куча скриптов, которые нельзя отключить или загружать асинхронно.

В общем оптимизация тогда закончилась на том, что из невыполненного осталось только сжатие изображений. Остальные пункты или были выполнены или их просто невозможно было выполнить не обрезая функциональность.

Те из Вас, кто интересовался вопросом оптимизации изображений, наверняка знают, что библиотеки PHP для работы с растровым изображением, что imagick, что GD, при любых настройках сжатия не позволяют получить изображения, которые гугл не сможет сжать еще сильнее. Тогда искания пришли именно к тому, что после генерации растрового изображения средствами php, нужно его сжимать чем-то еще. Тогда эти Optipng и jpeglib появились на горизонте. Спросил поддержку о возможности использования этих программ на shared hosting, сказали — нельзя. Потыкался, потыкался и плюнул.

Мне ленивому и очень гордому показалось унизительной и просто неприемлемой перспектива грузить на сайт 400к картинок предварительно сжатых во всех нужных разрешениях. Ведь я пользуюсь ПК еще со времен ДОСа, а в сеть ходил еще во времена FIDONET по внутреннему модему на скорости 9600 бод.

Тогда я решил, если не могу сделать красиво, то вообще не буду делать.

Прошли месяцы. Очередной подход к снаряду увенчался успехом. Все дело в настрое, я просто решил, что должен найти способ. Тем более, что в англоязычном тырнете писали об установке отдельных программ на shared hosting. Про fozzy ничего не нашел, зато нашел, как кто-то на dreamhost optipng 0.7.4 поставил.

Получилось как в той сказке про лягушек в ведре с молоком. Одна устала барахтаться и утонула, а другая не ожидая чего-то определенного, продолжала и продолжала. Вспоминая опыт успешной сборки драйвера для своего китайфона philips xenium на андроиде, не имея исходников прошивки, я продолжал и продолжал.

Делюсь результатом с Вами. Вот восстановленная по памяти последовательность событий рабочего варианта установки на виртуальных хостинг fozzy optipng 0.7.6

Журнал событий

  1. Смотрю версию системы:
    cat /proc/version

    Показывает, что у нас Red Hat 4.4.7-4, а именно:

    «Linux version 2.6.32-531.23.3.lve1.2.66.el6.x86_64 (mockbuild@koji.cloudlinux.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Sep 12 10:57:40 EDT 2014»

  2. Ставлю на VirtualBox centOS 7 x86_64.
  3. Ставлю нужные для компиляции optipng пакеты. Я выбрал при установке минимальный набор, поэтому после установки мне пришлось поставить gcc и mc. Делаем так:
    yum install mc gcc

  4. Я не создавал пользователей и сидел рутом. Создаем каталог для работы
    mkdir ~/usr

    Переходим туда:

    cd ~/usr

    Качаем libpng-0.7.6.tar.xz:

    wget http://prdownloads.sourceforge.net/optipng/optipng-0.7.6.tar.gz

  5. Распаковываем:
    tar -xzvf optipng-0.7.6.tar.gz

    Переходим в созданный каталог:

    cd optipng-0.7.6

    Запускаем configure для установки в указанное место:

    ./configure –prefix=/root/usr/

    Компилируем:

    make

    Устанавливаем:

    make install

    В результате манипуляций в каталоге /root/usr/bin у нас должен лежать бинарник optipng.

  6. Заставить работать его на fozzy сразу не удалось. Запуск приложения
    давал это:

    ./optipng: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./optipng)

  7. Подходящая нам версия GLIBC есть в этом пакете:

    rpmfind.net/linux/opensuse/distribution/12.1/repo/oss/suse/x86_64/glibc-2.14.1-14.12.5.x86_64.rpm

  8. Качаем и распаковываем. На хостинге приложения для работы с rpm нет, поэтому я все это делал на моей виртуалке centos.
  9. Создаем рабочий каталог:
    mkdir ~/usr/glibc

  10. Переходим в рабочий каталог:
    cd ~/usr/glibc

  11. Качаем файл:
    wget ftp://rpmfind.net/linux/opensuse/distribution/12.1/repo/oss/suse/x86_64/glibc-2.14.1-14.12.5.x86_64.rpm

    Распаковываем:

    rpm2cpio glibc-2.14.1-14.12.5.x86_64.rpm | cpio -idmv

    Теперь в каталоге lib64 у нас есть нужные библиотеки. Я забрал весь каталог целиком.

  12. Для работы optipng на хостинге нам нужно следующее:

    ./bin/optipng сама программа
    ./lib64/ библиотеки glibc 2.14

  13. Запиливаем все это на хостинг и распаковываем. Я запускал все из рабочей директории:

    Идем в каталог с программой:

    cd ~/bin

    Запускаем:

    LD_LIBRARY_PATH=~/lib64 ./optipng

  14. Вуаля!

    image

Пробуем сжать retro_after.png:

LD_LIBRARY_PATH=~/lib64 ./optipng ~/www/retro_after.png

** Processing: retro_after.png
800x800 pixels, 3x8 bits/pixel, RGB
Input IDAT size = 284863 bytes
Input file size = 285328 bytes

Trying:
zc = 9 zm = 8 zs = 0 f = 0 IDAT size = 282260
zc = 9 zm = 8 zs = 0 f = 5 IDAT size = 192148
zc = 9 zm = 8 zs = 1 f = 5 IDAT size = 189198

Selecting parameters:
zc = 9 zm = 8 zs = 1 f = 5 IDAT size = 189198

Output IDAT size = 189198 bytes (95665 bytes decrease)
Output file size = 189255 bytes (96073 bytes = 33.67% decrease)

Вот несжатый файл: sevenlight.ru/retro_before.png
Размер: 285 328 байт
image
А вот сжатый: sevenlight.ru/retro_after.png
Размер: 189 255 байт
image
Кому лень заморачиваться, вот готовый архив для загрузки на хостинг.

Автор: Пупсень и Вупсень

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js