Массовое изменение размера картинок на сервере

Снова вернёмся к проблеме ограниченного дискового пространства на сервере. Чаще всего она возникает для VPS на SSD (SSD быстры, но дороги, поэтому хостеры, как правило, дают за те же деньги меньше диска, чем в случае с HDD). Также проблема с нехваткой диска часто возникает для серверов, где хостятся сайты с контентом, генерируемым пользователями (например, всяческие форумы, где пользователи грузят и грузят картинки). В большинстве случаев сайт тяжелеет именно за счёт картинок. И, наконец, тяжелый сайт требует больше места для бэкапов. Начинать строгую диету для сайта лучше с удаления и пережатия картинок без изменения разрешения, ведь меняя размер вы всегда рискуете тем, что где-то на сайте из-за новых размеров картинки сломается вёрстка. Но иногда пережатия недостаточно. Что же ещё можно предпринять?

Очевидно, можно попробовать уменьшить разрешение картинок. И тут очень важно трогать только те картинки, которые относятся к контенту и не относятся к вёрстке. Поэтому заранее озаботьтесь изучением движка сайта, чтобы знать, куда складываются картинки, залитые пользователями. В помощь вам вот такой конвейер:

du -sh /var/www/mysite/public/* | sort -hr

, где /var/www/mysite/public/ — корень исследуемого сайта. На выходе вы получите вес всех директорий сайта, отсортированный по убыванию, примерно так:

897M	/var/www/mysite/public/sites
84M	/var/www/mysite/public/core
28M	/var/www/mysite/public/vendor
17M	/var/www/mysite/public/modules
...

Очевидно, что много тяжелых картинок прячутся где-то в /var/www/mysite/public/sites, узнать где именно мы можем повторив поиск и сортировку уже для этого каталога:

du -sh /var/www/mysite/public/sites/* | sort -hr

Ну, вы поняли. Таким методом можно выяснить, где загружаемые картинки лежат в вашем движке. Примеры путей (относительных, от корня сайта) для некоторых популярных движков:

  • Для Drupal (вплоть до новой 8-ой версии) — ./sites/default/files/
  • Для WordPress — ./wp-content/uploads/

Дальше для установленного пути выполняем:

find /var/www/mysite/public/sites/default/files/ \
-type f -iname '*.jpeg' -o -iname '*.jpg' \
-exec mogrify -verbose -resize 1000x1000\> {} \;

Здесь find отвечает за поиск файлов с расширениями *.jpeg или *.jpg, а благодаря ключу -exec для каждого из найденных файлов выполняется mogrify (это аналог convert из ImageMagick, но mogrify перезаписывает изменения в тот же файл, в отличии от convert).

И особый интерес представляет ключ -resize 1000x1000\> — его смысл в том, что мы будем изменять размер картинок, но только тех, которые больше, чем 1000 на 1000 пикселей. То есть картинку размеров 640 на 320 мы не тронем вообще, а картинку 1500 на 1200 пропорционально уменьшим (до 1000 на 800). Такая обработка, во-первых, не увеличит никакие картинки, во-вторых, выполнится быстрее.



Прокомментируйте: