_ Автор выбрал Apache Software Foundation, чтобы получить пожертвование в рамках Write for DOnations program._
Вступление
WebP - это формат открытого изображения, разработанный Google в 2010 году на основе видеоформата VP8. С тех пор число веб-сайтов и мобильных приложений, использующих формат WebP, быстро росло. Как Google Chrome, так и Opera изначально поддерживают формат WebP, и поскольку на эти браузеры приходится около 74% веб-трафика, пользователи могут быстрее получать доступ к веб-сайтам, если эти сайты используют изображения WebP. Есть также plans для реализации WebP в Firefox.
Формат WebP поддерживает сжатие изображений с потерями и без потерь, включая анимацию. Его главное преимущество перед другими форматами изображений, используемыми в Интернете, заключается в значительно меньшем размере файла, что ускоряет загрузку веб-страниц и уменьшает использование полосы пропускания. Использование изображений WebP может привести к увеличению скорости страницы https://blog.chromium.org/2014/03/webp-improves- while-rolling-out-across.html[sizeable]. Если ваше приложение или веб-сайт испытывают проблемы с производительностью или увеличивают трафик, преобразование изображений может помочь оптимизировать производительность страницы.
В этом руководстве вы будете использовать инструмент командной строки + cwebp +
для преобразования изображений в формат WebP, создавая сценарии, которые будут просматривать и преобразовывать изображения в определенном каталоге. Наконец, вы найдете два способа предоставления изображений WebP вашим посетителям.
Предпосылки
Работа с изображениями WebP не требует определенного распространения, но мы покажем, как работать с соответствующим программным обеспечением в Ubuntu 16.04 и CentOS 7. Чтобы следовать этому уроку, вам понадобится:
-
Сервер, настроенный с пользователем не-root sudo. Чтобы настроить сервер Ubuntu 16.04, вы можете следовать нашему Ubuntu 16.04 начальному руководству по установке сервера. Если вы хотите использовать CentOS, вы можете настроить сервер CentOS 7 с помощью нашей Initial Server Setup с CentOS 7 руководство.
-
Apache установлен на вашем сервере. Если вы используете Ubuntu, вы можете выполнить первый шаг https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-16- 04 [Как установить стек Linux, Apache, MySQL, PHP (LAMP) в Ubuntu 16.04]. Если вы используете CentOS, вам следует выполнить первый шаг https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-centos-7 Как установить стек Linux, Apache, MySQL, PHP (LAMP) на CentOS 7. Обязательно настройте параметры брандмауэра, чтобы разрешить трафик HTTP и HTTPS.
-
+ mod_rewrite +
установлен на вашем сервере. Если вы используете Ubuntu, вы можете следовать нашему руководству на https://www.digitalocean.com/community/tutorials/how-to-rewrite-urls-with-mod_rewrite-for-apache-on-ubuntu-16-04 [ Как переписать URL-адреса с помощью mod_rewrite для Apache в Ubuntu 16.04]. В CentOS 7+ mod_rewrite +
установлен и активирован по умолчанию.
Шаг 1 - Установка cwebp и подготовка каталога изображений
В этом разделе мы установим программное обеспечение для преобразования изображений и создадим каталог с изображениями в качестве меры тестирования.
В Ubuntu 16.04 вы можете установить + cwebp +
, утилиту, которая сжимает изображения в формат + .webp +
, набрав:
sudo apt-get update
sudo apt-get install webp
На CentOS 7 введите:
sudo yum install libwebp-tools
Чтобы создать новый каталог изображений с именем + webp +
в веб-корне Apache (расположен по умолчанию в + / var / www / html +
), введите:
sudo mkdir /var/www/html/webp
Измените владельца этого каталога на пользователя без полномочий root * sammy *:
sudo chown : /var/www/html/webp
Для проверки команд вы можете скачать бесплатные изображения JPEG и PNG, используя + wget
. Этот инструмент установлен по умолчанию в Ubuntu 16.04; если вы используете CentOS 7, вы можете установить его, набрав:
sudo yum install wget
Затем загрузите тестовые изображения с помощью следующих команд:
wget -c "https://upload.wikimedia.org/wikipedia/commons/2/24/Junonia_orithya-Thekkady-2016-12-03-001.jpg?download" -O /var/www/html/webp/image1.jpg
wget -c "https://upload.wikimedia.org/wikipedia/commons/5/54/Mycalesis_junonia-Thekkady.jpg" -O /var/www/html/webp/image2.jpg
wget -c "https://cdn.pixabay.com/photo/2017/07/18/15/39/dental-care-2516133_640.png" -O /var/www/html/webp/logo.png
Большая часть вашей работы на следующем шаге будет находиться в каталоге + / var / www / html / webp +
, куда вы можете перейти, набрав:
cd /var/www/html/webp
Установив тестовые изображения и установив веб-сервер Apache + mod_rewrite +
и + cwebp +
, вы готовы перейти к конвертации изображений.
Шаг 2 - Сжатие файлов изображений с помощью cwebp
Для предоставления + .webp +
изображений посетителям сайта требуются + .webp +
версии файлов изображений. На этом этапе вы конвертируете изображения JPEG и PNG в формат + .webp +
, используя + cwebp +
. * Общий * синтаксис команды выглядит следующим образом:
cwebp image.jpg -o image.webp
Опция + -o +
указывает путь к файлу WebP.
Поскольку вы все еще находитесь в каталоге + / var / www / html / webp +
, вы можете выполнить следующую команду для преобразования + image1.jpg +
в + image1.webp +
и + image2.jpg +
в `+ image2.webp + `:
cwebp -q 100 image1.jpg -o image1.webp
cwebp -q 100 image2.jpg -o image2.webp
Установка коэффициента качества + -q +
в 100 сохраняет 100% качества изображения; если не указан, по умолчанию используется значение 75.
Затем проверьте размер изображений JPEG и WebP с помощью команды + ls +
. Параметр + -l +
покажет формат длинного списка, который включает размер файла, а параметр + -h +
обеспечит, чтобы + ls +
печатал читаемые размеры:
ls -lh image1.jpg image1.webp image2.jpg image2.webp
Output-rw-r--r-- 1 sammy sammy 7.4M Oct 28 23:36 image1.jpg
-rw-r--r-- 1 sammy sammy 3.9M Feb 18 16:46
-rw-r--r-- 1 sammy sammy 16M Dec 18 2016 image2.jpg
-rw-r--r-- 1 sammy sammy 7.0M Feb 18 16:59
Вывод команды + ls +
показывает, что размер + image1.jpg +
равен 7,4 МБ, а размер + image1.webp +
- 3,9 МБ. То же самое касается + image2.jpg +
(16M) и + image2.webp +
(7M). Эти файлы почти в два раза меньше их оригинального размера!
Чтобы сохранить полные исходные данные изображений во время сжатия, вы можете использовать опцию + -lossless +
вместо + -q +
. Это лучший вариант для поддержания качества изображений PNG. Чтобы преобразовать загруженное изображение PNG из шага 1, введите:
cwebp -lossless logo.png -o logo.webp
Следующая команда показывает, что размер изображения WebP без потерь (60 КБ) примерно вдвое меньше исходного изображения PNG (116 КБ):
ls -lh logo.png logo.webp
Output-rw-r--r-- 1 sammy sammy 116K Jul 18 2017 logo.png
-rw-r--r-- 1 sammy sammy 60K Feb 18 16:42
Преобразованные изображения WebP в каталоге + / var / www / html / webp +
примерно на 50% меньше, чем их аналоги в формате JPEG и PNG. На практике степень сжатия может различаться в зависимости от определенных факторов: степени сжатия исходного изображения, формата файла, типа преобразования (с потерями или без потерь), процента качества и вашей операционной системы. Когда вы конвертируете больше изображений, вы можете увидеть различия в коэффициентах конверсии, связанные с этими факторами.
Шаг 3 - Преобразование изображений JPEG и PNG в каталог
Написание скрипта упростит процесс конвертации, исключив работу по конвертации вручную. Теперь мы напишем скрипт преобразования, который найдет файлы JPEG и преобразует их в формат WebP с качеством 90%, а также преобразует файлы PNG в изображения WebP без потерь.
Используя + nano +
или ваш любимый редактор, создайте скрипт + webp-convert.sh +
в домашнем каталоге вашего пользователя:
nano ~/webp-convert.sh
Первая строка скрипта будет выглядеть так:
~ / Webp-convert.sh
find $1 -type f -and \( -iname "*.jpg" -o -iname "*.jpeg" \)
Эта строка имеет следующие компоненты:
-
https://www.digitalocean.com/community/tutorials/how-to-use-find-and-locate-to-search-for-files-on-a-linux-vps [
+ find +
]: эта команда будет искать файлы в указанном каталоге. -
+ $ 1 +
: этот позиционный параметр указывает путь к каталогу изображений, взятый из командной строки. В конечном итоге это делает расположение каталога менее зависимым от расположения скрипта. -
+ -type f +
: эта опция говорит+ find +
искать только обычные файлы. -
+ -iname +
: этот тест сопоставляет имена файлов с указанным шаблоном. Нечувствительный к регистру тест+ -iname +
говорит+ find +
искать любое имя файла, которое заканчивается на+ .jpg +
(+ *. Jpg +
) или+ .jpeg +
(+ *. Jpeg +
). , -
+ -o +
: Этот логический оператор указывает команде+ find +
перечислить файлы, которые соответствуют первому тесту+ -iname +
(+ -iname" * .jpg "+
) * или * второму (`+ -имя "* .jpeg" + `). -
+ () +
: Круглые скобки вокруг этих тестов вместе с оператором+ -and +
гарантируют, что первый тест (т.е.+ -type f +
) всегда выполняется.
Вторая строка скрипта преобразует изображения в WebP с помощью параметра + -exec +
. Общий синтаксис этого параметра: + -exec command {} \; +
. Строка + {} +
заменяется каждым файлом, через который проходит команда, а +; +
сообщает + find +
, где заканчивается команда:
~ / Webp-convert.sh
find $1 -type f -and \( -iname "*.jpg" -o -iname "*.jpeg" \) \
-exec bash -c 'commands' {} \;
В этом случае для параметра + -exec +
потребуется более одной команды для поиска и преобразования изображений:
-
+ bash +
: эта команда выполнит небольшой скрипт, который создаст версию файла «+ .webp », если он не существует. Этот сценарий будет передан ` bash ` в виде строки благодаря опции ` -c +`. -
+ 'команды' +
: этот заполнитель является сценарием, который создаст версии ваших файлов для+ .webp +
.
Скрипт внутри + 'команды' +
будет делать следующие вещи:
-
Создайте переменную
+ webp_path +
. -
Проверьте, существует ли версия файла «+ .webp +».
-
Сделайте файл, если он не существует.
Меньший скрипт выглядит так:
~ / Webp-convert.sh
...
webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$0");
if [ ! -f "$webp_path" ]; then
cwebp -quiet -q 90 "$0" -o "$webp_path";
fi;
Элементы этого меньшего сценария включают в себя:
-
+ webp_path +
: эта переменная будет создана с использованием https://www.digitalocean.com/community/tutorials/the-basics-of-using-the-sed-stream-editor-to-manipulate-text-in-linux [+ sed +
] и соответствующее имя файла из команды+ bash +
, обозначаемое позиционным параметром+ $ 0 +
. Here строка (+ <<< +
) передаст это имя+ sed +
. -
+ если [! -f "$ webp_path"] + `: Этот тест установит, существует ли файл с именем
+ "$ webp_path" +, с использованием логического оператора
+ not +(
+! + `). -
+ cwebp +
: эта команда создаст файл, если он не существует, используя опцию+ -q +
, чтобы не печатать вывод.
С этим меньшим сценарием вместо заполнителя + 'команды' +
, полный сценарий для преобразования изображений JPEG теперь будет выглядеть так:
~ / Webp-convert.sh
# converting JPEG images
find $1 -type f -and \( -iname "*.jpg" -o -iname "*.jpeg" \) \
-exec bash -c '
webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$0");
if [ ! -f "$webp_path" ]; then
cwebp -quiet -q 90 "$0" -o "$webp_path";
fi;' {} \;
Чтобы преобразовать PNG-изображения в WebP, мы воспользуемся тем же подходом с двумя отличиями: во-первых, шаблон + -iname +
в команде + find +
будет + '*. Png" + `. Во-вторых, команда преобразования будет использовать опцию `+ -lossless +
вместо опции качества + -q +
.
Завершенный скрипт выглядит так:
~ / Webp-convert.sh
#!/bin/bash
# converting JPEG images
find $1 -type f -and \( -iname "*.jpg" -o -iname "*.jpeg" \) \
-exec bash -c '
webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$0");
if [ ! -f "$webp_path" ]; then
cwebp -quiet -q 90 "$0" -o "$webp_path";
fi;' {} \;
# converting PNG images
find $1 -type f -and -iname "*.png" \
-exec bash -c '
webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$0");
if [ ! -f "$webp_path" ]; then
cwebp -quiet -lossless "$0" -o "$webp_path";
fi;' {} \;
Сохраните файл и выйдите из редактора.
Далее, давайте применим скрипт + webp-convert.sh +
на практике, используя файлы в каталоге + / var / www / html / webp +
. Убедитесь, что файл сценария является исполняемым, выполнив следующую команду:
chmod a+x ~/webp-convert.sh
Запустите скрипт в каталоге images:
./webp-convert.sh /var/www/html/webp
Ничего не произошло! Это потому, что мы уже преобразовали эти изображения в шаге 2. В дальнейшем скрипт + webp-convert +
преобразует изображения, когда мы добавляем новые файлы или удаляем версии + .webp +
. Чтобы увидеть, как это работает, удалите файлы + .webp +
, которые мы создали на шаге 2:
rm /var/www/html/webp/*.webp
После удаления всех изображений + .webp +
снова запустите скрипт, чтобы убедиться, что он работает:
./webp-convert.sh /var/www/html/webp
Команда + ls +
подтвердит, что скрипт успешно преобразовал изображения:
ls -lh /var/www/html/webp
Output-rw-r--r-- 1 sammy sammy 7.4M Oct 28 23:36 image1.jpg
-rw-r--r-- 1 sammy sammy 3.9M Feb 18 16:46
-rw-r--r-- 1 sammy sammy 16M Dec 18 2016 image2.jpg
-rw-r--r-- 1 sammy sammy 7.0M Feb 18 16:59
-rw-r--r-- 1 sammy sammy 116K Jul 18 2017 logo.png
-rw-r--r-- 1 sammy sammy 60K Feb 18 16:42
Сценарий на этом шаге является основой использования изображений WebP на вашем сайте, так как вам понадобится рабочая версия всех изображений в формате WebP для обслуживания посетителей. Следующий шаг расскажет, как автоматизировать конвертацию новых изображений.
Шаг 4 - Просмотр файлов изображений в каталоге
На этом шаге мы создадим новый скрипт, который будет следить за изменениями в нашем каталоге изображений и автоматически конвертировать вновь созданные изображения.
Создание сценария, который просматривает наш каталог изображений, может решить некоторые проблемы с сценарием + webp-convert.sh +
, как он написан. Например, этот скрипт не будет определять, переименовали ли мы изображение. Если бы у нас было изображение с именем + foo.jpg +
, мы запустили + webp-convert.sh +
, переименовали этот файл + bar.jpg +
, а затем снова запустили + webp-convert.sh +
, мы бы получили дубликат + .webp +
файлы (+ foo.webp +
и + bar.webp +
). Чтобы решить эту проблему и избежать запуска сценария вручную, мы добавим watchers в другой сценарий. Наблюдатели следят за указанными файлами или каталогами на предмет изменений и запускают команды в ответ на эти изменения.
Команда + inotifywait +
настроит наблюдателей в нашем скрипте. Эта команда является частью пакета + inotify-tools +
, набора инструментов командной строки, которые обеспечивают простой интерфейс для подсистемы ядра inotify. Чтобы установить его на Ubuntu 16.04, наберите:
sudo apt-get install inotify-tools
В CentOS 7 пакет + inotify-tools +
доступен в репозитории EPEL. Установите репозиторий EPEL и пакет + inotify-tools +
, используя следующие команды:
sudo yum install epel-release
sudo yum install inotify-tools
Затем создайте скрипт + webp-watchers.sh +
в домашнем каталоге вашего пользователя, используя + nano +
:
nano ~/webp-watchers.sh
Первая строка в скрипте будет выглядеть так:
~ / Webp-watchers.sh
inotifywait -q -m -r --format '%e %w%f' -e close_write -e moved_from -e moved_to -e delete $1
Эта строка включает в себя следующие элементы:
-
+ inotifywait +
: эта команда отслеживает изменения в определенном каталоге. -
+ -q +
: эта опция скажет+ inotifywait +
, чтобы он был тихим и не выводил много. -
+ -m +
: эта опция скажет+ inotifywait +
работать бесконечно и не выходить после получения одного события. -
+ -r +
: эта опция будет рекурсивно настраивать наблюдателей, наблюдая за указанным каталогом и всеми его подкаталогами. -
+ - format +
: эта опция указывает+ inotifywait +
отслеживать изменения, используя имя события, за которым следует путь к файлу. События, которые мы хотим отслеживать:+ close_write +
(срабатывают, когда файл создается и полностью записывается на диск),+ Move_From +
и+ Move_to +
(срабатывают, когда файл перемещается), и+ delete +
( срабатывает при удалении файла). -
+ $ 1 +
: этот позиционный параметр содержит путь измененных файлов.
Далее, давайте добавим команду + grep +
, чтобы установить, являются ли наши файлы изображениями JPEG или PNG. Опция + -i +
скажет + grep +
игнорировать регистр, + -E +
укажет, что + grep +
должен использовать расширенные регулярные выражения, а + - line-buffered +
скажет + grep +
передать совпавшие строки в цикл + while +
:
~ / Webp-watchers.sh
inotifywait -q -m -r --format '%e %w%f' -e close_write -e moved_from -e moved_to -e delete $1 | grep -i -E '\.(jpe?g|png)$' --line-buffered
Далее мы построим цикл + while
командой` + read`. + readd
обработает обнаруженное событие` + inotifywait`, присвоив его переменной с именем + $ operation +
и пути обработанного файла к переменной с именем + $ path +
:
~ / Webp-watchers.sh
...
| while read operation path; do
# commands
done;
Давайте объединим этот цикл с остальной частью нашего скрипта:
~ / Webp-watchers.sh
inotifywait -q -m -r --format '%e %w%f' -e close_write -e moved_from -e moved_to -e delete $1 \
| grep -i -E '\.(jpe?g|png)$' --line-buffered \
| while read operation path; do
# commands
done;
После того, как цикл + while +
проверил событие, команды внутри цикла выполнят следующие действия, в зависимости от результата:
-
Создайте новый файл WebP, если новый файл изображения был создан или перемещен в целевой каталог.
-
Удалите файл WebP, если связанный файл изображения был удален или перемещен из целевого каталога.
Внутри цикла есть три основных раздела. Переменная с именем + webp_path +
будет содержать путь к версии + + .webp + `предметного изображения:
~ / Webp-watchers.sh
...
webp_path="$(sed 's/\.[^.]*$/.webp/' <<< "$path")";
Далее скрипт проверит, какое событие произошло:
~ / Webp-watchers.sh
...
if [ $operation = "MOVED_FROM" ] || [ $operation = "DELETE" ]; then
# commands to be executed if the file is moved or deleted
elif [ $operation = "CLOSE_WRITE,CLOSE" ] || [ $operation = "MOVED_TO" ]; then
# commands to be executed if a new file is created
fi;
Если файл был перемещен или удален, скрипт проверит, существует ли версия + .webp +
. Если это так, скрипт удалит его с помощью + rm +
:
~ / Webp-watchers.sh
...
if [ -f "$webp_path" ]; then
$(rm -f "$webp_path");
fi;
Для вновь созданных файлов сжатие будет происходить следующим образом:
-
Если соответствующий файл является изображением PNG, сценарий будет использовать сжатие без потерь.
-
Если это не так, сценарий будет использовать сжатие с потерями с опцией
+ -quality +
.
Давайте добавим команды + cwebp +
, которые будут выполнять эту работу в сценарии:
~ / Webp-watchers.sh
...
if [ $(grep -i '\.png$' <<< "$path") ]; then
$(cwebp -quiet -lossless "$path" -o "$webp_path");
else
$(cwebp -quiet -q 90 "$path" -o "$webp_path");
fi;
В целом, файл + webp-watchers.sh +
будет выглядеть так:
~ / Webp-watchers.sh
#!/bin/bash
echo "Setting up watches.";
# watch for any created, moved, or deleted image files
inotifywait -q -m -r --format '%e %w%f' -e close_write -e moved_from -e moved_to -e delete $1 \
| grep -i -E '\.(jpe?g|png)$' --line-buffered \
| while read operation path; do
webp_path="$(sed 's/\.[^.]*$/.webp/' <<< "$path")";
if [ $operation = "MOVED_FROM" ] || [ $operation = "DELETE" ]; then # if the file is moved or deleted
if [ -f "$webp_path" ]; then
$(rm -f "$webp_path");
fi;
elif [ $operation = "CLOSE_WRITE,CLOSE" ] || [ $operation = "MOVED_TO" ]; then # if new file is created
if [ $(grep -i '\.png$' <<< "$path") ]; then
$(cwebp -quiet -lossless "$path" -o "$webp_path");
else
$(cwebp -quiet -q 90 "$path" -o "$webp_path");
fi;
fi;
done;
Сохраните и закройте файл. Не забудьте сделать его исполняемым:
chmod a+x ~/webp-watchers.sh
Давайте запустим этот скрипт в каталоге + / var / www / html / webp +
в фоновом режиме, используя + & +
. Давайте также перенаправим стандартный вывод и стандартную ошибку в + ~ / output.log +
, чтобы сохранить вывод в легко доступном месте:
./webp-watchers.sh /var/www/html/webp > output.log 2>&1 &
На этом этапе вы преобразовали файлы JPEG и PNG в + / var / www / html / webp +
в формат WebP и настроили наблюдателей для выполнения этой работы, используя скрипт + webp-watchers.sh +
. Настало время изучить варианты доставки изображений WebP посетителям вашего сайта.
Шаг 5. Предоставление изображений WebP посетителям с использованием элементов HTML
На этом шаге мы объясним, как обслуживать изображения WebP с элементами HTML. На этом этапе должны быть + .webp +
версии каждого из тестовых изображений JPEG и PNG в каталоге + / var / www / html / webp +
. Теперь мы можем использовать их для поддержки браузеров, использующих либо элементы HTML5 (+ <picture> +
), либо модуль Apache + mod_rewrite +
. На этом шаге мы будем использовать элементы HTML.
Элемент + <picture> +
позволяет вам включать изображения непосредственно в ваши веб-страницы и определять более одного источника изображения. Если ваш браузер поддерживает формат WebP, он загрузит версию файла «+ .webp » вместо оригинальной, в результате чего веб-страницы будут обслуживаться быстрее. Стоит отметить, что элемент ` <picture> +` хорошо поддерживается в современных браузерах, которые поддерживают формат WebP.
Элемент + <picture> +
является контейнером с элементами + <source> +
и + <img> +
, которые указывают на определенные файлы. Если мы используем + <source> +
для указания на изображение + .webp +
, браузер увидит, сможет ли он его обработать; в противном случае он вернется к файлу изображения, указанному в атрибуте + src +
в элементе + <img> +
.
Давайте используем файл + logo.png +
из нашего каталога + / var / www / html / webp +
, который мы преобразовали в + logo.webp +
, как пример с + <source> +
. Мы можем использовать следующий HTML-код для отображения + logo.webp +
в любом браузере, который поддерживает формат WebP, и + logo.png +
в любом браузере, который не поддерживает WebP или элемент + <picture> +
.
Создайте файл HTML, расположенный по адресу + / var / www / html / webp / picture.html
:
nano /var/www/html/webp/picture.html
Добавьте следующий код на веб-страницу, чтобы отобразить + logo.webp +
для поддерживаемых браузеров с помощью элемента + <picture> +
:
/var/www/html/webp/picture.html
<picture>
<source srcset="logo.webp" type="image/webp">
<img src="logo.png" alt="Site Logo">
</picture>
Сохраните и закройте файл.
Чтобы проверить, что все работает, перейдите к + http: /// webp / picture.html
. Вы должны увидеть тестовое изображение PNG.
Теперь, когда вы знаете, как обслуживать изображения + .webp +
непосредственно из кода HTML, давайте рассмотрим, как автоматизировать этот процесс с помощью модуля Apache + mod_rewrite +
.
Шаг 6 - Обслуживание изображений WebP с помощью mod_rewrite
Если мы хотим оптимизировать скорость нашего сайта, но у нас есть большое количество страниц или слишком мало времени для редактирования HTML-кода, то модуль Apache + mod_rewrite +
может помочь нам автоматизировать процесс предоставления изображений + .webp +
для поддержки. браузеры.
Сначала создайте файл + .htaccess +
в каталоге + / var / www / html / webp +
, используя следующую команду:
nano /var/www/html/webp/.htaccess
Директива + ifModule +
проверит, доступен ли + mod_rewrite +
; если это так, его можно активировать с помощью + RewriteEngine On +
. Добавьте эти директивы в + .htaccess +
:
/var/www/html/webp/.htaccess
<ifModule mod_rewrite.c>
RewriteEngine On
# further directives
</IfModule>
Веб-сервер выполнит несколько тестов, чтобы определить, когда предоставлять изображения + .webp +
пользователю. Когда браузер делает запрос, он включает заголовок, чтобы указать серверу, что браузер способен обработать. В случае WebP браузер отправит заголовок + Accept +
, содержащий + image / webp +
. Мы проверим, отправил ли браузер этот заголовок, используя + RewriteCond +
, который определяет критерии, которые должны соответствовать для выполнения + RewriteRule +
:
/var/www/html/webp/.htaccess
...
RewriteCond %{HTTP_ACCEPT} image/webp
Все должно быть отфильтровано, кроме JPEG и PNG изображений. Снова используя + RewriteCond +
, добавьте регулярное выражение (аналогичное тому, которое мы использовали в предыдущих разделах) для соответствия запрошенному URI:
/var/www/html/webp/.htaccess
...
RewriteCond %{REQUEST_URI} (?i)(.*)(\.jpe?g|\.png)$
Модификатор + (? I) +
сделает совпадение без учета регистра.
Чтобы проверить, существует ли версия файла «+ .webp », снова используйте « RewriteCond +» следующим образом:
/var/www/html/webp/.htaccess
...
RewriteCond %{DOCUMENT_ROOT}%1.webp -f
Наконец, если все предыдущие условия были выполнены, + RewriteRule +
перенаправит запрошенный файл JPEG или PNG в связанный с ним файл WebP. Обратите внимание, что это будет redirect с использованием флага + -R +
, а не rewrite URI. Разница между перезаписью и перенаправлением заключается в том, что сервер будет обслуживать переписанный URI, не сообщая об этом браузеру. Например, URI покажет, что расширение файла равно + .png +
, но на самом деле это будет файл + .webp +
. Добавьте + RewriteRule +
в файл:
/var/www/html/webp/.htaccess
...
RewriteRule (?i)(.*)(\.jpe?g|\.png)$ %1\.webp [L,T=image/webp,R]
На этом этапе раздел + mod_rewrite +
в файле + .htaccess +
завершен. Но что произойдет, если между вашим сервером и клиентом будет промежуточный сервер кэширования? Это может служить неверной версией для конечного пользователя. Вот почему стоит проверить, включен ли + mod_headers +
, чтобы отправить заголовок + Vary: Accept +
. Заголовок + Vary +
указывает кеширующим серверам (например, прокси-серверам), что тип содержимого документа варьируется в зависимости от возможностей браузера, который запрашивает документ. Более того, ответ будет сгенерирован на основе заголовка + Accept +
в запросе. Запрос с другим заголовком + Accept +
может получить другой ответ. Этот заголовок важен, потому что он предотвращает доставку кэшированных изображений WebP в не поддерживающие браузеры:
/var/www/html/webp/.htaccess
...
<IfModule mod_headers.c>
Header append Vary Accept env=REDIRECT_accept
</IfModule>
Наконец, в конце файла + .htaccess +
установите тип MIME для изображений + .webp +
на + image / webp +
с помощью директивы + AddType +
. Это будет обслуживать изображения, используя правильный тип MIME:
/var/www/html/webp/.htaccess
...
AddType image/webp .webp
Это окончательная версия вашего файла + .htaccess
:
/var/www/html/webp/.htaccess
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{REQUEST_URI} (?i)(.*)(\.jpe?g|\.png)$
RewriteCond %{DOCUMENT_ROOT}%1.webp -f
RewriteRule (?i)(.*)(\.jpe?g|\.png)$ %1\.webp [L,T=image/webp,R]
</IfModule>
<IfModule mod_headers.c>
Header append Vary Accept env=REDIRECT_accept
</IfModule>
AddType image/webp .webp
Давайте применим то, что мы сделали на этом этапе. Если вы следовали инструкциям на предыдущих шагах, вы должны иметь изображения + logo.png
и` + logo.webp` в + / var / www / html / webp +
. Давайте используем простой тег + <img> +
для включения + logo.png +
в нашу веб-страницу. Создайте новый HTML-файл для проверки настроек:
nano /var/www/html/webp/img.html
Введите следующий HTML-код в файл:
/var/www/html/webp/img.html
<img src="logo.png" alt="Site Logo">
Сохраните и закройте файл.
Когда вы посещаете веб-страницу с помощью Chrome, посещая + http: /// webp / img.html +
, вы заметите, что обслуживаемое изображение является версией + .webp +
(попробуйте открыть изображение в новой вкладке). Если вы используете Firefox, вы получите изображение + .png +
автоматически.
Заключение
В этом уроке мы рассмотрели основные приемы работы с изображениями WebP. Мы объяснили, как использовать + cwebp +
для преобразования файлов, а также два варианта предоставления этих изображений пользователям: HTML5-элемент + <picture> +
и Apache + mod_rewrite +
.
Чтобы настроить сценарии из этого руководства, вы можете взглянуть на некоторые из этих ресурсов:
-
Чтобы узнать больше о функциях формата WebP и о том, как использовать инструменты конвертации, см. Https://developers.google.com/speed/webp/[WebP документацию].
-
Чтобы узнать больше об использовании элемента
+ <picture> +
, см. Его documentation на MDN. -
Чтобы полностью понять, как использовать
+ mod_rewrite +
, см. Его documentation.
Использование формата WebP для ваших изображений значительно уменьшит размеры файлов. Это может снизить использование полосы пропускания и ускорить загрузку страниц, особенно если на вашем веб-сайте используется много изображений.