Используйте NGINX в качестве обратного прокси-сервера для хранилища объектов для условного обслуживания WEBP.
Я использую такую конфигурацию местоположения в Nginx для обслуживания WEBP, когда пользователь ее поддерживает.
map $http_accept $webp_suffix {
default "";
"~*webp" ".webp";
}
server {
#...
location ~* \.(?:jpg|jpeg|png|webp)$ {
root /usr/share/nginx/html;
try_files $uri$webp_suffix $uri =404;
}
#...
}
моя проблема в том, что я хочу использовать ту же стратегию, но когда я использую объектное хранилище (совместимое с Minio - S3)
поэтому мне интересно, как лучше всего заменить эту деталь:
try_files $uri$webp_suffix $uri =404;
с чем-то вроде
try_proxy_pass http://minio$uri$webp_suffix http://minio$uri =404;
1 ответ
вот решение для этого, которое я собрал сам.
если вы хотите узнать больше, вот ссылка на репозиторий, который я сделал для тестирования и подтверждения концепции того, что это решение работает:https://github.com/erfantkerfan/cdn-nginx-image-optimization
recursive_error_pages on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_intercept_errors on;
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
location ~* \.(?:jpg|jpeg|png|webp)$ {
root /usr/share/nginx/html;
try_files /dev/null @image_webp;
}
location @image_webp {
proxy_pass http://minio_servers$uri$webp_suffix;
image_filter_jpeg_quality 95;
image_filter_webp_quality 100;
image_filter_interlace on;
image_filter_buffer 100M;
image_filter resize $width $height;
image_filter crop $width $height;
image_filter_transparency on;
error_page 404 415 = @image;
}
location @image {
proxy_pass http://minio_servers$uri;
image_filter_jpeg_quality 95;
image_filter_webp_quality 100;
image_filter_interlace on;
image_filter_buffer 100M;
image_filter resize $width $height;
image_filter crop $width $height;
image_filter_transparency on;
}
}