Используйте 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;
    }
}
Другие вопросы по тегам