Назад | Перейти на главную страницу

Настройка обратного прокси для кеширования изображений

Я написал быстрый Python-сервер для обслуживания пересэмплированных изображений. Например, URL-адрес может выглядеть примерно так http://images.domain.com/resample/100x100/9f362e1994264321.jpg. Поскольку передискретизация изображений стоит дорого, необходим слой кеширования. Похоже, что обратный прокси nginx был бы хорошим вариантом для этого, и Вот и Вот кажется хорошим местом для начала.

Однако есть проблема. Есть миллионы изображений, поэтому, сохраняя http://images.domain.com/resample/100x100/9f362e1994264321.jpg в файловой системе как /home/nginx/cache/resample/100x100/9f362e1994264321.jpg (или что-то в этом роде), в конце концов cache/resample/100x100/ будет содержать миллионы файлов, что сделает поиск файлов очень неэффективным.

Я решаю эту проблему, сохраняя исходные изображения, распределяя их по множеству подкаталогов, например, 9f/36/9f362e1994264321.jpg. Однако я не уверен, как я могу сделать то же самое с nginx. Я мог бы изменить URL-адрес, чтобы сделать то же самое, и я сделаю это, если это единственное решение, но я бы предпочел, чтобы URL-адрес был как можно более красивым.

Могу ли я сделать это с помощью nginx? Если не с nginx, можно еще что-нибудь, например лак?

Вместо этого погуглите несколько нерелевантных ссылок, вам определенно стоит прочитать документацию ngx_http_proxy_module.html.

Директива proxy_cache именно то, что вам нужно. Конфигурация должна выглядеть примерно так.

http {

    # ...

    proxy_cache_path /var/www/cache levels=1:2 keys_zone=imgcache:10m max_size=1000m inactive=720m;
    proxy_temp_path /var/www/cache/tmp;

    # ...

    server {

        # ...

        location /resample {
            proxy_pass          http://bla.bla.my.backend;
            proxy_cache         imgcache;
            #proxy_cache_key    $scheme$proxy_host$request_uri;
            #proxy_cache_valid 200 302 60m;
            #proxy_cache_valid 404 10m
        }

        # ...

    }

}

в /var/www/cache В папке будет создана структура каталогов двух уровней. И кешированный ответ для http://mysite.com/resample/dir/file.jpg будет сохранен как md5 из proxy_cache_key стоимость. Например, если вы раскомментируете #proxy_cache_key $scheme$proxy_host$request_uri; выше, ответ будет кэширован в файл / var / www / cache / f / 08 / 8db24849a311cc3314955992686d308f

Так как MD5 ("http://bla.bla.my.backend/resample/dir/file.jpg") = 8db24849a311cc3314955992686d308f и level = 1: 2 переведен в структуру dir, считая символы с последнего, ... 08f -> f / 08 / md5value

что сделает поиск файлов очень неэффективным.

Это звучит как преждевременная оптимизация.

Вы не предоставили никакой информации о том, на какой ОС он работает. Поскольку вы упомянули Varnish, я предполагаю, что это некоторая разновидность Unix. Предполагая, что это Linux (хотя большая часть этого относится и к другим ОС) ....

Вы действительно измерили это и сравнили с подходом переписывания путей? Если вы наблюдаете ухудшение, вероятно, вы используете очень старую файловую систему (или ту, которая была обновлена ​​путем частичного исправления). С ext4 или BTRFS я не ожидал увидеть ощутимой разницы.

Но это совсем не главное. Обратные прокси-серверы знают, что они могут кэшировать множество файлов - и не обязательно будут сопоставлять пути URL-адресов напрямую с путями файловой системы.

Вы столкнетесь с проблемами с очень большим количеством файлов, управляемых кешем, но они связаны с методологией VFS /. Уменьшение vfs_cache_pressure должно помочь.