В первую очередь ставим программы:
|
1 2 3 |
yum install libwebp-tools yum install epel-release yum install inotify-tools |
Пишем в htacess – https://github.com/vincentorback/WebP-images-with-htaccess
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<IfModule mod_rewrite.c> RewriteEngine On # Check if browser supports WebP images RewriteCond %{HTTP_ACCEPT} image/webp # Check if WebP replacement image exists RewriteCond %{DOCUMENT_ROOT}/$1.webp -f # Serve WebP image instead RewriteRule (.+)\.(jpe?g|png|gif)$ $1.webp [T=image/webp,E=REQUEST_image] </IfModule> <IfModule mod_headers.c> # Vary: Accept for all the requests to jpeg, png and gif Header append Vary Accept env=REQUEST_image </IfModule> <IfModule mod_mime.c> AddType image/webp .webp </IfModule> |
Пишем в конфиге nginx (файлы следующего вида bx_ext_ssl_my_site_com.conf) содержащие в себе подстроку ssl, для каждого подключаемого к webp сайта, сразу же после строки:
|
1 |
server_name_in_redirect off; |
Следующее
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|woff2|webp)$ { if ( $http_accept ~* webp ) { set $webp "A"; } if ( $request_filename ~ (.+)\.(png|jpe?g)$ ) { set $file_without_ext $1; } if ( -f $file_without_ext.webp ) { set $webp "${webp}E"; } if ( $webp = AE ) { add_header Vary Accept; rewrite ^(.+)\.(png|jpe?g)$ $1.webp break; } expires 365d; } |
Перезагружаем nginx
|
1 |
nginx -s reload |
Создаем 3 отдельных bash скрипта в каталоге /root/
1. Для конвертации вручную из консоли – webp-convert.sh
2. Для отслеживания в фоновом режиме – webp-watchers.sh
3. Для массовой конвертации если у вас несколько сайтов на одной машине – run-webp-tasks.sh
4. Выставляем им права
|
1 2 |
chmod a+x ~/webp-convert.sh chmod a+x ~/webp-watchers.sh |
Содержимое файла webp-convert.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/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 99 "$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-watchers.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/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 99 "$path" -o "$webp_path"); fi; fi; done; |
Содержимое файла run-webp-tasks.sh
В коде этого скрипта необходимо указать пути к каталогам в которых расположены файлы ваших сайтов индивидуально для каждого в секции (BASE_DIRS)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#!/bin/bash # Файл лога LOG_FILE="/var/log/webp-batch.log" # Дата и время запуска echo "[$(date '+%Y-%m-%d %H:%M:%S')] Начало выполнения задач" >> "$LOG_FILE" # Функция для выполнения команд с логированием run_task() { local cmd="$1" echo "[$(date '+%Y-%m-%d %H:%M:%S')] Выполняется: $cmd" >> "$LOG_FILE" eval "$cmd" >> "$LOG_FILE" 2>&1 local exit_code=$? if [ $exit_code -eq 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] Успешно: $cmd" >> "$LOG_FILE" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] Ошибка ($exit_code): $cmd" >> "$LOG_FILE" fi } # --- Здесь указываем пути к вашим каталогам с файлами сайтов --- BASE_DIRS=( "/home/bitrix/ext_www/my-site-1.ru" "/home/bitrix/ext_www/my-site-2.ru" "/home/bitrix/ext_www/my-site-3.ru" ) # --- Конвертация и очистка .webp --- for dir in "${BASE_DIRS[@]}"; do # Проверяем, какие подкаталоги существуют for sub in upload local img; do path="$dir/$sub" if [ -d "$path" ]; then run_task "/root/webp-convert.sh \"$path\"" run_task "find \"$path\" -name \"*.webp\" -exec rm -f {} \\;" fi done done # --- Запуск наблюдателей (watcher) --- for dir in "${BASE_DIRS[@]}"; do for sub in upload local img; do path="$dir/$sub" if [ -d "$path" ]; then run_task "nohup /root/webp-watchers.sh \"$path\" > /dev/null 2>&1 &" fi done done # --- Конец --- echo "[$(date '+%Y-%m-%d %H:%M:%S')] Все задачи выполнены" >> "$LOG_FILE" |
После этого запускаем скрипт массовой конвертации в консоли сервера и не выходим до его завершения
|
1 |
/root/run-webp-tasks.sh |
Если после выполнения скрипта в каталогах сайтов webp не появились, однако при этом автоматически конвертируются при загрузке, пробуем 2-ую версию
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#!/bin/bash # Файл лога LOG_FILE="/var/log/webp-batch.log" # Дата и время начала выполнения echo "[$(date '+%Y-%m-%d %H:%M:%S')] Начало выполнения задач" >> "$LOG_FILE" # --- Общие пути --- BASE_DIRS=( "/home/bitrix/ext_www/my-site-1.ru" "/home/bitrix/ext_www/my-site-2.ru" "/home/bitrix/ext_www/my-site-3.ru" ) # --- Функция для логирования и выполнения команд --- run_task() { local task_name="$1" shift local cmd=("$@") echo "[$(date '+%Y-%m-%d %H:%M:%S')] Выполняется: $task_name" >> "$LOG_FILE" "${cmd[@]}" >> "$LOG_FILE" 2>&1 local exit_code=$? if [ $exit_code -eq 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] Успешно: $task_name" >> "$LOG_FILE" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] Ошибка ($exit_code): $task_name" >> "$LOG_FILE" fi } # --- Конвертация и очистка .webp --- for dir in "${BASE_DIRS[@]}"; do for sub in upload local img; do path="$dir/$sub" if [ -d "$path" ]; then run_task "/root/webp-convert.sh \"$path\"" /root/webp-convert.sh "$path" run_task "find \"$path\" -name \"*.webp\" -exec rm -f {} \\;" find "$path" -name "*.webp" -exec rm -f {} \; fi done done # --- Запуск наблюдателей (watcher) --- for dir in "${BASE_DIRS[@]}"; do for sub in upload local img; do path="$dir/$sub" if [ -d "$path" ]; then # Проверяем, не запущен ли уже watcher PID=$(pgrep -f "/root/webp-watchers.sh.*$path") if [ -z "$PID" ]; then run_task "nohup /root/webp-watchers.sh \"$path\" > /dev/null 2>&1 &" nohup /root/webp-watchers.sh "$path" > /dev/null 2>&1 & else echo "[$(date '+%Y-%m-%d %H:%M:%S')] Watcher уже запущен для: $path" >> "$LOG_FILE" fi fi done done # --- Конец --- echo "[$(date '+%Y-%m-%d %H:%M:%S')] Все задачи выполнены" >> "$LOG_FILE" |
Если и это не помогло, конвертируем вручную, ниже написаны команды как именно это сделать
Запустить скрипт конвертации на севере
|
1 2 |
/root/webp-convert.sh /home/bitrix/ext_www/my-site.ru/upload /root/webp-convert.sh /home/bitrix/ext_www/my-site.ru/local |
Удалить все WEBP
|
1 2 |
find /home/bitrix/ext_www/my-site.ru/upload/ -name "*.webp" -exec rm -f {} \; find /home/bitrix/ext_www/my-site.ru/local/ -name "*.webp" -exec rm -f {} \; |
Запустить прослушиватель в фоновом режиме
|
1 |
nohup /root/webp-watchers.sh /home/bitrix/ext_www/your_site.ru/local > /dev/null 2>&1 & |
При вызове этого скрипта мы получаем идентификатор процесса, который можем остановить командой
|
1 |
kill PID |
Проверить какие процессы запущены на баш скрипте и остановить их
|
1 |
ps aux | grep webp-convert.sh |
Подробная инструкиция
